1. 程式人生 > 其它 >虛擬網路gretap建立例項與流程分析

虛擬網路gretap建立例項與流程分析

技術標籤:網路

問: tun/tap裝置有什麼用?
https://segmentfault.com/a/1190000009249039#item-3
tun/tap裝置的用處是將協議棧中的部分資料包轉發給使用者空間的應用程式,
給使用者空間的程式一個處理資料包的機會。於是比較常用的資料壓縮,加密等功能就可以在應用程式B裡面做進去,
tun/tap裝置最常用的場景是v*n,包括tunnel以及應用層的IPSec等

問: tun和tap的區別?
https://segmentfault.com/a/1190000009249039#item-4
使用者層程式通過tun裝置只能讀寫IP資料包,
而通過 tap裝置能讀寫鏈路層資料包,
類似於普通socket和raw socket的差別一樣,處理資料包的格式不一樣。

1.gretap的網路拓撲圖

2.建立命令

準備:點對點網路,需要準備兩臺linux 系統裝置。

2.1 本端建立命令例項

LOCAL_IP=10.12.100.222 #本端ip
REMOTE_IP=10.12.100.153 #對端ip
TUNNEL_NAME=gretap1 #自定義gretap 隧道名
#建立GRE 隧道
ip link add name ${TUNNEL_NAME} type gretap remote ${REMOTE_IP} local ${LOCAL_IP}
ip link set ${TUNNEL_NAME} up mtu 1462

GRE_BR=br1
brctl addbr $GRE_BR
ip link set $GRE_BR up
brctl addif ${GRE_BR} ${TUNNEL_NAME}

#3.將對應的裝置掛載到橋br1 上
brctl addbr $GRE_BR wl1
brctl addbr $GRE_BR eth0

2.2 對端建立命令例項

LOCAL_IP=10.12.100.153 #對端ip
REMOTE_IP=10.12.100.222
TUNNEL_NAME=gretap1
#1.建立GRE 隧道
ip link add name ${TUNNEL_NAME} type gretap remote ${REMOTE_IP} local ${LOCAL_IP}
ip link set ${TUNNEL_NAME} up mtu 1462

#2.將gretap1 掛載到橋br1 上
GRE_BR=br1
brctl addbr $GRE_BR
ip link set $GRE_BR up
brctl addif ${GRE_BR} ${TUNNEL_NAME}

3.測試

1.在remote br1上開啟DHCP服務,本端eth0接入的裝置獲取ip成功. → 網路模型正確
2.在remote br1 掛載乙太網 ethx裝置, 本端eth0 ping ethx_ip 成功. → 區域網訪問成功
3.在remote 新增對應的iptables NAT, ip ro規則, 本端通過wl1 ssid AP上網成功. → 業務正常

4.原理說明

使用網橋的特性 -->有待確認
網橋的轉發規則是,網橋從x埠接收到一個幀:
①搜尋資料庫確定MAC地址是不是在一個埠port上面;
②如果沒有找到這個MAC地址,那麼把該幀泛洪flooding到所有埠(x除外);
③如果找到了MAC地址對應應該發往y埠,那麼檢查y,如果y不處於阻塞態,那麼就 從y埠傳送,如果是阻塞態,那麼不傳送。

5.資料包過程分析

通過AP wl1介面的資料包流向


通過乙太網口 eth0介面資料流向

6.gretap 封裝 和 解封過程

gretap報文示意


7.關於mtu的值討論

gretap 報文頭=gre:4 + mac:14 + ip:20 = 38
假設閘道器裝置的WAN MTU 1500
則掛載br1上的裝置eth0 的MTU合理值 1500-38 = 1462

分析:
1.假設eth0的mtu = 1500, eth0 發一個大小為1500的報文,經過gretap的封裝(即+38 Bytes gretap頭),大於WAN.mtu,導致在分片,影響傳送速率。
2.假設eth0的mtu = 1462, 則剛好通過。

mtu的修改方案分析:
1.通過dhcp server option 26(interface-mtu)

2.可以通過修改${TUNNEL_NAME} mtu值,功能生效。-->此處原理未知, 對傳送速率影響未驗證
eth0.mtu = 1500
br1.mtu = 1462
gretap1 = 1462