更新時間:2020-04-30 來源:黑馬程序員 瀏覽量:
場景背景與需求
某公司新買一臺服務(wù)器, 服務(wù)器資源(cpu,內(nèi)存,硬盤)比較多,并且有多個網(wǎng)卡。
運(yùn)維工程師為了節(jié)省資源,在服務(wù)器上搭建多個服務(wù),希望通過多個網(wǎng)卡實現(xiàn)流量分流。
但由于運(yùn)維工程師對網(wǎng)絡(luò)理解不夠深入,將服務(wù)器的多個網(wǎng)卡都配置了同一個網(wǎng)段。
最后的結(jié)果是并不能正常的訪問這多個服務(wù)。推薦了解黑馬程序員linux云計算+運(yùn)維開發(fā)培訓(xùn)課程。
場景分析
·網(wǎng)卡設(shè)置了IP地址后,會產(chǎn)生一個與IP地址同網(wǎng)段的路由條目, 并與當(dāng)前網(wǎng)卡名對應(yīng)。
·如果多個網(wǎng)卡設(shè)置同網(wǎng)段IP地址后,會產(chǎn)生多個同網(wǎng)段的路由條目,并與不同網(wǎng)卡名對應(yīng)。
假設(shè)兩個網(wǎng)卡eth0,eth1分別配置10.1.1.5/24與10.1.1.6/24. 則會產(chǎn)生以下路由
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進(jìn)來訪問不同的服務(wù)。進(jìn)來會從不同網(wǎng)卡進(jìn),但回去時就會都從eth0回去(因為路由會從上往下讀取,所以默認(rèn)只會讀上面一條)
測試實驗:
1、準(zhǔn)備一個虛擬機(jī)模擬服務(wù)器,開兩個網(wǎng)卡,都為同一個網(wǎng)絡(luò), 配置兩個同網(wǎng)段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、 用另一臺機(jī)器模擬客戶端,使用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協(xié)議原理, 訪問哪個IP它才會回應(yīng)mac地址。
·而現(xiàn)在的結(jié)果是mac地址都為10.1.1.5對應(yīng)的mac地址。
·這是因為linux系統(tǒng)內(nèi)核參數(shù)默認(rèn)做了設(shè)置,
訪問同臺機(jī)器的網(wǎng)卡IP,如果這個網(wǎng)卡掛了,另外一個同網(wǎng)段的網(wǎng)卡會幫助回應(yīng)。可以比喻成(張三,李四兩個網(wǎng)卡同一臺機(jī)器,就是一家人,找張三,張三回,找李四,也張三回)
3、在服務(wù)器上修改內(nèi)核參數(shù)
server# vim /etc/sysctl.conf # 添加以下參數(shù)
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 # 用此命令讓其生效
說明: 這幾個參數(shù)的目的就是把上面的一家人(張三又回應(yīng)張三也回應(yīng)李四)的情況變成了原本的arp情況(張三只能回張三,李四只能回李四)
4、再次客戶端測試
client# arp -d 10.1.1.5
client# arp -d 10.1.1.6
說明: arp -d可清除arp協(xié)議訪問的mac地址緩存。建議清除再測試
最終結(jié)果:
客戶端只能ping通10.1.1.5了, ping不通10.1.1.6了(這就對了,因為一臺機(jī)器雙網(wǎng)卡同網(wǎng)段會路由沖突)
這個實驗就驗證了場景中的情況:
服務(wù)器多網(wǎng)卡同網(wǎng)段,客戶端從不同網(wǎng)卡IP訪問進(jìn)來,卻都從第1個網(wǎng)卡回應(yīng)
如果修改內(nèi)核參數(shù),則客戶端只能訪問第一張網(wǎng)卡的服務(wù)。
場景解決方案
如果以上場景已經(jīng)發(fā)生,如何解決?
·將多網(wǎng)卡改成不同網(wǎng)段IP(這樣做可能項目要修改的工作量很大,很多配置要重配)
·通過策略路由來解決(不需要修改IP,只需要添加路由表將多個網(wǎng)卡流量分開)
策略路由的做法也非常簡單,在服務(wù)器上做以下操作。
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兩個路由表
兩個路由表里的規(guī)則為訪問10.1.1.5將由10.1.1.5回應(yīng),訪問10.1.1.6將由10.1.1.6回應(yīng)
場景總結(jié)與經(jīng)驗值
此解決方案主要是用到了linux上的多路由表功能。
工作中物理服務(wù)器與虛擬機(jī)有多網(wǎng)卡時都不要犯這種多網(wǎng)卡同網(wǎng)段的錯誤。
如果真的需要用到多服務(wù)隔離的話,可考慮虛擬化或容器化環(huán)境。
猜你喜歡
K8s控制器類型及演示[IT運(yùn)維培訓(xùn)]
2020-04-30Docker stack 一鍵編排Inmp【linux云計算+運(yùn)維開發(fā)】
2020-04-29CentOS7的Chrony系統(tǒng)時鐘如何同步?【linux云計算+運(yùn)維開發(fā)】
2020-04-2910分鐘創(chuàng)建阿里云容器服務(wù)kubernetes專有版?【IT運(yùn)維培訓(xùn)】
2020-04-29如何安裝配置Supervisor?【運(yùn)維培訓(xùn)】
2020-04-28Kubernetes是什么?Kubernetes網(wǎng)絡(luò)模型介紹
2020-04-04