一、實驗目的

OpenvSwitch簡稱OVS,是一款高質量、多次層的虛擬交換軟體,可以實現物理設備之間、虛擬設備之間以及物理設備和虛擬設備之間的數據交換。本次實驗主要驗證以下方案的可行性:當一台設備同時安裝OVS和一些伺服器應用時,該設備既可以作為轉發節點轉發數據,也可以作為終端節點被訪問。


二、實驗環境

實驗環境

本次實驗的實驗環境如圖所示,主機A與主機B的有線網卡通過有線網路相連(非直連),主機B的無線網卡和主機C通過一個無線轉發設備(無線路由器)相連。主機A作為客戶端來訪問主機C中搭建的apache2伺服器,主機B和主機C中均裝有OVS軟體,支持數據包的轉發功能。


三、邏輯拓撲

本次實驗的邏輯拓撲如圖所示,主機B的兩個物理網卡分別掛在了br0和br1兩個虛擬網橋上,10.8.0.111和192.168.0.104分別為br0和br1的地址,物理網卡沒有地址;同理,主機C的無線網卡也掛在了虛擬網橋br0上,192.168.0.102為br0的地址,無線網卡沒有地址。主機B的br0為主機A的網關,主機B的br1為主機C的網關。本實驗要實現A能夠通過OVS的轉發和處理,成功訪問到C中搭建的apache2伺服器。

實驗邏輯拓撲

四、實驗步驟及講解

1.軟體安裝

在主機B和主機C中安裝OVS軟體,使用如下命令:

sudo apt-get install openvswitch-switch #安裝OVS

在主機C中安裝apache2伺服器:

sudo apt-get install apache2 #安裝apache2

2.配置環境

將主機B中物理網卡的IP地址清除:

sudo ifconfig enp3s0 0 #清除B中有線網卡的IP地址
sudo ifconfig wlx002f82818d37 0 #清除B中無線網卡的IP地址

在主機B中用OVS創建虛擬網橋br0和br1:

sudo ovs-vsctl add-br br0 #在B中創建br0
sudo ovs-vsctl add-br br1 #在B中創建br1

將有線網卡掛在br0上,將無線網卡掛在br1上:

sudo ovs-vsctl add-port br0 enp3s0 #將有線網卡enp3s0掛在br0上
sudo ovs-vsctl add-port br1 wlx002f82818d37 #將無線網卡wlx002f82818d37掛在br1上

此時虛擬網橋下會有一條默認的流表,為了排除這條流表對實驗的干擾,將這條流表清除:

sudo ovs-ofctl del-flows br0 #將br0中的默認流表清除
sudo ovs-ofctl del-flows br1 #將br1中的默認流表清除

為br0和br1配置相應的IP地址:

sudo ifconfig br0 10.8.0.111/24 #給br0配置IP地址
sudo ifconfig br1 192.168.0.104/24 #給br1配置IP地址

同理,在主機C上也進行類似的操作:

sudo ifconfig wlp3s0 0 #清除C中無線網卡的IP地址
sudo ovs-vsctl add-br br0 #在C中創建br0
sudo ovs-vsctl add-port br0 wlp3s0 #將無線網卡wlp3s0掛在br0上
sudo ovs-ofctl del-flows br0 #將br0中的默認流表清除
sudo ifconfig br0 192.168.0.102/24 #給br0配置IP地址

至此,實驗環境配置完成,之後進行添加流表的工作。

3.添加主機B中的流表

為了正確地添加流表,需要先了解主機A在訪問主機C時的整個通信流程。以主機A ping 主機C為例,首先A需要知道自己的網關(B中的br0)的MAC地址,因此需要在br0中添加流表保證arp協議數據包可以通過enp3s0到達br0,同時br0可以根據arp請求進行正確的響應,且響應數據包可以通過enp3s0網口發出。為了實現上述過程,我們利用ovs流表動作項里的normal來完成,normal表示數據包按照正常的L2/L3處理,使用如下指令:

sudo ovs-ofctl add-flow br0 table=0,arp,actions=normal #匹配br0中所有arp數據包,並按照正常的處理流程處理

主機A在獲取到自己網關的MAC地址後,會發送目的地址為192.168.0.102的ICMP請求包,該請包首先會到達enp3s0,為了讓數據包可以利用br0轉發,我們需要配置相應的流表來實現。在這裡,我們同樣使用normal動作:

sudo ovs-ofctl add-flow br0 table=0,ip,ip_src=10.8.0.0/24,actions=normal #匹配br0中源地址為10.8.0.0/24網段的數據包,並按照正常的處理流程處理

數據包經過br0處理後,下一步是通過br1轉發給C,br1要實現轉發,首先得獲取C的MAC地址,因此,在br1中加入允許arp數據包處理的流表:

sudo ovs-ofctl add-flow br1 table=0,arp,actions=normal #匹配br1中所有arp數據包,並按照正常的處理流程處理

當br1獲取到C的MAC地址後,會把數據包從網口wlx002f82818d37發出,需要添加相應的流表:

sudo ovs-ofctl add-flow br1 table=0,ip,ip_dst=192.168.0.0/24,actions=normal #匹配br1中目的地址為192.168.0.0/24網段的數據包,並按照正常的處理流程處理

至此,數據包從A到C的過程中B的流表配置完畢,數據包已經從網口wlx002f82818d37發出。在處理C的ICMP響應包時,只需要配類似的流表:

sudo ovs-ofctl add-flow br1 table=0,ip,ip_src=192.168.0.0/24,actions=normal #匹配br1中源地址為192.168.0.0/24網段的數據包,並按照正常的處理流程處理
sudo ovs-ofctl add-flow br0 table=0,ip,ip_dst=10.8.0.0/24,actions=normal #匹配br0中目的地址為10.8.0.0/24網段的數據包,並按照正常的處理流程處理

4.添加主機C中的流表

當主機A訪問主機C的apache2伺服器時,主機C的網口wlp3s會獲取到http請求數據包,我們此時希望將該數據包交給上層的apache2應用來處理,而不是轉發出去。為了實現這一功能,我們還是採用normal動作,按照Linux內核的正常處理流程,該數據包的目的地址是自己,所以內核會上交上層的應用處理數據包,指令如下:

sudo ovs-ofctl add-flow br0 table=0,ip,ip_dst=192.168.0.102,actions=normal #匹配目的地址為192.168.0.102(本地)的數據包,並按照正常的處理流程處理

同時,還應該加一條反向的流表,使得http響應數據包可以正常發出:

sudo ovs-ofctl add-flow br0 table=0,ip,ip_src=192.168.0.102,actions=normal #匹配源地址為192.168.0.102(本地)的數據包,並按照正常的處理流程處理

添加上述兩條流表後,會發現依然不能正常訪問,這是因為流表中沒有對arp數據包的處理項,導致主機C的網關無法獲取到主機C的MAC地址,因此需要添加一條針對arp數據包的流表:

sudo ovs-ofctl add-flow br0 table=0,arp,actions=normal #匹配br0中所有arp數據包,並按照正常的處理流程處理

至此,所有流表配置完成,主機A可以正常訪問主機C中的apache2伺服器,訪問結果如下圖所示:

正常訪問頁面

五、實驗結果

根據本次實驗可知,利用OVS軟體中的normal動作,可以實現轉發節點同時作為伺服器終端提供服務,同時,在轉發時合理使用normal動作,可以很大程度上兼容傳統的網路協議,而不需要人為配置相關協議的流表項進行處理。


感謝@柳玉兒


推薦閱讀:
相关文章