場景背景與需求
某公司新買一臺服務器, 服務器資源(cpu,內存,硬盤)比較多,並且有多個網卡。
運維工程師為了節省資源,在服務器上搭建多個服務,希望通過多個網卡實現流量分流。
但由於運維工程師對網絡理解不夠深入,將服務器的多個網卡都配置了同一個網段。
最後的結果是並不能正常的訪問這多個服務。
場景分析
- 網卡設置了IP地址後,會產生一個與IP地址同網段的路由條目, 並與當前網卡名對應。
- 如果多個網卡設置同網段IP地址後,會產生多個同網段的路由條目,並與不同網卡名對應。
假設兩個網卡eth0,eth1分別配置10.1.1.5/24與10.1.1.6/24. 則會產生以下路由
<code>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
/<code>
如果不同客戶端通過這兩個IP進來訪問不同的服務。進來會從不同網卡進,但回去時就會都從eth0回去(因為路由會從上往下讀取,所以默認只會讀上面一條)
測試實驗:
1, 準備一個虛擬機模擬服務器,開兩個網卡,都為同一個網絡, 配置兩個同網段IP。
<code>server#
ip
addr
|grep
eth
-A
1
eth0:
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:
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
/<code>
2, 用另一臺機器模擬客戶端,使用ping來訪問以上2個IP。
<code>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
/<code>
說明:
- 按照arp協議原理, 訪問哪個IP它才會回應mac地址。
- 而現在的結果是mac地址都為10.1.1.5對應的mac地址。
- 這是因為linux系統內核參數默認做了設置, 訪問同一機器的網卡IP,如果這個網卡掛了,另外一個同網段的網卡會幫助回應。可以比喻成(張三,李四兩個網卡同一臺機器,就是一家人,找張三,張三回,找李四,也張三回)
3,在服務器上修改內核參數
<code>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
/<code>
說明: 這幾個參數的目的就是把上面的一家人(張三又回應張三也回應李四)的情況變成了原本的arp情況(張三隻能回張三,李四隻能回李四)
4, 再次客戶端測試
<code>client
#arp
-d
10.1
.1
.5
client
#arp
-d
10.1
.1
.6
/<code>
說明: arp -d可清除arp協議訪問的mac地址緩存。建議清除再測試
最終結果:
客戶端只能ping通10.1.1.5了, ping不通10.1.1.6了(這就對了,
因為一臺機器雙網卡同網段會路由衝突)這個實驗就驗證了場景中的情況:
- 服務器多網卡同網段,客戶端從不同網卡IP訪問進來,卻都從第1個網卡回應
- 如果修改內核參數,則客戶端只能訪問第一張網卡的服務
場景解決方案
如果以上場景已經發生,如何解決?
- 將多網卡改成不同網段IP(這樣做可能項目要修改的工作量很大,很多配置要重配)
- 通過策略路由來解決(不需要修改IP,只需要添加路由表將多個網卡流量分開)
策略路由的做法也非常簡單,在服務器上做以下操作
<code>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
/<code>
說明:
- 增加了server1與server2兩個路由表
- 兩個路由表裡的規則為訪問10.1.1.5將由10.1.1.5回應,訪問10.1.1.6將由10.1.1.6回應
場景總結與經驗值
此解決方案主要是用到了linux上的多路由表功能。
工作中物理服務器與虛擬機有多網卡時都不要犯這種多網卡同網段的錯誤。
如果真的需要用到多服務隔離的話,可考慮虛擬化或容器化環境。
喜歡別忘了關注一下,更多學習文章日常更新。