服務器多網卡多路由策略

場景背景與需求

某公司新買一臺服務器, 服務器資源(cpu,內存,硬盤)比較多,並且有多個網卡。

運維工程師爲了節省資源,在服務器上搭建多個服務,希望通過多個網卡實現流量分流。

但由於運維工程師對網絡理解不夠深入,將服務器的多個網卡都配置了同一個網段。

最後的結果是並不能正常的訪問這多個服務。

場景分析

  • 網卡設置了IP地址後,會產生一個與IP地址同網段的路由條目, 並與當前網卡名對應。
  • 如果多個網卡設置同網段IP地址後,會產生多個同網段的路由條目,並與不同網卡名對應。

假設兩個網卡eth0,eth1分別配置10.1.1.5/24與10.1.1.6/24. 則會產生以下路由

10.1.1.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0
10.1.1.0        0.0.0.0         255.255.255.0   U     0      0        0 eth1

如果不同客戶端通過這兩個IP進來訪問不同的服務。進來會從不同網卡進,但回去時就會都從eth0回去(因爲路由會從上往下讀取,所以默認只會讀上面一條)

測試實驗:

1, 準備一個虛擬機模擬服務器,開兩個網卡,都爲同一個網絡, 配置兩個同網段IP。

server# ip addr |grep eth -A 1
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:41:e4:22 brd ff:ff:ff:ff:ff:ff
    inet 10.1.1.5/24 brd 10.1.1.255 scope global br0
eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:39:c0:e6 brd ff:ff:ff:ff:ff:ff
    inet 10.1.1.6/24 brd 10.1.1.255 scope global eth1

2, 用另一臺機器模擬客戶端,使用ping來訪問以上2個IP。

client# ip neigh |grep -E "^10.1.1.5 |^10.1.1.6 "
10.1.1.5 dev eth0 lladdr 52:54:00:41:e4:22 REACHABLE
10.1.1.6 dev eth0 lladdr 52:54:00:41:e4:22 REACHABLE

說明:

  • 按照arp協議原理, 訪問哪個IP它纔會迴應mac地址。
  • 而現在的結果是mac地址都爲10.1.1.5對應的mac地址。
  • 這是因爲linux系統內核參數默認做了設置, 訪問同臺機器的網卡IP,如果這個網卡掛了,另外一個同網段的網卡會幫助迴應。可以比喻成(張三,李四兩個網卡同一臺機器,就是一家人,找張三,張三回,找李四,也張三回)

3,在服務器上修改內核參數

server# vim /etc/sysctl.conf                # 添加以下參數
net.ipv4.conf.eth0.arp_ignore = 1       
net.ipv4.conf.eth0.arp_announce = 2
net.ipv4.conf.eth1.arp_ignore = 1       
net.ipv4.conf.eth1.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

server# sysctl -p                           # 用此命令讓其生效

說明: 這幾個參數的目的就是把上面的一家人(張三又迴應張三也迴應李四)的情況變成了原本的arp情況(張三隻能回張三,李四隻能回李四)

4, 再次客戶端測試

client# arp -d 10.1.1.5
client# arp -d 10.1.1.6

說明: arp -d可清除arp協議訪問的mac地址緩存。建議清除再測試

最終結果:

客戶端只能ping通10.1.1.5了, ping不通10.1.1.6了(這就對了,因爲一臺機器雙網卡同網段會路由衝突

這個實驗就驗證了場景中的情況:

  • 服務器多網卡同網段,客戶端從不同網卡IP訪問進來,卻都從第1個網卡迴應
  • 如果修改內核參數,則客戶端只能訪問第一張網卡的服務

場景解決方案

如果以上場景已經發生,如何解決?

  • 將多網卡改成不同網段IP(這樣做可能項目要修改的工作量很大,很多配置要重配)
  • 通過策略路由來解決(不需要修改IP,只需要添加路由表將多個網卡流量分開)

策略路由的做法也非常簡單,在服務器上做以下操作

server# echo 100 server1 >> /etc/iproute2/rt_tables 
server# echo 200 server2 >> /etc/iproute2/rt_tables 

server# ip rule add from 10.1.1.5 table server1
server# ip rule add from 10.1.1.6 table server2

server# ip route add default via 10.1.1.5 table server1
server# ip route add default via 10.1.1.6 table server2

說明:

  • 增加了server1與server2兩個路由表
  • 兩個路由表裏的規則爲訪問10.1.1.5將由10.1.1.5迴應,訪問10.1.1.6將由10.1.1.6迴應

場景總結與經驗值

此解決方案主要是用到了linux上的多路由表功能。

工作中物理服務器與虛擬機有多網卡時都不要犯這種多網卡同網段的錯誤。

如果真的需要用到多服務隔離的話,可考慮虛擬化或容器化環境。

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