作者:刘海峰,IT行业资深码农,从事.net/java/go语言开发十余年,长期关注springcloud/k8s/linux网络相关的技术,现为滴普科技容器产品首席架构师。
前言
前面介绍了linux network namespace,接着介绍一下如何让一个独立的网络命名空间和主机的网络互通,这里我们需要用到linux虚拟网络设备veth。
veth设备
veth是linux的一种虚拟网络设备,它有点类似于两张网卡中间用一条网线连着,veth设备总是成对出现,通常用来连接不同网络命名空间(下面开始简称NS),一端连着NS1的内核协议栈,另一端连着NS2的内核协议栈,一端发送的数据会立刻被另一端接收。
接下来我们通过一些示例来理解veth设备,我们创建一个新的NS,然后跟主机的NS连接起来
通过下面的命令可以创建一对veth设备:
ip link add veth0 type veth peer name veth1
然后创建一个名为ns1的network namespace :
ip netns add ns1
然后把刚创建的veth1网卡的其中一端转到ns1,这就好像一端插到ns1上,另一端插在主机的ns上:
ip link set veth0 netns ns1
给veth的两端都配置个IP,设置veth0时,要用ip netns exec ns1,因为veth0此时在ns1中:
ip netns exec ns1 ip addr add 192.168.10.10/24 dev veth0
ip addr add 192.168.10.11/24 dev veth1
把两张网卡都启动起来:
ip netns exec ns1 ip link set veth0 up
ip link set veth1 up
此时的状态如下:
这时候主机和ns1已经可以相互ping通了:
[root@worker2 ~