NameSpace是Linux内核提供的功能,如Docker容器也是使用Linux的NameSpace功能进行PID,网络,文件系统等的隔离。在这里介绍,Linux(Rocky Linux8)上创建Net NameSpace及网桥(Bridge)后,通过设定路由表及SNAT上网的方法。
接下来的步骤如下。
- 创建Net NameSpace
- 创建Bridge(网桥)
- 修改Net NameSpace上的路由
- 设定NAT(SNAT)
- 从被隔离的Net NameSpace确认网络连通性
创建Net NameSpace
使用ip命令添加net01的Net NameSpace。
[root@sys-blog /]# ip netns add net01
添加网络接口(type veth),名称为veth01,与其相连接的另一端的网络接口名称为veth01_br(peer name veth01_br)。
[root@sys-blog /]# ip link add veth01 type veth peer name veth01_br
将创建的网络接口veth01插入至net01网络命名空间。
[root@sys-blog /]# ip link set veth01 netns net01
[root@sys-blog /]# ip netns exec net01 ip link
net01网络命名空间的veth01,赋予IP地址192.168.16.16。
[root@sys-blog /]# ip netns exec net01 ip addr add 192.168.16.16/24 dev veth01
确认IP地址是否已被赋予。
[root@sys-blog /]# ip netns exec net01 ip addr
启动veth01。
[root@sys-blog /]# ip netns exec net01 ip link set veth01 up
[root@sys-blog /]# ip netns exec net01 ip addr
目前另一端的veth01_br还未启动(state down),因此显示为state LOWERLAYERDOWN。
创建Bridge(网桥)
创建一个Bridge(名称为br01),并给Bridge设定IP地址。接下来把veth01的另一端veth01_br插入至该Bridge。最后启动Bridge和veth01_br。
[root@sys-blog /]# ip link add br01 type bridge <- 创建br01的Bridge
[root@sys-blog /]# ip addr add 192.168.16.1/24 dev br01 <- 设定Bridge的IP地址为192.168.16.1
[root@sys-blog /]# ip link set dev veth01_br up <- 启动veth01_br
[root@sys-blog /]# ip link set dev veth01_br master br01 <- 将veth01_br插入至br01
[root@sys-blog /]# ip link set veth01_br up <- 启动veth01_br
[root@sys-blog /]# ip link set br01 up <- 启动Bridge br01
[root@sys-blog /]# ip addr
veth01_br启动后,再次确认net01上的veth01的状态,可确认到 state up。
修改路由表
目前应该无法和外部网络进行连接,因为net01上的路由表没有添加默认网关。首先确认net01的当前路由表。
[root@sys-blog /]# ip netns exec net01 ip route
如下图,只有本地网络192.168.16.0/24的路由存在于路由表。
添加默认路由。
[root@sys-blog /]# ip netns exec net01 ip route add default via 192.168.16.1
[root@sys-blog /]# ip netns exec net01 ip route
因为没有设定NAT,目前还是无法外网。下图是使用ping命令进行网络连通性的结果。
设定NAT(SNAT)
在这里使用nftables进行SNAT(既MASQUERADE)的设定。关于NFTABLE可参照防火墙软件iptables后继软件nftables的基本操作。
启动nftable后,执行如下命令。当送信元IP地址为192.168.16.0/24时使用SNAT。
[root@sys-blog /]# nft add table nat
[root@sys-blog /]# nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; }
[root@sys-blog /]# nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
[root@sys-blog /]# nft add rule nat postrouting ip saddr 192.168.16.0/24 masquerade
使用iptables的时,可使用下面的命令。
iptables -t nat -A POSTROUTING -s 192.168.15.0/24 -j MASQUERADE
测试网络联通性
设定完net01的路由表和NAT后,再次确认网络连通性。
[root@sys-blog /]# ip netns exec net01 ping 8.8.8.8
至此从net01网络命名空间可正常访问外网。
而从外部访问该网络命名空间需要设定DNAT。以下是使用iptables和nftables时的范例。
iptables -t nat -A PREROUTING --dport 80 --to-destination 192.168.16.16:80 -j DNAT <- 使用iptables
nft add rule nat prerouting iifname ens160 tcp dport { 80, 443 } dnat to 192.168.16.16 <- 使用nftables
小结
在Linux上手动创建网络命名空间可进行网络之间的隔离,并且通过创建Bridge进行L2同行。最后介绍删除网络命名空间和Bridge的方法。
# ip netns exec net01 ip link del veth01
# ip netns del net01
# ip link del br01