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

3 分的閱讀內容
0

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

簡短說明

**警告:**只有進階使用者可以使用第二個彈性網路介面。只有在您無法使用單一網路介面,且必須將相同子網路的兩個網路介面附加至執行個體時,才能執行此操作。若要避免非對稱路由問題,請使用單一彈性網路介面,或將重複的彈性網路介面置於非重疊的子網路中。

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

若要在建立次要介面後使其正常運作,請執行下列操作:

1.    設定路由表。

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

在開始之前,請注意 Amazon EC2 執行個體位於 AWS 雲端。這表示並非所有使用案例都因擁有多個介面而受惠。下列範例會示範不需要使用次要網路介面的情況:

  • 增加網路輸送量: 由於限制是根據執行個體類型和大小設定的,因此網路輸送量不會增加。如需詳細資訊,請參閱 Amazon EC2 執行個體類型
  • 增加彈性 IP 地址: 如果每個介面的彈性 IP 地址很少,則您可能不需要新增更多介面即可獲得更多彈性 IP 地址。大多數應用程式都可以與網域名稱系統完美配合運作。例如,Apache 可以使用名稱型虛擬主機 (位於 Apache 網站)。

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

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

解決方法

**注意:**雖然下列解決方法中的步驟已經過列出的 Linux 版本測試,您可能需要稍微修改組態的自訂設定。

設定 Ubuntu 14.04 或 16.04

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

所有程序都必須使用根使用者權限執行。使用 sudo -i 成為根使用者,或者使用 sudo 執行所有命令。

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

2.    建立次要介面的組態檔案。在下列範例中,變更 eth1 以符合您在步驟 1 中找到的次要介面名稱:

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

下列命令是單一 IP 地址為 172.31.21.115,且次要介面上閘道為 172.31.16.1 的範例。將範例 IP 地址和閘道替換為您自己的 IP 地址和閘道。另請注意,您的閘道必須是子網路中的第一個有效 IP 地址:

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 地址為 172.31.21.115 和 172.31.18.46,閘道則為 172.31.16.1。將範例 IP 地址和閘道取替換您自己的 IP 地址和閘道:

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

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

vi /etc/dhcp/dhclient-enter-hooks.d/restrict-default-gw

4.    將以下幾行新增至 restrict-default-gw 檔案。請務必將 eth0 變更為您在步驟 1 中找到的主要介面名稱:

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

5.    重新啟動網路。

請參閱下列適用於 Ubuntu 14.04 的命令:

(ifdown eth1 && ifup eth1)

請參閱下列適用於 Ubuntu 16.04 的命令:

systemctl restart networking

設定 Ubuntu 18.04 和 20.04

Ubuntu 18.04 和 20.04 使用 Netplan 網路組態。請注意,Netplan 使用 YAML 格式。這表示縮排至關重要。下列 Netplan 範例會使用雙空格縮排。

**注意:**使用根使用者權限執行所有命令。使用 sudo -i 成為根使用者,或者使用 sudo 執行所有命令。

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 官方已更新 1 年前