一、環境和知識預備
我遇到問題的生產機器是CentOS release 6.8系統,不過這並不影響問題的解決,本質上都是一樣的。
閘道器:一個網路連線到另一個網路的關口,也就是實現網路互連,俗稱網路聯結器。
DNS:域名解析伺服器,是把網址變成IP地址的伺服器。
上網流程大致如下:
伺服器IP <--> 對應的閘道器 <--> 網路
也就是說閘道器作為一箇中介,如果沒有對應的閘道器,那麼是無法進行正確通訊、上網的。
二、問題介紹
一般我們在像運營商申請專線寬頻的時候,運營商都會提供【IP、閘道器、掩碼、DNS地址】這些基本的網路卡配置資訊。如果只有一張網路卡,那麼基本是沒有問題的,這也是很常見的一個配置步驟。
1、獲取網路卡名,底下表紅色的就是對應的網路卡名稱,打馬賽克的位置就是分配的公網地址(ipv4),inet表示ipv4地址,inet6表示ipv6的地址。
2、切換到/etc/sysconfig/network-scripts目錄下,把配置寫到對應的網路卡配置檔案中,檔名是【ifcfg-網路卡名稱】,我的這邊是ifcfg-em1。
3、修改配置如下:
1 DEVICE=ens33 #網路卡名稱 2 HWADDR=14:18:77:3B:6F:01 #MAC地址 3 TYPE=Ethernet #網路卡型別 4 UUID=314d1b96-70b2-498a-8711-6cb5ab264464 #唯一標識 5 ONBOOT=yes #開機啟用 6 BOOTPROTO=static #網路卡獲取IP地址的方式,一般有【none,dhcp,static】這些,dhcp是自動獲取IP的,其他都是固定的 7 IPADDR=100.196.184.188 #IP地址,如果BOOTPROTO=dhcp選擇動態獲取IP的話,那麼這裡就不需要配置IP。 8 GATEWAY=100.196.184.19 #預設閘道器地址!!! 9 NETMASK=255.255.255.248 #掩碼 10 DNS1=51.136.192.6 #預設主DNS地址 11 DNS2=50.196.165.2 #預設備DNS地址,後面可以繼續遞增列下去,DNS3,DNS4 12 NM_CONTROLLED=no #網路卡是否允許用 NetworkManager 程式管理,使用於非伺服器 13 MTU=9000 #網路上傳送的最大資料包
4、單網路卡情況下,你這麼一配置,重啟一下網路服務。【service network restart】或者【systemctl network restart】執行一下就可以了。
因為就一張網路卡,不管你配置的是全域性還是區域性,都能生效,沒有衝突問題。
如果有多張網路卡,那麼就會出現衝突問題了。衝突的原因是GATEWAY和DNS的配置,這兩個配置的表示預設的地址。多張網路卡的配置ifcfg-em1,ifcfg-em2,ifcfg-em3...,後面的配置就會把前面的配置直接進行覆蓋操作。啥意思呢?就是em1的閘道器是A,em2的閘道器是B,啟動的時候系統會去讀取這些配置檔案的資訊,載入em1的配置時,預設閘道器是A;接著,載入em2的配置時,預設閘道器變成了B。這樣A的IP就走不通了。
所以在有多個網路卡的情況,不應該只使用一個預設的閘道器來實現通訊,因為不同網路卡的閘道器不一樣會導致一部分網路卡由於閘道器不適用導致不能使用的情況。
三、問題解決
我們可以通過為每個網路卡配置單獨的規則來實現通訊,em1對應閘道器A,em2對應閘道器B,em3對應閘道器C...這樣每個網路卡都選擇正確自己的閘道器,就不會有預設閘道器帶來的衝突問題了。如何操作?請看下面:
首先要知道Linux攜帶了自己的路由配置的一些命令。
ip rule和ip route: ip rule是用來管理路由規則的,ip route是管理路由表的,底下是這兩個的一些引數配置,有興趣的可以看看,沒興趣的直接跳過下面這個程式碼段。
Usage: ip rule [ list | add | del | flush ] SELECTOR ACTION SELECTOR := [ not ] [ from PREFIX ] [ to PREFIX ] [ tos TOS ] [ fwmark FWMARK[/MASK] ] [ dev STRING ] [ pref NUMBER ] ACTION := [ table TABLE_ID ] [ realms [SRCREALM/]DSTREALM ] [ goto NUMBER ] TABLE_ID := [ local | main | default | NUMBER ] Usage: ip route { list | flush } SELECTOR ip route get ADDRESS [ from ADDRESS iif STRING ] [ oif STRING ] [ tos TOS ] ip route { add | del | change | append | replace | monitor } ROUTE SELECTOR := [ root PREFIX ] [ match PREFIX ] [ exact PREFIX ] [ table TABLE_ID ] [ proto RTPROTO ] [ type TYPE ] [ scope SCOPE ] ROUTE := NODE_SPEC [ INFO_SPEC ] NODE_SPEC := [ TYPE ] PREFIX [ tos TOS ] [ table TABLE_ID ] [ proto RTPROTO ] [ scope SCOPE ] [ metric METRIC ] INFO_SPEC := NH OPTIONS FLAGS [ nexthop NH ]... NH := [ via ADDRESS ] [ dev STRING ] [ weight NUMBER ] NHFLAGS OPTIONS := FLAGS [ mtu NUMBER ] [ advmss NUMBER ] [ rtt TIME ] [ rttvar TIME ] [reordering NUMBER ] [ window NUMBER] [ cwnd NUMBER ] [ initcwnd NUMBER ] [ ssthresh NUMBER ] [ realms REALM ] [ src ADDRESS ] [ rto_min TIME ] [ hoplimit NUMBER ] [ initrwnd NUMBER ] TYPE := [ unicast | local | broadcast | multicast | throw | unreachable | prohibit | blackhole | nat ] TABLE_ID := [ local | main | default | all | NUMBER ] SCOPE := [ host | link | global | NUMBER ] FLAGS := [ equalize ] MP_ALGO := { rr | drr | random | wrandom } NHFLAGS := [ onlink | pervasive ] RTPROTO := [ kernel | boot | static | NUMBER ] TIME := NUMBER[s|ms]
1、切換到/etc/sysconfig/network-scripts目錄下,把配置寫到對應的網路卡配置檔案中,檔名是【ifcfg-網路卡名稱】。
2、修改配置如下(不需要再配置GATEWAY):
if-ens33網路卡配置檔案
DEVICE=ens33 #網路卡名稱 HWADDR=14:18:77:3B:6F:01 #MAC地址 TYPE=Ethernet #網路卡型別 UUID=314d1b96-70b2-498a-8711-6cb5ab264464 #唯一標識 ONBOOT=yes #開機啟用 BOOTPROTO=static #網路卡獲取IP地址的方式,一般有【none,dhcp,static】這些,dhcp是自動獲取IP的,其他都是固定的 IPADDR=100.196.184.188 #IP地址,如果BOOTPROTO=dhcp選擇動態獲取IP的話,那麼這裡就不需要配置IP。 ####GATEWAY=100.196.184.19 #預設閘道器地址!!! NETMASK=255.255.255.248 #掩碼 DNS1=51.136.192.6 #預設主DNS地址 DNS2=50.196.165.2 #預設備DNS地址,後面可以繼續遞增列下去,DNS3,DNS4 NM_CONTROLLED=no #網路卡是否允許用 NetworkManager 程式管理,使用於非伺服器 MTU=9000 #網路上傳送的最大資料包
if-ens34網路卡配置檔案
DEVICE=ens33 #網路卡名稱
HWADDR=14:18:77:3B:6F:02 #MAC地址
TYPE=Ethernet #網路卡型別
UUID=314d1b96-70b2-498a-8711-6cb11b264464 #唯一標識
ONBOOT=yes #開機啟用
BOOTPROTO=static #網路卡獲取IP地址的方式,一般有【none,dhcp,static】這些,dhcp是自動獲取IP的,其他都是固定的
IPADDR=88.196.184.188 #IP地址,如果BOOTPROTO=dhcp選擇動態獲取IP的話,那麼這裡就不需要配置IP。
####GATEWAY=88.196.184.19 #預設閘道器地址!!!
NETMASK=255.255.255.248 #掩碼
DNS1=51.136.192.6 #預設主DNS地址
DNS2=50.196.165.2 #預設備DNS地址,後面可以繼續遞增列下去,DNS3,DNS4
NM_CONTROLLED=no #網路卡是否允許用 NetworkManager 程式管理,使用於非伺服器
MTU=9000 #網路上傳送的最大資料包
3、配置ens33的預設路由
【配置規則如下】:
ip rule add from 網路卡IP table 表數字
ip route add default via 閘道器 dev 網路卡名 table 表數字
配置ens33的路由規則(table後面的數字可以自己取,如果衝突系統會提示已存在,換一個不存在的就好,可以通過【ip rule show】命令檢視已配置的內容)
ip rule add from 100.196.184.188 table 1
配置ens33的路由表(可以通過【ip route show】命令檢視已配置的內容)
ip route add default via 100.196.184.19 dev ens33 table 1
4、配置ens34的預設路由
配置ens34的路由規則(table後面的數字可以自己取,如果衝突系統會提示已存在,換一個不存在的就好,可以通過【ip rule show】命令檢視已配置的內容)
ip rule add from 88.196.184.188 table 2
配置ens34的路由表(可以通過【ip route show】命令檢視已配置的內容)
ip route add default via 88.196.184.19 dev ens34 table 2
... 如果有多張繼續參照上訴步驟配置下去。
5、通過ping命令驗證
ping -I 網路卡名或者IP www.baidu.com
如果正常的話就是成功了,否則檢查一下配置。如果配置錯誤,可以通過對應的刪除命令清理規則,就是把命令的add改成del。比如:
ip rule add from 88.196.184.188 table 2
對應的刪除操作是:
ip rule del from 88.196.184.188 table 2
四、總結
這就是我今天一個解決這個問題的一個過程,就是把【網路卡使用預設的閘道器】修改成【網路卡自己使用單獨的一個路由規則】來實現多IP同時上網的問題。期間,可以通過tcpdump命令,traceroute命令等來協助問題排查。這些命令比較簡單就不介紹啦。tcpdump命令可以參照我之前寫的:
https://www.cnblogs.com/luozhuzhu/p/13405350.html
好了,今日分享到此結束,我們們下期再會!謝謝大家的觀看!