NameSpace是Linux内核提供的功能,如Docker容器也是使用Linux的NameSpace功能进行PID,网络,文件系统等的隔离。在这里介绍,Linux(Rocky Linux8)上创建Net NameSpace及网桥(Bridge)后,通过设定路由表及SNAT上网的方法。

接下来的步骤如下。

  1. 创建Net NameSpace
  2. 创建Bridge(网桥)
  3. 修改Net NameSpace上的路由
  4. 设定NAT(SNAT)
  5. 从被隔离的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