网络命名空间(Network Namespace)

主机中已经安装并启动docker

创建网络命名空间ns1

ip netns add ns1

将ns1命名空间的本地回环启用(默认是down)

开启之前可以尝试ping回环地址,返回的结果是Network is unreachable网络不可达,就是因为刚创建的ns1命名空间的lo网卡是禁用的,启用即可

ip netns exec ns1 ip link set dev lo up

因为命名空间中只有lo本地回环一块网卡,如果要与本机通信,就必须添加网卡

添加一对类型为veth(虚拟网络)的网卡

如果要给命名空间设置与主机不同网段的ip,就需要本地和命名空间有联系的网卡连通信,所以要创建一对网卡

创建名为veth0的网卡,与veth1绑定

ip link add veth0 type veth peer name veth1

创建完成后,会在本地多出两块网卡

ip a # 查看所有网卡信息
6: veth1@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 92:b3:e6:f6:ee:26 brd ff:ff:ff:ff:ff:ff
7: veth0@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 26:f4:77:a0:29:58 brd ff:ff:ff:ff:ff:ff

其中一块需要给ns1设置ip地址使用

将veth1网卡绑定到ns1命名空间中

ip link set veth1 netns ns1

然后再次使用ip a查看网卡时,发现已经没有了veth1网卡,而查看ns1命名空间时,多了一块veth1网卡

ip netns exec ns1 ip a  # 查看ns1命名空间的网卡信息
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
6: veth1@if7: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 92:b3:e6:f6:ee:26 brd ff:ff:ff:ff:ff:ff link-netnsid 0

但是发现不管这两块网卡在哪里,都没有ip,需要手动去设置ip

# 设置ns1命名空间的veth1网卡地址为10.1.1.1并启动
ip netns exec ns1 ifconfig veth1 10.1.1.1/24 up
# 设置本机的网卡veth0的ip为10.1.1.2并启动
ifconfig veth0 10.1.1.2/24 up

因为我们要做两个不同网段的网络命名空间的互通,所以需要为命名空间设置网关,网关就是本机设置的相连网卡veth0的ip

ip netns exec ns1 route add default gw 10.1.1.2

创建网络命名空间ns2

与创建ns1命名空间步骤几乎一致,只是网卡名和ip地址不同

ip netns add ns2 # 创建命名空间ns2
ip netns exec ns2 ip link set dev lo up  # 启用ns2命名空间的lo网卡
ip link add veth2 type veth peer name veth3  # 同样创建两块链接网卡也是同样的作用
ip link set veth3 netns ns2 # 设置veth3网卡给ns2命名空间
ip netns exec ns2 ifconfig veth3 20.1.1.1/24 up # 设置ns2命名空间veth3网卡的ip
ifconfig veth2 20.1.1.2/24 up # 设置本地与veth3网卡链接的veth2网卡的ip
ip netns exec ns2 route add default gw 20.1.1.2 # 添加网关

开启路由转发

修改内核参数,开启路由转发

vim /etc/sysctl.conf
# 末尾添加
net.ipv4.ip_forward = 1

使其立即生效

sysctl -p

验证

使用ns1命名空间ping,ns2命名空间的地址

ip netns exec ns1 ping 20.1.1.1

使用ns2命名空间ping,ns1命名空间的地址

ip netns exec ns2 ping 10.1.1.1