Linux各種虛擬網卡master/slave的疊加使用

很多年前的一個夏日炎熱的夜晚,我在一家銀行16攝氏度的機房蹲了2小時編寫一個功能:

  • eth0被bridge到br0,br0跑轉發流量,eth0跑管理流量。

這個問題並沒有想象的那麼簡單,不信你去試一下。

一般而言,當eth0被bridge或者被bonding了之後,它就成了slave,對外就不可見了。但是這真的很合理嗎?根本就不合理。

網卡就是一個轉發設備,哪來的業務邏輯?

Linux雖然實現了bridge,bonding,veth,vlan,macvlan,ipvlan,tun/tap等虛擬網卡,但不要過於神話Linux,有些事它就是做不到,或者非常麻煩。

下面是一個場景:

  • enp0s9是一個物理網卡。
  • enp0s9添加到了bond0;
  • bond0上被配置到了vlan123。

我的需求如下:

  • enp0s9裸物理網卡跑1.0.0.0/8的流量。
  • bond0裸bonding網卡跑2.0.0.0/8的流量。
  • bond0.123這個VLAN網卡跑3.0.0.0/8的流量。

是不是一個很直接的需求?能做到嗎?

 ifconfig enp0s9 down
 modprobe bonding
 echo +enp0s9 >/sys/class/net/bond0/bonding/slaves
 ifconfig bond0 2.2.2.1/8 up
 ifconfig enp0s9 1.1.1.1/8 up
 ip link add link bond0 name bond0.123 type vlan id 123
 ifconfig bond0.123 3.3.3.1/8 up

另外的一臺“對端”也一樣這麼配置。

你會發現,2.2.2.1/2.2.2.2之間的互通是OK的,3.3.3.1/3.3.3.2之間的互通也是OK,然而1.1.1.1/1.1.1.2之間的互通是很有問題的。

這也很容易理解,雖然VLAN 123和bond0在底層都是bond0,但是由於protocol字段可以很容易區分IPv4和802.1Q,所以兩個網段不會有任何衝突,然而bond0和enp0s9卻會衝突。

所有的問題都出在arp上。

雖然arp_ignore等參數可以按照請求的IP地址區分是否回覆ARP,但是 ARP請求的入口是不會變的。統一都是bond0!

OK,如果我們承認這一點,姑且就讓bond0來處理ARP(但實際上配置enp0s9來響應ARP),那麼數據通信則會被rp_filter阻斷! 畢竟數據包是enp0s9的master bond0收上去的啊!

於是就是各種沒完沒了,過了就忘的trick。

我相信很多人都遇到了這類需求,於是纔有了macvlan,ipvlan這種主動拆分隔離的虛擬網卡方案:

  • 把一塊物理的或虛擬的網卡分裂成多塊使用。

說白了,本文中enp0s9和bond0的同時並行使用,就是一個縱方向上的macvlan!哈哈。

我相信如果我把本文所遇到問題的解法寫出來,又是一篇長篇大論,這是我5,6年前的做法,那個時候經常寫這種,全在我這個blog裏,能找到很多trick式解決方案。

我不會再寫這些了,因爲這些方案不可持久,不可維護,除了炫耀 “百無一用的高超技巧” 之外,沒有任何意義,我也早已過了那個階段…


浙江溫州皮鞋溼,下雨進水不會胖。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章