veth pair 实现namespace 通信

1、让我们首先检查是否有任何现有的名称空间。我们可以使用ip工具:

$ ip netns list
(no output)

2、现在,我们创建两个新的名称空间:

$ sudo ip netns add ns1
$ sudo ip netns add ns2

3、如果再次列出,我们现在将看到两个名称空间:

$ ip netns list
ns2
ns1

4、我们可以验证这些名称空间是隔离的,并且具有自己的网络资源视图。ip addr在我的ubuntu 上运行时,将列出设备上的所有地址。在我的ubuntu上,我可以看到三个地址。

$ ip addr
1: lo # only listing the interface name, not the full output
2: enp0s3 # only listing the interface name, not the full output
3: enp0s8 # only listing the interface name, not the full output

5、如果在新的名称空间上运行相同的命令,它将仅返回回送接口的地址,因为它具有系统的隔离视图,看不到现有根名称空间已配置的内容。

$ sudo ip netns exec ns1 ip addr
1: lo # only listing the interface name, not the full output
$ sudo ip netns exec ns2 ip addr
1: lo # only listing the interface name, not the full output

6、现在我们可以模拟两台计算机 -命名空间(namespace),接下来我们可以进行下一步,将它们连接起来进行通信,为此,我们需要一根电缆。Linux支持虚拟网络设备veth。我们可以认为veth是我们用来连接两台计算机的电缆。Veth总是成对出现,发送到它一侧的任何东西都会传递到另一侧。

要创建veth,我们还可以使用ip工具:

$ sudo ip link add v1 type veth peer name v2

7、使用此命令,我们创建了一个veth,它的一侧称为“ v1”,对等端称为“ v2”。

列出接口后,我们可以看到刚刚创建的新veth:

$ ip link
// ... existing interfaces
4: v2@v1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether ba:22:31:bf:fa:04 brd ff:ff:ff:ff:ff:ff
5: v1@v2: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether be:9f:a4:08:c8:9e brd ff:ff:ff:ff:ff:ff

8、继续我们的隐喻,接下来我们需要将电缆插入两台计算机。veth的每一端都在一个网络名称空间上,以模拟我们的布线。

$ sudo ip link set v1 netns ns1
$ sudo ip link set v2 netns ns2

9、现在,如果我列出接口,我的本地VM将不会显示veth。但是我们可以看到它们列出了每个命名空间的接口。

$ ip link
# (The veth don't appear locally anymore)
$ sudo ip netns exec ns1 ip link
1: lo
10: v1 # one side of the veth
$ sudo ip netns exec ns2 ip link
1: lo
10: v2 # the other side of the veth

10、我们的两台计算机的最后一部分-命名空间进行通信是配置网络,每个计算机都有一个IP地址,并且它们的接口必须打开。

$ sudo ip netns exec ns1 ip link set v1 up
$ sudo ip netns exec ns1 ip addr add 10.0.0.1/24 dev v1
$ sudo ip netns exec ns2 ip link set v2 up
$ sudo ip netns exec ns2 ip addr add 10.0.0.2/24 dev v2

11、现在,我们可以从另一个ping通一个名称空间。

$ sudo ip netns exec ns1 ping 10.0.0.2
$ sudo ip netns exec ns2 ping 10.0.0.1

12、但是一个更好的示例是在每个名称空间内启动bash进程,并使用netcat创建简单的聊天。

在名称空间ns1中启动bash进程:

$ sudo ip netns exec ns1 bash

并在端口8080上启动一个netcat服务器:

$ nc -l -p 8080
# 随便写一些内容 ,例如hello veth

另一个终端窗口中,在第二个名称空间中启动bash进程:

$ sudo ip netns exec ns2 bash

并使用netcat连接到另一端:

$ nc 10.0.0.1 8080
# 这里会显示刚才写的内容,hello veth

就是这样,我们确实创建了两个网络名称空间,并将它们与虚拟网络设备(veth)连接。

13、要清理,请删除名称空间:

$ sudo ip netns del ns1
$ sudo ip netns del ns2
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值