一,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數據封包
任何一個網絡設備有兩端,比如一個物理網卡,一端連接內核協議棧,另一端是通過物理接口連接外界網絡
虛擬網絡設備也是如此,一端連接內核協議棧,另一端取決於訪問字符驅動(/dev/net/tun)的用戶程序
下圖描述了Tap/Tun的工作原理:
tun/tap 的最主要應用場景,就是vpn ,tunnel
創建隧道
參考:
https://zhaohuabing.com/post/2020-03-12-linux-network-virtualization/