跳至內容

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

5 分的閱讀內容
0

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

簡短說明

重要: 只有進階使用者才可使用第二個彈性網路介面。僅在無法使用單一網路介面時才使用此解決方案。

如果將次要網路介面新增至非 Amazon Linux EC2 執行個體,則可能會看到流量傳輸問題。這些問題的發生原因是次要網路介面將傳入流量透過主要網路介面路由。由於次要 IP 位址不屬於主要網路介面的 MAC 位址,因此次要介面無法運作。

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

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

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

注意: Amazon EC2 執行個體位於 AWS 雲端中,並非所有執行個體都能受益於使用多個介面。

您可能不需要第二個網路介面來增加網路輸送量。AWS 會根據執行個體類型和大小設定配額,而此組態會限制網路輸送量。如需詳細資訊,請參閱 Amazon EC2 執行個體類型。

您也可能不需要第二個網路介面來增加彈性 IP 位址。您不需要將 Elastic IP 位址新增至您的執行個體,因為大多數應用程式與 DNS 都能完美配合運作。例如,Apache 可以使用以名稱為基礎的虛擬主機。如需詳細資訊,請參閱 Apache 網站上的以名稱為基礎的虛擬主機支援。

對於以下作業系統,新增次要網路介面的步驟都有所不同:

  • Ubuntu 14.04
  • Ubuntu 16.04
  • Ubuntu 18.04、20.04 和 22.04
  • Debian 12 (不同子網路)

解決方法

注意: 下列解決方案中的步驟已在所列的 Linux 版本上測試過。修改組態的自訂設定,以根使用者許可執行下列步驟。透過 sudo -i 使用根使用者,或者使用 sudo 執行所有命令。

設定 Ubuntu 14.04 或 16.04

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

請完成下列步驟:

  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

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

    ip link set eth0 name ens4
    ip link set ens4 up
    ip link show ens4
  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

    注意: 將 172.31.21.115 取代為您的 IP 位址,172.31.16.1 取代為您的閘道。您的閘道必須是子網路中的第一個有效 IP 位址。
    下列命令是多個 IP 位址的範例:

    auto eth1
    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

    注意: 將 172.31.21.115 和 172.31.18.46 取代為您的 IP 位址,172.31.16.1 取代為您的閘道。

  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 範例會使用雙空格縮排。

請完成下列步驟:

  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
              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. 選擇執行個體,然後選取執行個體。
  3. 在網路索引標籤上,網路介面中,然後記下次要網路介面的子網路 ID。
  4. 開啟 Amazon VPC 主控台。
  5. 選擇子網路,然後記下該子網路 ID 所列的 IPv4 CIDR 範圍。
  6. 若要套用網路組態,請執行下列命令:
    netplan --debug apply

在不同子網路中使用次要 ENI 設定 Debian 12

Debian 12 預設使用 systemd-networkd 進行網路組態。當您將次要 ENI 放置在不同子網路時,必須建立包含基於來源之路由規則的政策路由表。如果沒有這些規則,來自次要介面的流量會使用主要介面的預設路由並失敗。

重要: 本節涵蓋不同子網路的組態。上述 Ubuntu 章節僅涵蓋相同子網路的組態。

請完成下列步驟:

  1. 確認 systemd-networkd 是使用中的網路服務:

    for SVC in networking systemd-networkd NetworkManager; do echo "${SVC}: $(systemctl is-active "${SVC}")"; done

    預期輸出:

    networking: inactive
    systemd-networkd: active
    NetworkManager: inactive

    如果 systemd-networkd 未啟用,請先啟用再繼續。

  2. 在使其持久化之前,先手動測試組態:

    IF=ens6
    IP=10.0.2.100
    CIDR=10.0.2.64/26
    GW=10.0.2.65
    TABLE=101
    
    
    sudo ip link set $IF up mtu 9001
    sudo ip addr add $IP/26 dev $IF
    
    
    sudo ip route add $CIDR dev $IF proto static src $IP table $TABLE
    sudo ip route add default via $GW dev $IF table $TABLE
    
    
    sudo ip rule add from $IP/32 lookup $TABLE priority $TABLE

    注意: 將 ens6 取代為您的次要介面名稱,10.0.2.100 取代為您的次要 ENI IP,10.0.2.64/26 取代為您的次要子網路 CIDR,10.0.2.65 取代為次要子網路的閘道。

  3. 確認次要介面透過自己的閘道路由:

    ip route get 8.8.8.8 from 10.0.2.100

    預期輸出:

    8.8.8.8 from 10.0.2.100 via 10.0.2.65 dev ens6 table 101 uid 0
        cache
  4. 如果測試成功,請移除暫時組態:

    sudo ip rule del from $IP/32 lookup $TABLE priority $TABLE
    sudo ip route flush table $TABLE
    sudo ip addr flush dev $IF
  5. 建立持久化的 systemd-networkd 組態檔:

    sudo touch /etc/systemd/network/60-ens6.network

    注意: 將 ens6 取代為您的次要介面名稱。

  6. 將下列內容新增至 60-ens6.network 檔案:

    [Match]
    Name=ens6
    
    
    [Link]
    MTUBytes=9001
    
    
    [Network]
    Address=10.0.2.100/26
    IPv6AcceptRA=no
    
    
    [Route]
    Destination=0.0.0.0/0
    Gateway=10.0.2.65
    Table=101
    
    
    [Route]
    Destination=10.0.2.64/26
    Scope=link
    PreferredSource=10.0.2.100
    Table=101
    
    
    [RoutingPolicyRule]
    From=10.0.2.100/32
    Table=101
    Priority=101

    注意: 將 ens6 取代為您的次要介面名稱,10.0.2.100/26 取代為您的次要 ENI IP 和 CIDR,10.0.2.65 取代為次要子網路的閘道,10.0.2.64/26 取代為您的次要子網路 CIDR。

  7. 重新載入網路組態:

    sudo networkctl reload && sudo networkctl reconfigure ens6

    注意: 將 ens6 取代為您的次要介面名稱。

  8. 將反向路徑篩選器設定為寬鬆模式,以允許次要介面上的傳入流量。檢查目前的值:

    sysctl net.ipv4.conf.all.rp_filter net.ipv4.conf.ens6.rp_filter

    如果任一值為 1,請使用下列各行建立或更新 /etc/sysctl.d/99-multihome.conf:

    net.ipv4.conf.all.rp_filter = 2
    net.ipv4.conf.default.rp_filter = 2

    套用變更:

    sudo sysctl --system

    注意: 設定 rp_filter=2 會啟用寬鬆模式。這允許在次要介面上到達的封包,即使回傳路徑使用不同的介面。

  9. 驗證每個介面是否都透過其自身的閘道路由。

    對於主要 ENI:

    ip route get 8.8.8.8 from 10.0.2.12

    預期輸出:

    8.8.8.8 from 10.0.2.12 via 10.0.2.1 dev ens5 uid 0
        cache

    對於次要 ENI:

    ip route get 8.8.8.8 from 10.0.2.100

    預期輸出:

    8.8.8.8 from 10.0.2.100 via 10.0.2.65 dev ens6 table 101 uid 0
        cache
  10. 重新啟動執行個體,然後重複步驟 9 中的驗證命令,以確認組態持久有效。

相關資訊

設定路由表

彈性網路介面

AWS 官方已更新 1 個月前