各位读者大家好,我是真境。
又来和大家一起学习Linux网络命名空间了,本篇文章给大家带来的是@技术蛋老师的视频
一、前言
Linux有许多的命名空间,命名空间其实是对内核不同的资源进行划分。

今天给大家带来的是网络命名空间:network namespace
二、网络命名空间和回环接口
1、理解
Linux网络命名空间主要是用命令IP来实现的:
ip [options] object {command | help}
但是我们在上网的时候最重要的反而不是IP地址状态,而是要先检查网卡的状态(MAC地址)。因为你的数据进出都是要靠网卡上的网络接口。我们可以通过以下命令来查看接口状态:
ip link show
还有一个以太网接口就是我们的 ens33接口:

同时你会发现两个接口都是UP状态,代表着两个接口都是启动的。可以同时对内对外进行通信
2、创建网络空间
有这基础下,我们就可以开始创建网络空间了:
ip netns add <自定义名字>同时的话可以查看创建的网络空间:
ip netns list
三、点到点与虚拟网线
在这个网络空间内我们可以执行命令:
ip netns exec <网络空间名> <命令>
ip link add <第一个网口名称> type veth peer name <第二个网口名称>其中 veth 就是 Virtual Ethernet 的缩写。这样的话我们就成功创建了具有两端的虚拟网线


执行以下命令,将我们创建的两个接口端分别插入space7和space8:
ip link set interface7 netns space7
ip link set interface8 netns space8

然后将两个网络空间的接口都一起UP:
ip netns exec space7 ip link set lo up
ip netns exec space7 ip link set interface7 up但是你会发现你想进行Ping测试的时候,不知道他的IP地址:

ip netns exec space7 ip addr add 172.20.0.10/24 dev interface7我们只是为了实现局域网之间的访问,所以我们使用了 172.20.0.10/24 这个地址(内网)来绑定到 设备(dev) 的接口(interface7)上。

可能有些人不知道为什么要设置子网掩码,虚拟网线不是可以把空间连起来吗?

如果 space7 要访问 space8 的IP地址吗,会查看路由表。因为路由表就只有这条规则,刚好 space8 就是这条规则的目标网络范围。因此就可以从逻辑上发网 space8 的方向。

这样的话就实现了我们点对点的通信方式。这种方式经常用在前端和后端的网络通信当中。
四、网桥与虚拟交换机
但是,如果说我们有多个网络空间的话,进行点对点连接。这个方案是特别的乱的。因此我们需要使用交换机,可以实现局域网内多个设备之间的通信。
在网络命名空间的局域网内,我们可以用网桥来实现交换机的功能:

设置网桥和设置虚拟网线也是一样的。首先先创建网桥:
ip link add wangqiao type bridge
ip link set wangqiao up我们一般会把网桥放在宿主机里面,这样的话可以方便网络空间通过网桥来进行对外通信。
如何实现呢?和我们刚刚创建虚拟网线连接一样:
ip link add 7-to-bridge type veth peer name bridge-to-7
ip link set 7-to-bridge netns space7这边直接用 master 直接接到网桥上:
ip link set bridge-to-7 master wangqiao接下来把他们全部 UP:

另外 space8也是一样的连接方式:

ip link add 8-to-bridge type veth peer name bridge-to-8
ip link set 8-to-bridge netns space8
ip link set bridge-to-8 master wangqiao然后也一样要一起分配IP地址
ip netns exec space7 ip addr add 172.20.0.100/24 dev 7-to-bridge
ip netns exec space8 ip addr add 172.20.0.200/24 dev 8-to-bridge有些人可能会给网桥来进行配置IP地址,但是这边不需要。因为这边的网桥是交换机,二层的交换机是看MAC地址的。

五、NAT与虚拟路由器
局域网的问题解决了,但是我们让一个网络空间来访问一个公网IP是不行的。空间不能访问互联网,毕竟空间缺少了路由器。但是我们可以把刚刚的网桥直接升级成虚拟路由器
我们刚刚已经插好了虚拟网线可以减少很多步骤,路由器的本质是根据IP地址进行数据转发。我们需要对网桥接口进行设置IP地址:
ip addr add 172.20.0.1/24 dev wangqiao是不是有点熟悉了,这个就是网关地址。我们就可以把数据包交给这个有IP地址的网桥了。
但是space7怎么知道要把数据包交给这个有IP地址的网桥?还是交给space8呢?所以我们需要添加路由规则(默认路由规则):
ip netns exec space7 ip route add default via 172.20.0.1via就是设定路由方向,指定下一跳的地址。



但是我们还发现一个问题。通过以下命令你会发现:
sysctl net.ipv4.ip_forward
IP转发的设置为0,意味着宿主机是不会帮你进行任何数据转发的,空间即使能够把数据包路由到宿主,宿主也不会帮你转发数据。
为什么呢?因为一台电脑默认就可以转发数据包的,那么只要这台电脑被黑,黑客就可以随便去远程局域网内任何设备,因此我们要打开数据转发。
sysctl -w net.ipv4.ip_forward=1
只不过数据转发出去就不回来了,因为空间里的IP地址就是内网IP地址,如果源IP地址是内网地址的话,那目标设备收到你的数据包以后,根本就没办法给你相应数据。
因为目标地址如果是内网地址是没有办法在公网里转发的,所以我们需要进行NAT进行转换
如果我们要进行NAT转换的话,我们直接使用 iptables命令就可以了。
iptables \
> -t nat \ # t 是tab
> -A POSTROUTING \ # A是Append 添加的意思,POSTROUTING是路由后链规则。这是数据包离开宿主机网卡之前的最后一关
> -s 172.20.0.0/24 \ # 设置源IP地址 范围在 172.20.0.0 - 172.20.0.255
> -j MASQUERADE # 减少麻烦,直接设置这个动作,这个动作会自动查看宿主机哪个网卡可以看见外面的网络这样的话我们可以在空间里来进行测试外网网络了:
ip netns exec space7 ping baidu.com收到包就没问题了。
文章就到这里了,我是真境。希望能为你分享更多内容!