【Linux伺服器雙IP配置】如何實現不同IP的雙網卡同時上網?

一、環境和知識預備

  我遇到問題的生產機器是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命令可以參照我之前寫的:

  //www.cnblogs.com/luozhuzhu/p/13405350.html

 

  好了,今日分享到此結束,咱們下期再會!謝謝大家的觀看!