天天看點

網絡虛拟化-- linux虛拟網絡基礎

linux虛拟網絡基礎

1 Device

在linux裡面devic(裝置)與傳統網絡概念裡的實體裝置(如交換機、路由器)不同,Linux所說的裝置,其背後指的是一個類似于資料結構、核心子產品或裝置驅動這樣的含義。就是說device可能隻是軟體系統裡的一個驅動,一個函數接口。

2 Tap

Tap位于二層資料鍊路層,tun位于三層網絡層,兩者在linux裡的函數結構幾乎一緻,除了一個flag值區分tap/tun。在linux中二層特指以太網(Ethernet)(傳統網絡裡二層分Ethernet,P2P,HDLC,FR,ATM),是以有時tap也叫“虛拟以太裝置”。有意思的是linux建立tap需要用到tun子產品。Linux建立tap/tun都使用tun子產品。

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進行橋接。

網絡虛拟化-- linux虛拟網絡基礎

4 veth pair

veth pair不是一個裝置,而是一對裝置,以連接配接兩個虛拟以太端口。操作vethpair,需要跟namespace一起配合,不然就沒有意義。如圖

網絡虛拟化-- linux虛拟網絡基礎

5 Bridge

在Linux的語境裡,Bridge(網橋)與Switch(交換機)是一個概念。因為一對veth pair隻能連接配接兩台device,是以如果需要多台裝置互聯則需要bridge。

如圖:4個namespace,每個namespace都有一個tap,每個tap與網橋vb1的tap組成一對veth pair,這樣,這4個namespace就可以二層互通了。

網絡虛拟化-- linux虛拟網絡基礎

6 Router

Linux建立Router并沒有像建立虛拟Bridge那樣,有一個直接的指令brctl,而且它間接的指令也沒有,不能建立虛拟路由器……因為它就是路由器(Router) !

如圖:我們需要在router(也就是我們的作業系統linux上增加去往各NS的路由)。

網絡虛拟化-- linux虛拟網絡基礎

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很像。

網絡虛拟化-- linux虛拟網絡基礎

8 iptable

我們通常把iptable說成是linux的防火牆,實際上這種說法并不準确。實際上iptable隻是一個運作在使用者空間的指令行工具,真正實作防火牆功能的是核心空間的netfilter子產品。

這裡我們先知道防火牆執行子產品netfilter位于核心空間,指令行iptable位于使用者空間。我們在通過iptable配置的防火牆政策(包括NAT)會在netfilter執行。

iptables有5個鍊:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

 PREROUTING:封包進入網絡接口尚未進入路由之前的時刻;

 INPUT:路由判斷是本機接收的封包,準備從核心空間進入到使用者空間的時刻;

 FORWARD:路由判斷不是本機接收的封包,需要路由轉發,路由轉發的那個時刻;

 OUTPUT:本機封包需要發出去 經過路由判斷選擇好端口以後,準備發送的那一刻;

 POSTROUTING:FORWARD/OUTPUT已經完成,封包即将出網絡接口的那一刻。

DNAT用的是PREROUTING,修改的是目的位址,SNAT用的是POSTROUTING,修改的是源位址。

Iptable有5個表:filter,nat,mangle,raw, security,raw表和security表不常用。主流文檔都是說5鍊4表,沒有包括security表。

 Raw表——決定資料包是否被狀态跟蹤機制處理

 Mangle表——修改資料包的服務類型、TTL、并且可以配置路由實作QOS

 Nat表——用于網絡位址轉換(IP、端口)

 filter表——過濾資料包

 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處理。

網絡虛拟化-- linux虛拟網絡基礎

8.1 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已經是公網位址了

8.2 Firewall

防火牆根據規則執行accept/reject動作,防火牆規則的元素如下:

入接口、出接口、協定、源位址/子網、目的位址/子網、源端口、目的端口。

Netfilter中的Firewall會在這三個點進行處理:INPUT/FORWARD/OUTPUT

8.3 Mangle

mangle表主要用于修改資料包的ToS( Type of Service,服務類型)、 TTL(Time to Live,生存周期)以及為資料包設定Mark标記,以實作QoS(Qualityof Service,服務品質)調整以及政策路由等應用。Netfilter每個點都可以做mangle。

9 總結

tap、tun、vethpair在Linux中都被稱為裝置,但是在與日常概念的類比中,常常被稱作接口。而bridge和router這些日常稱為裝置的再linux中反而不稱為裝置。linux利用namespace做隔離,Bridge提供二層轉發功能,Router提供三層轉發功能。Router還常常借助iptable提供SNAT/DNAT功能。Bridge也常常借助iptable提供Firewall功能。

繼續閱讀