Linux网络命名空间核心|虚拟网线、交换机、路由器
本文最后更新于 25 天前,其中的信息可能已经有所发展或是发生改变。

各位读者大家好,我是真境。

又来和大家一起学习Linux网络命名空间了,本篇文章给大家带来的是@技术蛋老师视频

一、前言

Linux有许多的命名空间,命名空间其实是对内核不同的资源进行划分。

今天给大家带来的是网络命名空间:network namespace

二、网络命名空间和回环接口

1、理解

Linux网络命名空间主要是用命令IP来实现的:

ip [options] object {command | help}
从TCP/IP五层模型来看,IP命令主要是在网络层和数据链路层

但是我们在上网的时候最重要的反而不是IP地址状态,而是要先检查网卡的状态(MAC地址)。因为你的数据进出都是要靠网卡上的网络接口。我们可以通过以下命令来查看接口状态:

ip link show
首先看见的 LOOPBACK 就是我们的回环接口,所有的程序之间的通信都是依赖着这个接口

还有一个以太网接口就是我们的 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地址,所以我们要先分配IP地址:
ip netns exec space7 ip addr add 172.20.0.10/24 dev interface7

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

注意:不要忘记了子网掩码,不然系统无法判断这个数据包要走去哪里
设置好之后网络空间便有了IP地址

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

我们可以先看看路由表

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

从space7 去 Ping 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地址一样,会冲突
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地址的。

可以进行Ping来测试

五、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.1

via就是设定路由方向,指定下一跳的地址。

但是查看路由表的时候 你会发现默认的接口和虚拟路由器的接口不一样。因此我们需要把没用的关掉/换掉
你会发现默认的路由没了,因此我们要重新设置一下
所以我们要设置虚拟路由器之前,建议先把点对点的连接全部关掉,避免弄混

但是我们还发现一个问题。通过以下命令你会发现:

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

收到包就没问题了。


文章就到这里了,我是真境。希望能为你分享更多内容!

暂无评论

发送评论 编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇