一,network namespace
Linux network namespace允许你在Linux中创建相互隔离的网络视图,每个网络名字空间都有自己独立的网络配置,包括:网络设备、路由表、IPTables规则,路由表、网络协议栈等。新建的网络名字空间与主机默认网络名字空间之间是隔离的。我们平时默认操作的是主机的默认网络名字空间。
+---------------------------------------------------------------------------------------+ | Linux Host | | | | +--------------------------------------+ +--------------------------------------+ | | | network namespace1 | | network namespace1 | | | | +---------------+ +---------------+ | | +---------------+ +---------------+ | | | | |network devices| | route table | | | |network devices| | route table | | | | | +---------------+ +---------------+ | | +---------------+ +---------------+ | | | | +---------------+ +---------------+ | | +---------------+ +---------------+ | | | | | iptables | |protocol stack | | | | iptables | |protocol stack | | | | | +---------------+ +---------------+ | | +---------------+ +---------------+ | | | +--------------------------------------+ +--------------------------------------+ | | | | +--------------------------------------+ | | | default network namespace | | | | +---------------+ +---------------+ | | | | |network devices| | route table | | | | | +---------------+ +---------------+ | | | | +---------------+ +---------------+ | | | | | iptables | |protocol stack | | | | | +---------------+ +---------------+ | | | +--------------------------------------+ | | | +---------------------------------------------------------------------------------------+
二, veth
veth和tap/tun类似,也是linux提供的一种虚拟网络设备;但与tap/tun不同的是,veth总是成对出现的,从一端进入的数据包将会在另一端出现,因此又常常称为veth pair。我们可以把veth pair看成一条网线两端连接的两张以太网卡,如下图所示:
经常用来连接两个namespace
+------------------+ +------------------+ | ns1 | | ns2 | | | veth pair | | | +-+ +-+ | | 192.168.1.1/24 | +--------------+ | 192.168.1.2/24 | | (veth-ns1) +-+ +-+ (veth-ns2) | | | | | | | | | | | | | +------------------+ +------------------+
三, bridge
在物理网络中,如果需要连接多个主机,我们会使用网桥,或者又称为交换机。Linux也提供了网桥的虚拟实现。下面我们试验通过Linux bridge来连接三个namespace
+------------------+ +------------------+ +------------------+ | | | | | | | | | | | | | | | | | | | ns1 | | ns2 | | ns3 | | | | | | | | | | | | | | | | | | | | 192.168.1.1/24 | | 192.168.1.2/24 | | 192.168.1.3/24 | +----(veth-ns1)----+ +----(veth-ns2)----+ +----(veth-ns3)----+ + + + | | | | | | + + + +--(veth-ns1-br)-------------(veth-ns2-br)------------(veth-ns3-br)--+ | | | linux-bridge | | | +--------------------------------------------------------------------+
四,路由route
路由器的工作原理是这样的:路由器上有2到多个网络接口,每个网络接口处于不同的三层子网上。路由器会根据内部的路由转发表将从一个网络接口中收到的数据包转发到另一个网络接口,这样就实现了不同三层子网之间的互通。Linux内核提供了IP Forwarding功能,启用IP Forwarding后,就可以在不同的网络接口中转发IP数据包,相当于实现了路由器的功能
备注:Linux的IP Forwarding功能并不是默认开启的,可以采用下面的方法开启:
cat > /etc/sysctl.d/30-ipforward.conf<<EOL net.ipv4.ip_forward=1 net.ipv6.conf.default.forwarding=1 net.ipv6.conf.all.forwarding=1 EOL sysctl -p /etc/sysctl.d/30-ipforward.conf
通过bridge连接到外网的两种方式:一种是桥接,另外一种是NAT
下图是桥接方式:
route: default gw 192.168.1 +------------------+ +------------------+ | | | | | | | | | | | | | ns1 | | ns2 | | | | | | | | | | | | | | 192.168.1.2/24 | | 192.168.1.3/24 | +---+(veth+ns1)+---+ +---+(veth+ns2)+---+ + + | | | | + + +-+(veth+ns1+br)+-----------+(veth+ns2+br)+-+ | | | Linux bridge | | | +-----------------(br0)---------------------+ | | | +-----------------(br0)---------------------+ | 192.168.1.1/24 | | default network namespace | | (Linux Kernel IP Forwarding) | | | | 10.0.2.15/24 | +---------------(enp0s3)--------------------+
五,tap/tun
TAP等同于一个以太网设备,它操作第二层数据包如以太网数据帧。TUN模拟了网络层设备,操作第三层数据包比如IP数据封包
操作系统通过TUN/TAP设备向绑定该设备的用户空间的程序发送数据,反之,用户空间的程序也可以像操作硬件网络设备那样,通过TUN/TAP设备发送数据
Linux Tun/Tap驱动程序为应用程序提供了两种交互方式:虚拟网络接口和字符设备/dev/net/tun。写入字符设备/dev/net/tun的数据会发送到虚拟网络接口中;发送到虚拟网络接口中的数据也会出现在该字符设备上
下图描述了Tap/Tun的工作原理:
创建隧道
参考:
https://zhaohuabing.com/post/2020-03-12-linux-network-virtualization/