如何讓次要網路介面在 Ubuntu EC2 執行個體中運作?
我想讓我的次要網路介面在 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
**重要事項:**在此範例中,主要介面命名為 eth0、eth1 等。不過,對於支援增強型網路 (例如 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
相關資訊
相關內容
- 已提問 6 個月前lg...
- 已提問 6 個月前lg...
- 已提問 1 年前lg...
- 已提問 10 個月前lg...
- AWS 官方已更新 8 個月前