root@docker-test-1:~# ip netns add ns1 root@docker-test-1:~# ip netns add ns2 root@docker-test-1:~# ip netns list ns2 ns1
创建一个 veth pair:
1 2 3 4 5 6 7 8
root@docker-test-1:~# ip link add veth-ns1 type veth peer name veth-ns2 root@docker-test-1:~# ip link show ... 4: veth-ns2@veth-ns1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether ba:d1:a3:cc:9e:e5 brd ff:ff:ff:ff:ff:ff 5: veth-ns1@veth-ns2: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether 3e:d7:85:d6:1a:f5 brd ff:ff:ff:ff:ff:ff ...
root@docker-test-1:~# ip netns exec ns1 ping -c 3 192.168.1.2 PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data. 64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.057 ms 64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.042 ms 64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.058 ms
--- 192.168.1.2 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2048ms rtt min/avg/max/mdev = 0.042/0.052/0.058/0.007 ms
root@test-1:~# for i in 1 2 3; do ip netns add ns$i done
root@test-1:~# ip netns list ns1 ns2 ns3
创建 bridge:
1 2 3 4 5 6 7 8
root@test-1:~# apt -y install bridge-utils root@test-1:~# brctl addbr virtual-bridge root@test-1:~# ip linkset virtual-bridge up root@test-1:~# brctl show bridge name bridge id STP enabled interfaces virtual-bridge 8000.12a3b9386462 no veth-ns1-br veth-ns2-br veth-ns3-br
root@test-1:~# for i in 1 2 3; do ip link add veth-ns$itype veth peer name veth-ns${i}-br ip linkset veth-ns$i netns ns$i ip -n ns$i addr add 192.168.1.$i/24 dev veth-ns$i ip -n ns$ilinkset veth-ns$i up ip -n ns$ilinkset lo up ip linkset veth-ns${i}-br up brctl addif virtual-bridge veth-ns${i}-br done
测试连通性:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
root@test-1:~# ip netns exec ns1 ping -c 3 192.168.1.2 PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data. 64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.073 ms 64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.110 ms 64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.055 ms
--- 192.168.1.2 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2035ms rtt min/avg/max/mdev = 0.055/0.079/0.110/0.022 ms
root@test-1:~# ip netns exec ns1 ping -c 3 192.168.1.3 PING 192.168.1.3 (192.168.1.3) 56(84) bytes of data. 64 bytes from 192.168.1.3: icmp_seq=1 ttl=64 time=0.071 ms 64 bytes from 192.168.1.3: icmp_seq=2 ttl=64 time=0.051 ms 64 bytes from 192.168.1.3: icmp_seq=3 ttl=64 time=0.049 ms
--- 192.168.1.3 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2035ms rtt min/avg/max/mdev = 0.049/0.057/0.071/0.009 ms
root@test-1:~# ip addr add local 192.168.1.254/24 dev virtual-bridge root@test-1:~# for i in 1 2 3;do ip netns exec ns$i ip route add default via 192.168.1.254 done
访问 Root Namespace,即访问宿主机网络栈的网络:
1 2 3 4 5 6 7 8 9 10
# 访问宿主机网卡 IP root@test-1:~# ip netns exec ns1 ping -c 3 172.16.16.141 PING 172.16.16.141 (172.16.16.141) 56(84) bytes of data. 64 bytes from 172.16.16.141: icmp_seq=1 ttl=64 time=0.049 ms 64 bytes from 172.16.16.141: icmp_seq=2 ttl=64 time=0.049 ms 64 bytes from 172.16.16.141: icmp_seq=3 ttl=64 time=0.052 ms
--- 172.16.16.141 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2029ms rtt min/avg/max/mdev = 0.049/0.050/0.052/0.001 ms
root@test-1:~# ip netns exec ns1 ping -c 3 223.5.5.5 PING 223.5.5.5 (223.5.5.5) 56(84) bytes of data. 64 bytes from 223.5.5.5: icmp_seq=1 ttl=115 time=4.28 ms 64 bytes from 223.5.5.5: icmp_seq=2 ttl=115 time=4.25 ms 64 bytes from 223.5.5.5: icmp_seq=3 ttl=115 time=4.36 ms
--- 223.5.5.5 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 4.246/4.292/4.356/0.046 ms