[root@ganbing ~]# ip netns exec net-test ip link set dev lo up
在主机上创建两张虚拟网卡veth-1 和 veth-2:
[root@ganbing ~]# ip link add veth-1 type veth peer name veth-2
将veth-2设备添加到net-test这个network namespace中,veth-1留在宿主机中:
[root@ganbing ~]# ip link set veth-2 netns net-test
现在net-test这个network namespace就有两块网卡了(lo和veth-2),验证看一下:
[root@ganbing ~]# ip netns exec net-test ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
222: veth-2@if223: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether 92:24:fd:44:c6:00 brd ff:ff:ff:ff:ff:ff link-netnsid 0
接下来可以为网卡分配IP并启动网卡:
#在主机上为veth-1配置IP并启动
[root@ganbing ~]# ip addr add 10.0.0.1/24 dev veth-1
[root@ganbing ~]# ip link set dev veth-1 up
#为net-test中的veth-2配置IP并启动
[root@ganbing ~]# ip netns exec net-test ip addr add 10.0.0.2/24 dev veth-2
[root@ganbing ~]# ip netns exec net-test ip link set dev veth-2 up
给两张网卡配置了IP后,会在各自的network namespace中生成一条路由,用ip route 或者 route -n查看:
#在主机中查看路由
[root@ganbing ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
...
10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 veth-1
...
#在net-test中查看路由
[root@ganbing ~]# ip netns exec net-test route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 veth-2
上面这两条路由表明的意义是目的地址 10.0.0.0/24网络的IP包分别从veth-1和veth-2发出。
现在net-test这个network namespace有了自己的网卡、IP地址、路由表等信息,就相当于成了一台小型的“虚拟机”了。测试一下它的连通性,来检查配置是否正确。
从主机的veth-1网卡ping net-test的veth-2网卡:
从net-test的veth-2网卡ping主机的veth-1网卡:
[root@ganbing ~]# ip netns add ns1
[root@ganbing ~]# ip netns add ns2
[root@ganbing ~]# ip netns ls
ns2
ns1
2、创建veth pair设备veth-a,veth-b:
[root@ganbing ~]# ip link add veth-a type veth peer name veth-b
3、将网卡分别放到两个network namespace中:
[root@ganbing ~]# ip link set veth-a netns ns1
[root@ganbing ~]# ip link set veth-b netns ns2
4、启动这两个网张:
[root@ganbing ~]# ip netns exec ns1 ip link set dev lo up
[root@ganbing ~]# ip netns exec ns1 ip link set dev veth-a up
[root@ganbing ~]# ip netns exec ns2 ip link set dev lo up
[root@ganbing ~]# ip netns exec ns2 ip link set dev veth-b up
5、分配IP:
[root@ganbing ~]# ip netns exec ns1 ip addr add 10.0.0.1/24 dev veth-a
[root@ganbing ~]# ip netns exec ns2 ip addr add 10.0.0.2/24 dev veth-b
6、验证连通
通过veth pair设备连接起来的两个network namespace就好像直接通过网线连接起来的两台机器,它的拓扑图如下所示:
大家想一下,如果有更多的network namespace需要连接怎么办?是不是就需要引入虚拟网桥了,就如同Docker网络一样。
[root@docker ~]# brctl addbr br0
[root@docker ~]# ip link set dev br0
3、将主机ens160网卡桥接到br0上,并把ens160的IP配置在br0上。由于笔者是远程操作服务器,所以执行这一步的时候会导致网络断开,因此这里放在一条命令执行
[root@docker ~]# ip addr add 172.18.18.34/24 dev br0; \
> ip addr del 172.18.18.34/24 dev ens160; \
> brctl addif br0 ens160; \
> ip route del default; \
> ip route add default via 172.18.18.1 dev br0
4、找到test01的PID
#将veth-a连接到br0网桥中
[root@docker ~]# ip link add veth-a type veth peer name veth-b
[root@docker ~]# brctl addif br0 veth-a
[root@docker ~]# ip link set dev veth-a up
#将veth-b放在test的network namespace中,重命令eth0,并为其配置IP和默认路由
[root@docker ~]# ip netns exec test01 ip link set dev lo up
[root@docker ~]# ip link set veth-b netns test01
[root@docker ~]# ip netns exec test01 ip link set dev veth-b name eth0
[root@docker ~]# ip netns exec test01 ip link set eth0 up
[root@docker ~]# ip netns exec test01 ip addr add 172.18.18.36/24 dev eth0
[root@docker ~]# ip netns exec test01 ip route add default via 172.18.18.1
7、查看一下test01的网卡情况,并测试
[root@docker ~]# ip netns exec test01 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
9: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
link/ether 66:fa:71:ba:0e:fb brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.18.18.36/24 scope global eth0
valid_lft forever preferred_lft forever
[root@docker ~]# ip netns exec test01 route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.18.18.1 0.0.0.0 UG 0 0 0 eth0
172.18.18.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
完成配置扣,Docker容器和宿主机连接的网络图如下所示:
现在test01容器可以与本地主机相互访问,并且test01容器可以通过本地网络的网关172.18.18.1访问外部网络。