Bài 3: IPv6 Muticast

Sử dụng sơ đồ mạng như trong bài số 1, thực hiện tạo kịch bản multicast IPv6 trên một số trạm thuộc các mạng khác nhau. Router XORP được sử dụng để hỗ trợ tính năng multicast routing IPv6. Các bước thực hiện như sau:

  • Bước 1: Cấu hình router XORP với phương pháp cố định Rendezvous Point (RP)
  • Bước 2: Cấu hình XORP với phương pháp RP động dựa trên bootstrap
  • Bước 3: Sử dụng ssmping  để kiểm tra kết nối multicast

Bước 1: Cấu hình XORP cho các router với phương pháp cố định RP

Sử dụng file cấu hình multicast6.boot và sửa lại tên các giao diện kết nối mạng và địa chỉ link-local. Lưu ý tất cả các router cần được cấu hình cố định địa chỉ RP là R3 (fec2::2).

[root@R1 ~]# cat ./multicast6.boot 
/* $XORP$ */

interfaces {
    interface eth3 {
	vif eth3 {
	    address fec0::1 {
		prefix-length: 64
	    }
	    /* Note: The IPv6 link-local address must be configured */
	    address fe80::a00:27ff:fe2e:e103 {
		prefix-length: 64
	    }
	}
    }
    interface eth4 {
	vif eth4 {
	    address fec1::1 {
		prefix-length: 64
	    }
	    /* Note: The IPv6 link-local address must be configured */
	    address fe80::a00:27ff:fe47:e104 {
		prefix-length: 64
	    }
	}
    }
}

fea {
    unicast-forwarding6 {
	disable: false
    }
}

plumbing {
    mfea6 {
	disable: false
	interface eth3 {
	    vif eth3 {
		disable: false
	    }
	}
	interface eth4 {
	    vif eth4 {
		disable: false
	    }
	}
	interface register_vif {
	    vif register_vif {
		/* Note: this vif should be always enabled */
		disable: false
	    }
	}
    }
}

protocols {
    mld {
	interface eth3 {
	    vif eth3 {
		disable: false
	    }
	}
	interface eth4 {
	    vif eth4 {
		disable: false
	    }
	}
    }
}

protocols {
    pimsm6 {
	interface eth3 {
	    vif eth3 {
		disable: false
		dr-priority: 2
	    }
	}
	interface eth4 {
	    vif eth4 {
		dr-priority: 2
		disable: false
	    }
	}
	interface register_vif {
	    vif register_vif {
		/* Note: this vif should be always enabled */
		disable: false
	    }
	}

	/* Note: static-rps and bootstrap should not be mixed */

	static-rps {
	    rp fec2::2 {
		group-prefix ff00::/8 {
		}
	    }
	}

	switch-to-spt-threshold {
	    /* approx. 1K bytes/s (10Kbps) threshold */
	    disable: false
	    interval: 100
	    bytes: 102400
	}
    }
}

protocols {
    fib2mrib {
	disable: false
    }
}

             

Chạy router XORP với file cấu hình multicast trên tất cả các router.

[root@localhost ~]# /usr/local/xorp/sbin/xorp_rtrmgr  -b ./multicast6.boot 
			 

Sau khi chạy thành công router XORP với cấu hình multicast IPv6, router này sẽ join vào địa chỉ multicast chuẩn ff02::16 (địa chỉ các router hỗ trợ chuẩn IPv6 multicast - MLD) và ff02::d (địa chỉ các router hỗ trợ Protocol Independent Multicast - PIM). Có thể kiểm chứng bằng lệnh ping6 từ một máy khác:

[root@localhost ~]# ping6 -c 3 -I eth3 ff02::16
PING ff02::16(ff02::16) from fe80::a00:27ff:fee3:92c eth3: 56 data bytes
64 bytes from fe80::a00:27ff:fe2e:692: icmp_seq=1 ttl=64 time=0.815 ms
64 bytes from fe80::a00:27ff:fe47:aa3: icmp_seq=1 ttl=64 time=0.846 ms (DUP!)
64 bytes from fe80::a00:27ff:fe2e:692: icmp_seq=2 ttl=64 time=0.438 ms
64 bytes from fe80::a00:27ff:fe47:aa3: icmp_seq=2 ttl=64 time=0.462 ms (DUP!)
64 bytes from fe80::a00:27ff:fe47:aa3: icmp_seq=3 ttl=64 time=0.839 ms

--- ff02::16 ping statistics ---
3 packets transmitted, 3 received, +2 duplicates, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 0.438/0.680/0.846/0.188 ms
             

Lệnh netstat -g hiển thị các địa chỉ multicast mà máy hiện tại đang join vào. Chạy lệnh này trên máy router sẽ thấy tất cả các giao diện mạng đều đã join vào ff02::16 và ff02::d:

[root@localhost ~]# netstat -g
IPv6/IPv4 Group Memberships
Interface       RefCnt Group
--------------- ------ ---------------------
lo              1      all-systems.mcast.net
eth3            1      all-systems.mcast.net
eth4            1      all-systems.mcast.net
pim6reg         1      all-systems.mcast.net
lo              1      ff02::1
eth3            1      ff02::d
eth3            1      ff02::16
eth3            2      ff02::1:ff00:0
eth3            2      ff02::2
eth3            1      ff02::1:ff00:1
eth3            1      ff02::1:ff2e:692
eth3            2      ff02::1
eth4            1      ff02::d
eth4            1      ff02::16
eth4            1      ff02::1:ff47:aa3
eth4            2      ff02::1:ff00:0
eth4            2      ff02::2
eth4            1      ff02::1:ff00:1
eth4            1      ff02::1:ff47:aaa3
eth4            2      ff02::1
pim6reg         1      ff02::1
			 

Kiểm tra thông tin RP đã được cấu hình đúng cho tất cả các router:

[root@R1 ~]# /usr//local/xorp/sbin/xorpsh
Welcome to XORP v1.8.6-WIP on R1
Version tag: b4dde55  Build Date: 2016-07-13 02:09 64-bit

root@R1> show pim6 rps 
RP              Type      Pri Holdtime Timeout ActiveGroups GroupPrefix       
fec2::2         static    192       -1      -1            0 ff00::/8
             

Kiểm tra các DR trên từng router:

root@R1> show pim6 interface 
Interface    State    Mode   V PIMstate Priority DRaddr          Neighbors
eth3         UP       Sparse 2 DR              2 fe80::a00:27ff:fe2e:e103         0
eth4         UP       Sparse 2 DR              2 fe80::a00:27ff:fe47:e104         1
register_vif UP       Sparse 2 DR              1 fe80::a00:27ff:fe2e:e103         0
			   

Bước 2: Cấu hình XORP với phương pháp RP động dựa trên bootstrap

Trong phương phát trên, RP được cấu hình tĩnh trên tất cả các router multicast của mạng. Cài đặt PIM trong XORP cho phép các router tự động lựa chọn RP theo một số tiêu chí ưu tiên. Quá trình lựa chọn RP được thực hiện thông qua một thủ tục gọi là bootstrap. File cấu hình của các router được sửa đổi để kích hoạt bootstrap:

protocols {
    pimsm6 {
	interface eth3 {
	    vif eth3 {
		disable: false
		dr-priority: 2
	    }
	}
	interface eth4 {
	    vif eth4 {
		dr-priority: 2
		disable: false
	    }
	}
	interface register_vif {
	    vif register_vif {
		/* Note: this vif should be always enabled */
		disable: false
	    }
	}

	/* Note: static-rps and bootstrap should not be mixed */
/*
	static-rps {
	    rp fec2::2 {
		group-prefix ff00::/8 {
		}
	    }
	}

*/
	bootstrap {
	    disable: false
	    cand-bsr {
		scope-zone ff00::/8 {
		    cand-bsr-by-vif-name: "eth3"
		    bsr-priority: 128
                    hash-mask-len: 30

		}
	    }
	    cand-rp {
		group-prefix ff00::/8 {
		    cand-rp-by-vif-name: "eth3"
		    rp-priority: 193
                    rp-holdtime: 150

		}
	    }
	}
    }
}             

Trong file cấu hình này, mục static-rps được khóa lại. Thay vào đó, mỗi router có thể tự tham gia vào thủ tục bootstrap với tư cách là một ứng cử bootstrap hoặc một ứng cử RP hoặc cả hai. Các router ứng cử bootstrap trao đổi thông tin và dựa theo các tham số ưu tiên của mình để xác định bootstrap được lựa chọn làm người thực hiện lựa chọn RP. Sau khi khởi động các router XORP với file cấu hình sử dụng bootstrap, có thể kiểm tra kết quả quá trình lựa chọn bootstrap router từ các ứng viên (candidate) và lựa chọn RP từ các ứng viên.

[root@R2 ~]# /usr/local/xorp/sbin/xorpsh 
Welcome to XORP v1.8.6-WIP on R2
Version tag: b4dde55  Build Date: 2016-07-13 02:09 64-bit

root@R2> show pim6 rps 
RP              Type      Pri Holdtime Timeout ActiveGroups GroupPrefix       
fec3::2         bootstrap 170      150     142            0 ff00::/8          
fec2::2         bootstrap 195      150     142            0 ff00::/8          
fec1::2         bootstrap 190      150     142            0 ff00::/8          
fec0::1         bootstrap 193      150     142            0 ff00::/8
          
root@R2> show pim6 bootstrap 
Active zones:
BSR             Pri LocalAddress    Pri State           Timeout SZTimeout
fec3::2         130 fec1::2         128 Candidate           110        -1
Expiring zones:
BSR             Pri LocalAddress    Pri State           Timeout SZTimeout
Configured zones:
BSR             Pri LocalAddress    Pri State           Timeout SZTimeout
fec1::2         128 fec1::2         128 Init                 -1        -1
             

Bước 3: Sử dụng ssmping để kiểm tra kết nối multicast

Đây là bộ công cụ để hỗ trợ test multicast. Phương pháp hoạt động của nó tương tự như ping. Một trạm chạy tiến trình ssmpingd có chức năng như server chờ kết nối từ client đến và phát trả lời theo 2 hướng: nunicast trực tiếp về máy client và multicast đến địa chỉ ff3e::4321:1234. Tại các máy client cần chạy chương trình ssmping để kết nối đến server đồng thời join vào địa chỉ multicast ff3e::4321:1234. Nếu thiết lập multicast giữa client và server thành công, client sẽ nhận được 2 thông điệp gửi từ server, một theo kiểu unicast (giống hệt lệnh ping) và một thông qua địa chỉ multicast ff3e::4321:1234.
Trên các máy trạm, thực hiện các lệnh cài đặt gói ssmping:

[root@localhost ~]# yum install wget
. . .
[root@localhost ~]# wget http://ftp.pbone.net/mirror/ftp.pramberger.at/systems/linux/contrib/rhel6/x86_64/ssmping-0.9.1-1.el6.pp.x86_64.rpm
. . .
[root@localhost ~]# rpm -Uvh ./ssmping-0.9.1-1.el6.pp.x86_64.rpm
			   

Tại máy client C2, thực hiện chạy tiến trình ssmpingd để chờ các trạm liên lạc đến.

[root@C2 ~]# ssmpingd 
             

Tiến trình này sẽ chưa làm gì cho đến khi nó nhận được kết nối từ một client chạy ssmping. Có thể kiểm tra trên wireshark không xuất hiện các thông điệp PIM xuất phát từ ssmpingd.
Tại client C4, chạy ssmping để kết nối đến client C2. Kết quả cho thấy đã nhận được các gói tin ping gửi từ C2 về bằng 2 đường unicast và multicast:

[root@C4 ~]# ssmping -c 3 fec2::7
ssmping joined (S,G) = (fec2::7,ff3e::4321:1234)
pinging S from 2000::7
  unicast from fec2::7, seq=1 dist=3 time=3.607 ms
multicast from fec2::7, seq=2 dist=2 time=1.034 ms
  unicast from fec2::7, seq=2 dist=3 time=1.259 ms
  unicast from fec2::7, seq=3 dist=3 time=2.692 ms
multicast from fec2::7, seq=3 dist=2 time=2.655 ms

--- fec2::7 statistics ---
3 packets transmitted, time 3001 ms
unicast:
   3 packets received, 0% packet loss
   rtt min/avg/max/std-dev = 1.259/2.519/3.607/0.967 ms
multicast:
   2 packets received, 0% packet loss since first mc packet (seq 2) recvd
   rtt min/avg/max/std-dev = 1.034/1.844/2.655/0.811 ms
             

Trên máy C2, tiến trình ssmpingd cũng hiển thị các thông tin do kết nối cừ C4 tạo ra:

[root@C2 ~]# ssmpingd
received request from 2000::7
received request from 2000::7
received request from 2000::7
			   

Kiểm tra thêm một kết nối multicast từ C0 đến C2. Kết quả cũng cho thấy đã nhận được các gói tin ping gửi từ C2 về bằng 2 đường unicast và multicast:

[root@C0 ~]# ssmping -c 3 fec2::7
ssmping joined (S,G) = (fec2::7,ff3e::4321:1234)
pinging S from fec0::7
  unicast from fec2::7, seq=1 dist=2 time=2.979 ms
  unicast from fec2::7, seq=2 dist=2 time=2.217 ms
multicast from fec2::7, seq=2 dist=2 time=5.409 ms
  unicast from fec2::7, seq=3 dist=2 time=1.396 ms
multicast from fec2::7, seq=3 dist=2 time=1.670 ms

--- fec2::7 statistics ---
3 packets transmitted, time 3001 ms
unicast:
   3 packets received, 0% packet loss
   rtt min/avg/max/std-dev = 1.396/2.197/2.979/0.647 ms
multicast:
   2 packets received, 0% packet loss since first mc packet (seq 2) recvd
   rtt min/avg/max/std-dev = 1.670/3.539/5.409/1.870 ms