不讨论其余的,只谈网桥和设备对,因为linux网络实在是太难太恶心了。
如同tun/tap
一般,这也是虚拟设备,但是却也不同,tun/tap
的一端是协议栈,一端是用户态程序,然而veth-pair
是成对出现的,一端连接着协议栈,一端连接彼此。
这个特性很抽象,那就不得不说明一下这个设备的诞生缘由与目的。
DESCRIPTION
The veth devices are virtual Ethernet devices. They can act as tunnels be‐
tween network namespaces to create a bridge to a physical network device in
another namespace, but can also be used as standalone network devices.
这是man
手册中的介绍,直接了当地说明了这样的设备对是用来充当不同network namesapce
之间的tunnel
的。
network namespace
是实现网络虚拟化的功能,不同的namespace
中有各自的网卡
,路由表
,ARP表
,iptables
等网络资源,就比如在你的系统中创建一个新的network namespace
后,它的网络就和你系统的网络隔离开了,成了一个独立的网络空间,而linux
则提供了veth-pair
将两个namespace
连通起来,两个空间可以通过这样的一条管道进行网络通信。
做个实验看下,首先建立一个network namespace
。
sudo ip netns add net1
然后创建出veth-pair
sudo ip link add type veth
把其中一个veth
放到net1
中
sudo ip link set veth1 netns net1
分别给两张网卡配置IP
后启用起来。
//主ns
sudo ifconfig veth0 99.1.1.1/24
sudo ifconfig veth0 up
sudo ifconfig
//ns1
sudo ip netns exec net1 ifconfig veth1 99.1.1.2/24
sudo ip netns exec net1 ifconfig veth1 up
sudo ip netns exec net1 ifconfig
在net1
里发个包试试
ping -c 1 99.1.1.1
但如果在net1
中添加这么一条路由表后,然后ping 8.8.8.8
再去抓取veth0
的数据包,会发现很有意思的事。
route add -net 0.0.0.0 netmask 0.0.0.0 gw 99.1.1.2 dev veth1
倘若我们物理机上开启了转发功能的话,是否就代表着net1
真的能够访问外网了呢?
网桥
设备可以理解成是一个虚拟交换机,有若干入口,也有若干出口,而网桥的作用就是在一个口接受到报文时原样复制到其余的各个口,且发送出去,当然为了避免不必要的网络交互产生,交换机经过地址学习
后能够只向特定的网口发送数据。
实际上对于veth-pair
来说,就是提供了一种方法让超过两个network namespace
能够通信,实现的方式就是veth
的一个在namespace
中,另一个在网桥上。
至于访问外网,都得开启转发。