在linux裡面devic(裝置)與傳統網路概念裡的物理裝置(如交換機、路由器)不同,linux所說的裝置,其背後指的是乙個類似於資料結構、核心模組或裝置驅動這樣的含義。就是說device可能只是軟體系統裡的乙個驅動,乙個函式介面。
tap位於二層資料鏈路層,tun位於三層網路層,兩者在linux裡的函式結構幾乎一致,除了乙個flag值區分tap/tun。在linux中二層特指乙太網(ethernet)(傳統網路裡二層分ethernet,p2p,hdlc,fr,atm),因此有時tap也叫「虛擬以太裝置」。有意思的是linux建立tap需要用到tun模組。linux建立tap/tun都使用tun模組。
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進行橋接。
veth pair不是乙個裝置,而是一對裝置,以連線兩個虛擬以太埠。操作vethpair,需要跟namespace一起配合,不然就沒有意義。如圖
在linux的語境裡,bridge(網橋)與switch(交換機)是乙個概念。因為一對veth pair只能連線兩台device,因此如果需要多台裝置互聯則需要bridge。
如圖:4個namespace,每個namespace都有乙個tap,每個tap與網橋vb1的tap組成一對veth pair,這樣,這4個namespace就可以二層互通了。
linux建立router並沒有像建立虛擬bridge那樣,有乙個直接的命令brctl,而且它間接的命令也沒有,不能建立虛擬路由器……因為它就是路由器(router) !
如圖:我們需要在router(也就是我們的作業系統linux上增加去往各ns的路由)。
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很像。
我們通常把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處理。
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已經是公網位址了
防火牆根據規則執行accept/reject動作,防火牆規則的元素如下:
netfilter中的firewall會在這三個點進行處理:input/forward/output
mangle表主要用於修改資料報的tos( type of service,服務型別)、 ttl(time to live,生存週期)以及為資料報設定mark標記,以實現qos(qualityof service,服務質量)調整以及策略路由等應用。netfilter每個點都可以做mangle。
tap、tun、vethpair在linux中都被稱為裝置,但是在與日常概念的模擬中,常常被稱作介面。而bridge和router這些日常稱為裝置的再linux中反而不稱為裝置。linux利用namespace做隔離,bridge提供二層**功能,router提供三層**功能。router還常常借助iptable提供snat/dnat功能。bridge也常常借助iptable提供firewall功能。
網路虛擬化之FlowVisor 網路虛擬層(下)
在前面兩篇文章 網路虛擬化之flowvisor 網路虛擬層 上 和網路虛擬化之flowvisor 網路虛擬層 中 中分別介紹了flowvisor的特性和實現,三 的最後一篇介紹虛擬網路的隔離機制。虛擬化的乙個重要元素是切片之間的隔離,因為不同資源的隔離機制是不相同的,接下來將分別描述。1.頻寬隔離 ...
網路虛擬化之FlowVisor 網路虛擬層(上)
概念解釋 切片 虛擬網路的乙個例項 一.網路虛擬化 虛擬網路 人類社會的發展在很大方面得益於自然界,飛機受益於鳥,雷達受益於蝙蝠等等,所以專門有個學科為仿生學就是研究和模仿生物的特殊本質,利用生物的結構和功能原理來研製機械或各種新技術的科學技術。而人類社會已經發展了這麼多年,沉澱了很多可以和自然界相...
Linux 虛擬化網路技術 虛擬網路協議棧
本文通過 openstack neutron l3 agent 實現的 linux 虛擬路由器來描述 linux 的虛擬網路協議棧。neutron l3 agent 服務,執行在 openstack 的網路節點上,實現了 3 層路由和 nat 功能。利用 linux network namespac...