写在前面
上一篇介绍了veth和veth之间的通信,这一片、篇还是基于veth和veth之间,但是是通过一种新的方式,我们接下来看具体实现。
创建veth
首先还是创建一对网卡和一个命名空间,并且启动起来。
ip link add veth2 type veth peer name veth3
ip netns add ns2
ip link set veth2 netns ns2
ip netns exec ns2 ip addr add 192.168.100.12/24 dev veth2
ip netns exec ns2 ip link set veth2 up
ip link set veth3 up
这里我们创建veth2和veth3,并且把veth2放到了ns2的命名空间中。
需要注意的是这里并没有给veth3设置网卡的ip地址。
接下来我们打开veth3的arp代答
echo 1 > /proc/sys/net/ipv4/conf/veth3/proxy_arp
给我们的ns2空间中的veth2加上默认路由
ip netns exec ns2 ip route add 0.0.0.0/0 via 169.2.2.2 dev veth2 onlink
查看此时路由
然后在当前主的命名空间中增加一天去veth2的路由策略
ip route add 192.168.100.12 dev veth3 scope link
同时打开转发包的功能
echo 1 > /proc/sys/net/ipv4/ip_forward
然后ping一下发现可以,ping通
跨命名空间
先试试veth1能不能ping到veth2.
很明显失败了。
这里先给veth0配置一个arp代答并且加上默认路由
echo 1 > /proc/sys/net/ipv4/conf/veth0/proxy_arp
再试试可以了
好的veth到这里就结束了。接下来继续bridge的。
说一下为什么要ns2空间中的veth2加上默认路由是这么奇怪的ip。
这个是因为将169.2.2.2设置成了下一跳的地址,然后发出arp广播,然后veth3开启了arp代答,就将veth3的arp复制过来,然后再开启了转发,因此ns2的到ns1空间,就经过了veth3转发到了veth1,然后也得到了响应。