題 在Unix / Linux操作系統中有2個網絡接口連接到同一網絡時會發生什麼?


如果您有2個網絡接口到默認網關/路由器所在的同一網絡,會發生什麼?

例如

  • 網絡接口e1000g0 - 192.168.1.50
  • 網絡接口e1000g1 - 192.168.1.51
  • 網關 - 192.168.1.1

如果我發送一個數據包 8.8.8.8,將使用哪個網絡接口? 我正在使用Solaris 10機箱。但是假設這個問題適用於所有unix / linux的一般實現

在我的路由表中,似乎如此 e1000g1 被選為UG,但為什麼/如何選擇?


2
2017-11-08 18:32


起源


請注意,此處的所有答案都應假設子網大小(a.k.a。,“前綴長度”,a.k.a。“子網掩碼”)相同。如果它們不相同,答案很簡單:假定子網規模較小的規則更具體,並且對於流向該較小子網的流量具有完全優先級。 - TOOGAM


答案:


在Linux和Unix中,每個路由表只能有一個網關。在Linux上,您可以擁有多個路由表,但每個路由表都有一個網關。

在Linux中,它被標識如下:

    > ip route show
      default via 192.168.73.1 dev eth0  proto static 
      192.168.73.0/24 dev eth0  proto kernel  scope link  src 192.168.73.75  metric 1 

關鍵是從一開始 default,它說(我的)網關是 192.168.73.1。你改變如下:

     > ip route del default
     > ip route add default via 192.168.73.1 dev eth0

如果我連接了多個接口,我的路由表將如下所示:

     > ip route show
       default via 192.168.73.1 dev eth0  proto static 
       192.168.73.0/24 dev eth0  proto kernel  scope link  src 192.168.73.75  metric 1 
       192.168.73.0/24 dev wlan0  proto kernel  scope link  src 192.168.73.66  metric 9 

正如您所看到的,本地流量可以通過 eth0要么 wlan0但是,由於規模較小 metric 值(1對9)將被路由到 eth0

WAN流量將 一定 通過 eth0 因為默認網關已打開 dev eth0

這些值由您自動維護 network manager 默認情況下,有利於wifi連接。但是,你可以通過類似於以前的命令來覆蓋它的選擇,

       > ip route delete default
       > ip route add default via 192.168.73.1 dev wlan0

如果您有多個相同類型的接口(例如 多個以太網連接)然後優先級轉到首先連接的接口。

默認網關是由網絡本身識別的:它是協商DHCP轉換時傳遞給您的機器的參數之一(其他是網絡掩碼,網絡,廣播地址)。您沒有意識到這一點,因為DHCP的過程由您處理 network-manager。有時,您可能希望設置靜態IP地址  使用DHCP;在這種情況下,您必須自己提供上述四個參數。即使在對您來說很新的網絡中,也有學習這些參數的技術,但通常只在您已經熟悉的LAN中設置靜態地址。

除了LAN和默認網關路由之外,您還可以通過任一接口獲得特定路由。在這種情況下,路線的優先順序是根據原則確定的 最具體的路線首先。假設你有一條路線 1.1.1.0/24 通 wlan0。然後,當我們需要路由數據包時,比方說, 1.1.1.1,這個規則(通過wlan0)和默認規則(通過eth0)都適用,但第一個更具體,因此這些數據包將通過 wlan0。在這種情況下,當所有其他方法都失敗時,dafult網關成為路由,  當沒有其他路線適用時。

在Linux中,您可以擁有多個路由表,這稱為 policy or source routing。在這種情況下,您還需要一個內核規則來區分何時應用多個路由表。您可以找到策略路由的簡要介紹 這裡。在這種情況下,上述命令保持相同,除了它們之後是您希望處理的路由表的名稱,例如:

       > ip route show table main
       > ip route show table MyOtherRoutingTable

您會發現經常引用netstat,route,ifconfig等命令。在Linux中(但不是在Unix上,請閱讀下面的頂部評論) 過時的。當前命令, IP 的 iproute2的 套件,替代所有這些,以及更多。通過谷歌搜索 linux ip cheat sheet 你可以找到比較能力的網站 ip 和以前的工具。

編輯 

在Unix上,上面的命令是:您將路由表查詢為

   >  netstat -rn -f inet
      Routing tables

      Internet:
      Destination        Gateway            Flags        Refs      Use   Netif Expire
      default            192.168.11.1       UGSc           10        0     en0
      127                127.0.0.1          UCS             0        0     lo0
      127.0.0.1          127.0.0.1          UH              2   161444     lo0
      169.254            link#4             UCS             1        0     en0
      169.254.10.9       10:c3:7b:9d:c8:78  UHLSW           0        0     en0
      192.168.11         link#4             UCS             4        0     en0
      192.168.11.1       10:6f:3f:25:c6:33  UHLWIir        11     4589     en0   1162
      192.168.11.56      88:53:2e:10:77:5f  UHLWI           0        0     en0   1187
      192.168.11.65      2:f:b5:70:5b:22    UHLWI           0        0     en0   1081
      192.168.11.67      127.0.0.1          UHS             0        0     lo0
      192.168.11.113     6:20:3e:52:16:4d   UHLWIi          2      278     en0   1188

這裡的網關是由 default 關鍵字,並由 G 旗。

您將默認網關更改為:

   > route delete default
   > route add default 192.168.0.1
   > route change default -interface enp0s3

每個評論都保持不變,除了那些 policy routing,Unix內核不支持。


3
2017-11-08 19:35



我們要小心調用netstat / route / ifconfig過時。您可以在Linux上使用這些語句,但絕對不是Unix。 iproute2受到某些Unix系統無法容忍的許可的阻礙,因此一些非Linux系統永遠不會採用它。實際上,它甚至還有一個Solaris標籤。由於Linux和Unix都清楚地表達了這個問題,因此關於傳統命令過時的陳述並不適用於該問題適用的所有平台。 - TOOGAM
@TOOGAM Unix(標準)沒有指定netstat / route / ifconfig,因此每個Unix實現者都可以隨意提供任何一組命令來配置網絡。 Solaris工程重寫了Solaris 11中的大部分網絡堆棧,並棄用了一些上述命令,取而代之的是dladm,ipadm,netcfg等。 - jlliagre


在您的問題中連接到同一子網(如e1000g0和e1000g1)的同一OS實例上有兩個活動的不同物理接口是不可靠的,至少在Solaris上顯然不支持:

在多個接口連接到同一子網的系統上,必須先將接口配置為IPMP組。否則,系統不能是多宿主主機。 

如上所述,使這種可靠工作的一種方法是啟用ipmp(IP多路徑)。您還可以禁用數據包轉發並配置已記錄的靜態路由 這裡 對於Solaris 10。

或者,您也可以在Linux術語中使用較低級別的鏈接聚合,a.k.a。接口綁定。


1
2017-11-09 08:39



您可以在Solaris的同一子網上擁有多個接口,但不建議使用 - 使用IPMP,或者創建鏈接聚合將是首選。你只需要確保這一點 local-mac-address?=true。 - sleepyweasel
@sleepyweasel我明確提到了IPMP,鏈接聚合確實是一種類似的支持方法。 OP顯然不屬於這兩種情況,所以我的陳述仍然適用。 local-mac-address?=true 是前面提到的設置的先決條件,但在這些情況之外,我仍然認為這樣的配置不可靠且不受支持。 - jlliagre


我認為該消息將通過默認路由條目中配置的接口發送。可能是最後一個成了起來的。


-1
2017-11-08 19:09



好吧,在IP路由的情況下,將始終選擇路由,因為它是具有最低度量的該地址的最具體(最長掩碼)。 - Frank Thomas