如何讓次要網路介面在 Ubuntu EC2 執行個體中運作?

3 分的閱讀內容
0

我想讓我的次要網路介面在 Ubuntu Amazon Elastic Compute Cloud (Amazon EC2) 執行個體中運作。

簡短說明

**警告:**只有進階使用者才可使用第二個彈性網路介面。僅在下列使用案例中使用此解決方案: 您無法使用單一網路介面。您必須將同一子網路的兩個網路介面附加至一個執行個體。若要避免非對稱路由問題,請使用單一彈性網路介面,或將重複的彈性網路介面置於非重疊的子網路中。或者,使用 Ubuntu 24.04 LTS 或更新版本。

新增次要網路介面至非 Amazon Linux EC2 執行個體會導致流量問題。之所以發生這些問題,是因為主要和次要網路介面位於相同的子網路中,且有一個路由表與一個閘道。進入次要網路介面的流量使用主要網路介面離開執行個體。由於次要 IP 位址不屬於主要網路介面的 MAC 位址,因此次要介面無法運作。

**注意:**Ubuntu 24.04 不需要下列步驟。Ubuntu 24.04 會自動處理此進階組態。

若要在建立次要介面後使其正常運作,請完成下列步驟:

  1. 設定路由表。
  2. 在自訂路由表政策資料庫中設定規則,以便次要介面的流量使用新的路由表。

開始之前,請注意,Amazon EC2 執行個體位於 AWS 雲端,因此並非所有使用案例都能從擁有多個介面受益。下列範例顯示您可能不需要使用次要網路介面的情況:

  • 若要增加網路輸送量: 由於限制是根據執行個體類型和大小設定的,因此網路輸送量不會增加。如需詳細資訊,請參閱 Amazon EC2 執行個體類型
  • 若要增加彈性 IP 位址: 您不需要將 Elastic IP 位址新增至您的執行個體,因為大多數應用程式與 DNS 都能完美配合運作。例如,Apache 可以使用以名稱為基礎的虛擬主機。如需詳細資訊,請參閱 Apache 網站上的以名稱為基礎的虛擬主機支援

**注意:**對於以下每個 Ubuntu 版本,新增次要網路介面的步驟都有所不同:

  • Ubuntu 14.04
  • Ubuntu 16.04
  • Ubuntu 18.04
  • Ubuntu 20.04
  • Ubuntu 22.04

解決方法

**注意:**雖然下列解決方法中的步驟已經過列出的 Linux 版本測試,但您可能需要修改組態的自訂設定。所有程序都必須使用根使用者權限執行。使用 sudo -i 成為根使用者,或者使用 sudo 執行所有命令。

設定 Ubuntu 14.04 或 16.04

您可以使用單一檔案建立次要介面組態檔案、設定路由表,然後為 Ubuntu 設定路由政策規則。

若要設定 Ubuntu 14.04 或 16.04,請完成下列步驟:

  1. 若要取得主要網路介面的名稱,請執行下列命令:

    ip a | grep ^[[:digit:]]

    您會收到類似下列訊息的輸出:

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc pfifo_fast state UP group default qlen 1000
    3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000

    **重要事項:**在上述範例中,主要介面命名為 eth0eth1 等。不過,對於支援增強型網路 (例如 m4 和 m5 系列類型) 的執行個體,您可能會看到命名不一致的情況。例如,如果次要介面命名名為 eth0,則主要介面可能會命名為 ens3。當您在執行個體執行時新增次要介面,就會發生這種命名不一致的情況。為避免命名不一致,請在啟動時新增介面或重新啟動執行個體。或者,如果介面正在執行中,請使用下列命令變更名稱:

    ip link set eth0 name ens4
    ip link set ens4 up
    ip link show ens4 --->verify
  2. 建立次要介面的組態檔案:

    vi /etc/network/interfaces.d/51-eth1.cfg

    **注意:**變更 eth1 以符合次要介面名稱。

    下列命令是單一 IP 位址為 172.31.21.115 次要介面上的閘道為 172.31.16.1 的範例:

    auto eth1  
    iface eth1 inet static address 172.31.21.115  
    netmask 255.255.240.0
    
    # Gateway configuration
    up ip route add default via 172.31.16.1 dev eth1 table 1000
    
    # Routes and rules
    up ip route add 172.31.21.115 dev eth1 table 1000
    up ip rule add from 172.31.21.115 lookup 1000

    注意: 將範例 IP 位址和閘道取代為您自己的資訊。您的閘道必須是子網路中的第一個有效 IP 位址。

    下列命令是多個 IP 位址的範例。在此範例中,IP 位址為 172.31.21.115172.31.18.46,閘道為 172.31.16.1

    auto eth1
    # Enter one or more IP settings
    iface eth1 inet static
    address 172.31.21.115
    netmask 255.255.240.0
    
    iface eth1 inet static
    address 172.31.18.46
    netmask 255.255.240.0
    
    # Default gateway for eth1
    up ip route add default via 172.31.16.1 dev eth1 table 1000
    
    # A route for every IP
    up ip route add 172.31.21.115 dev eth1 table 1000
    up ip route add 172.31.18.46 dev eth1 table 1000
    
    # A policy rule for every IP
    up ip rule add from 172.31.21.115 lookup 1000
    up ip rule add from 172.31.18.46 lookup 1000

    注意: 將範例 IP 位址和閘道取取代為您自己的資訊。

  3. 建立 restrict-default-gw 檔案,以防止主路由表上的預設閘道遭到覆寫:

    vi /etc/dhcp/dhclient-enter-hooks.d/restrict-default-gw
  4. 將以下幾行新增至 restrict-default-gw 檔案:

    case ${interface} in  eth0)    ;;  *)
        unset new_routers
        ;;
    esac

    注意:eth0 取代為您的主要介面名稱。

  5. 重新啟動網路。

    對於 Ubuntu 14.04,請執行下列命令:

    (ifdown eth1 && ifup eth1)

    對於 Ubuntu 16.04,請執行下列命令:

    systemctl restart networking

設定 Ubuntu 18.04、20.04 和 22.04

Ubuntu 18.04、20.04 和 22.04 使用 Netplan 網路組態。請注意,Netplan 使用 YAML 格式。此 YAML 格式意味著縮排很關鍵。下列 Netplan 範例會使用雙空格縮排。

若要設定 Ubuntu 18.04、20.04 和 22.04,請完成下列步驟:

  1. 建立次要介面的組態檔案:

    vi /etc/netplan/51-eth1.yaml
  2. 將以下幾行新增至 51-eth1.yaml 檔案:

    network:  version: 2  renderer: networkd    
     ethernets:
        eth1:
          addresses:
           - 172.31.24.153/20
           - 172.31.28.195/20
          dhcp4: no
          routes:
           - to: 0.0.0.0/0
             via: 172.31.16.1 # Default gateway
             table: 1000
           - to: 172.31.24.153
             via: 0.0.0.0
             scope: link
             table: 1000
           - to: 172.31.28.195
             via: 0.0.0.0
             scope: link
             table: 1000
          routing-policy:
            - from: 172.31.24.153
              table: 1000
            - from: 172.31.28.195
              table: 1000

    **注意:**將上述範例資訊取代為您的使用案例特定資訊。上述範例 YAML 檔案會在次要介面 eth1 上設定兩個 IP 位址。

若要尋找要在 YAML 檔案中使用的 CIDR 範圍,請完成下列步驟:

  1. 開啟 Amazon EC2 主控台,選取執行個體,然後選取相關執行個體。
  2. 網路索引標籤上,捲動至網路介面,然後記下次要網路介面的子網路 ID。
  3. 開啟 Amazon Virtual Private Cloud (Amazon VPC) 主控台,選取子網路,然後記下為子網路 ID 列出的 IPv4 CIDR 範圍。
  4. 若要套用網路組態,請執行下列命令:
    netplan --debug apply

相關資訊

設定路由表

AWS 官方
AWS 官方已更新 3 個月前