太簡單了!Ubuntu僅需三條命令就能配好GENEVE隧道
GENEVE對應的RFC8926是2020年11月份正式發布的,距今已經過去4年多了,目前主要支持的設備商還是國外的廠商。從飛塔防火墻的配置過程,我們可以看到,配置非常簡單,實現應該也比較簡單。
具體簡單到什么地步呢?據說Ubuntu系統從16.04版本開始就支持GENEVE了,也就是2016年4月份,竟然比RFC8926的發布時間還早?其實這也沒啥問題,RFC8926的前身是draft-gross-geneve草案,該草案始于2014年2月份,在2015年5月份演化為draft-ietf-nvo3-geneve草案,這時的協議規范就基本完善了,所以Ubuntu大概率是這時就開始了GENEVE協議的適配開發工作。
為了驗證配置,我們使用兩臺Ubuntu主機測試對接GENEVE隧道,系統版本分別為18.04.6 LTS和23.10。
測試拓撲如下所示:
圖片
測試前,我們先配通底層網絡。Ubuntu18.04和Ubuntu23.10兩個系統配置IP地址的方式有所不同,Ubuntu18.04的配置命令如下:
ifconfig ens192 10.12.1.1 netmask 255.255.255.0
ip route add 10.23.1.0/24 via 10.12.1.2
而Ubuntu23.10的配置命令為:
ip addr add 10.23.1.3/24 dev ens192
ip route add 10.12.1.0/24 via 10.23.1.2
配置完成之后,兩臺主機就可以互通了。
圖片
接下來,我們先配置Ubuntu18.04的GENEVE配置。
跟飛塔防火墻的配置過程類似,配置GENEVE也是創建一個隧道接口,創建時必需要指定對端的IP地址和VNI,其他的都是可選配置。目前還沒遇到說修改GENEVE隧道端口號的,如果不幸遇到了,可以通過dstport來指定。
ip link add geneve0 type geneve id 100 remote 10.23.1.3
ip link add geneve0 type geneve id 100 remote 10.23.1.3 dstport 6081
ip link show geneve0
圖片
可以看到,隧道接口創建之后處于DOWN狀態,需要手工UP一下,再配置上接口的IP地址就好了。
ip link set geneve0 up
ip link show geneve0
ip addr add 10.13.1.1/24 dev geneve0
ip addr show geneve0
圖片
這里使能端口和配置IP地址沒有嚴格的先后順序,怎么操作都行。
到這里,Ubuntu18.04就配置完了,我們使用相同的操作,配置Ubuntu23.10。
ip link add geneve0 type geneve id 100 remote 10.12.1.1
ip link show geneve0
ip link set geneve0 up
ip link show geneve0
ip addr add 10.13.1.3/24 dev geneve0
ip addr show geneve0
圖片
可以看到,配置完成的接口一直處于UNKNOWN狀態,那這是否影響GENEVE隧道的通信呢?
圖片
通信正常,沒有影響。
現在看來,只要3條命令就能完成Ubuntu系統創建GENEVE隧道,那報文長啥樣呢?我們抓包看一下。
圖片
可以看到,我們在配置完一臺主機之后,該主機立即向外發送GENEVE協商請求報文,報文內容竟然又是IPv6的組播報文,跟飛塔防火墻一模一樣。這與RFC規范中的描述基本一致:
“Geneve隧道可以是兩個隧道端點之間的點對點單播,也可以利用廣播或組播尋址。在這方面不要求內部和外部尋址匹配。例如,在不支持組播的物理網絡中,封裝的組播流量可以被復制到多個單播隧道中,或者通過策略轉發到單播位置(可能在那里復制)。”
而在兩端都成功加入到組播組之后,兩臺主機就可以正常通信了。
我們再看一下ping包,直接顯示的就是內層的IP地址。
圖片
可以發現,報文的封裝格式遵循GENEVE協議規范,從外到內依次是外層以太網報文頭、外層IPv4報文頭、外層UDP報文頭、GENEVE報文頭、內層以太網報文頭、封裝載荷。
以我們的抓包為例,外層以太網報文頭分別是Ubuntu23.10和VSR的MAC地址,外層IPv4報文頭分別是Ubuntu23.10和Ubuntu18.04的接口IPv4地址,外層UDP報文頭的目的端口為UDP 6081端口,而源端口則不是固定的UDP 6081端口,請求報文的源端口為51016,響應報文的源端口為48931,似乎沒有什么規則,這里與飛塔防火墻的實現有些許不一樣。
再往內層就是GENEVE報文頭,記錄了VNI為100(0x64),內層以太網報文頭為兩個GENEVE虛擬接口的MAC地址;再內層的封裝載荷就是原始的PING報文了。
既然Ubuntu和飛塔防火墻的實現有差異,那兩者能對接嗎?且聽下文分解。