1 linux虛擬網路基礎
1.1 Device
在linux裡面devic(裝置)與傳統網路概念裡的物理裝置(如交換機、路由器)不同,Linux所說的裝置,其背後指的是一個類似於資料結構、核心模組或裝置驅動這樣的含義。就是說device可能只是軟體系統裡的一個驅動,一個函式介面。
1.2 Tap
Tap位於二層資料鏈路層,tun位於三層網路層,兩者在linux裡的函式結構幾乎一致,除了一個flag值區分tap/tun。在linux中二層特指乙太網(Ethernet)(傳統網路裡二層分Ethernet,P2P,HDLC,FR,ATM),因此有時tap也叫“虛擬以太裝置”。有意思的是linux建立tap需要用到tun模組。Linux建立tap/tun都使用tun模組。
1.3 Namespace
Namespace類似傳統網路裡的VRF,與VRF不同的是:VRF做的是網路層三層隔離。而namespace隔離的更徹底,它做的是整個協議棧的隔離,隔離的資源包括:UTS(UnixTimesharing System的簡稱,包含記憶體名稱、版本、 底層體系結構等資訊)、IPS(所有與程式間通訊(IPC)有關的資訊)、mnt(當前裝載的檔案系統)、PID(有關程式ID的資訊)、user(資源配額的資訊)、net(網路資訊)。
從網路角度看一個namespace提供了一份獨立的網路協議棧(網路裝置介面、IPv4/v6、IP路由、防火牆規則、sockets等),而一個裝置(Linux Device)只能位於一個namespace中,不同namespace中的裝置可以利用vethpair進行橋接。
1.4 veth pair
veth pair不是一個裝置,而是一對裝置,以連線兩個虛擬以太埠。操作vethpair,需要跟namespace一起配合,不然就沒有意義。如圖
1.5 Bridge
在Linux的語境裡,Bridge(網橋)與Switch(交換機)是一個概念。因為一對veth pair只能連線兩臺device,因此如果需要多臺裝置互聯則需要bridge。
如圖:4個namespace,每個namespace都有一個tap,每個tap與網橋vb1的tap組成一對veth pair,這樣,這4個namespace就可以二層互通了。
1.6 Router
Linux建立Router並沒有像建立虛擬Bridge那樣,有一個直接的命令brctl,而且它間接的命令也沒有,不能建立虛擬路由器……因為它就是路由器(Router) !
如圖:我們需要在router(也就是我們的作業系統linux上增加去往各NS的路由)。
1.7 tun
tun是一個網路層(IP)的點對點裝置,它啟用了IP層隧道功能。Linux原生支援的三層隧道。支援隧道情況:ipip(ipv4 in ipv4)、gre(ipv4/ipv6 over ipv4)、sit(ipv6 over ipv4)、isatap(ipv6/ipv4隧道)、vti(ipsec介面)。
學過傳統網路GRE隧道的人更容易理解,如圖:
NS1的tun1的ip 10.10.10.1與NS2的tun2的ip 10.10.20.2建立tun
NS1的tun的ip是10.10.10.1,隧道的外層源ip是192.168.1.1,目的ip是192.168.2.1,是不是跟GRE很像。
1.8 iptable
我們通常把iptable說成是linux的防火牆,實際上這種說法並不準確。實際上iptable只是一個執行在使用者空間的命令列工具,真正實現防火牆功能的是核心空間的netfilter模組。
這裡我們先知道防火牆執行模組netfilter位於核心空間,命令列iptable位於使用者空間。我們在通過iptable配置的防火牆策略(包括NAT)會在netfilter執行。
iptables有5個鏈:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
l PREROUTING:報文進入網路介面尚未進入路由之前的時刻;
l INPUT:路由判斷是本機接收的報文,準備從核心空間進入到使用者空間的時刻;
l FORWARD:路由判斷不是本機接收的報文,需要路由轉發,路由轉發的那個時刻;
l OUTPUT:本機報文需要發出去 經過路由判斷選擇好埠以後,準備傳送的那一刻;
l POSTROUTING:FORWARD/OUTPUT已經完成,報文即將出網路介面的那一刻。
DNAT用的是PREROUTING,修改的是目的地址,SNAT用的是POSTROUTING,修改的是源地址。
Iptable有5個表:filter,nat,mangle,raw, security,raw表和security表不常用。主流文件都是說5鏈4表,沒有包括security表。
l Raw表——決定資料包是否被狀態跟蹤機制處理
l Mangle表——修改資料包的服務型別、TTL、並且可以配置路由實現QOS
l Nat表——用於網路地址轉換(IP、埠)
l filter表——過濾資料包
l security 表(用於強制訪問控制網路規則,例如:SELinux)
4個表的優先順序由高到低的順序為:raw-->mangle-->nat-->filter。RAW表,在某個鏈上,RAW表處理完後,將跳過NAT表和 ip_conntrack處理,即不再做地址轉換和資料包的連結跟蹤處理了。RAW表可以應用在那些不需要做nat的情況下,以提高效能。如大量訪問的web伺服器,可以讓80埠不再讓iptables做資料包的連結跟蹤處理,以提高使用者的訪問速度。
下面講下資料包流向與處理:
- 如果是外部訪問的目的是本機,比如使用者空間部署了WEB服務,外部來訪問。資料包從外部進入網路卡----->PREROUTING處理----->INPUT處理----->到達使用者空間程式介面,程式處理完成後發出----->OUTPUT處理----->POSTROUTING處理。每個處理點都有對應的表,表的處理順序按照raw-->mangle-->nat-->filter處理。
- 如果使用者訪問的目的不是本機,linux只是一箇中轉(轉發)裝置,此時需要開啟ip forward功能,資料流就是進入網路卡-----> PREROUTING處理-----> FORWARD處理-----> POSTROUTING處理。
1.8.2 NAT
Netfilter中的NAT有三個點做處理,
(1) NAT-PREROUTING (DNAT)
資料包文進入PREROUTING,NAT模組就會處理,比如使用者空間的WEB服務私網地址192.168.0.1,對外提供公網ip是220.1.1.1。
當外部ip訪問220.1.1.1時,PREROUTING接受資料包,NAT模組處理將目的ip 220.1.1.1轉換為私網ip192.168.0.1,這就是DNAT。
(2) NAT-POSTROUTING (SNAT)
使用者空間應用程式訪問外部網路,比如使用者空間應用程式訪問114.114.114.144,私網ip 192.168.0.1,此時資料包流經POSTROUTING,NAT模組會處理,將192.168.0.1轉換為220.2.2.2,對於目的ip114.114.114.114來說,就是220.2.2.2訪問它,這就是SNAT。
(3) NAT-OUTPUT (DNAT)
我們把核心空間想象成一臺防火牆,防火牆自身對外傳送報文訪問外部時,就在OUTPUT做DNAT,此時不需要再POSTROUTING點再做NAT。因為此時從OUTPUT出來的源IP已經是公網地址了
1.8.3 Firewall
防火牆根據規則執行accept/reject動作,防火牆規則的元素如下:
入介面、出介面、協議、源地址/子網、目的地址/子網、源埠、目的埠。
Netfilter中的Firewall會在這三個點進行處理:INPUT/FORWARD/OUTPUT
1.8.4 Mangle
mangle表主要用於修改資料包的ToS( Type of Service,服務型別)、 TTL(Time to Live,生存週期)以及為資料包設定Mark標記,以實現QoS(Qualityof Service,服務質量)調整以及策略路由等應用。Netfilter每個點都可以做mangle。
1.9 總結
tap、tun、vethpair在Linux中都被稱為裝置,但是在與日常概念的類比中,常常被稱作介面。而bridge和router這些日常稱為裝置的再linux中反而不稱為裝置。linux利用namespace做隔離,Bridge提供二層轉發功能,Router提供三層轉發功能。Router還常常藉助iptable提供SNAT/DNAT功能。Bridge也常常藉助iptable提供Firewall功能。