适用于:✔️ Linux VM
注意
本文中引用的 CentOS 是 Linux 分发版,将达到生命周期结束(EOL)。 请相应地考虑使用和规划。 有关详细信息,请参阅 CentOS 生命周期指南。
本文介绍如何在运行最常见 Linux 分发版的 Azure Linux 虚拟机(VM)中配置多个虚拟网络接口。
总结
可以创建一个附加到它的多个网络接口的 Azure VM。 常见方案是具有用于前端和后端连接的不同子网,或者专用于监视或备份解决方案的网络。
本文提供了多个网络接口在基于以下示例方案的 Azure Linux VM 中工作所需的配置:
- VM 在同一子网中具有两个或多个网络接口。
- VM 在不同的子网中具有两个或多个网络接口,但在同一个虚拟网络(VNET) 中。
有关详细信息,请参阅以下屏幕截图:
在每个方案中,都可以从同一 VNET 中的任何 VM 测试连接。
重要
在具有两个以上的 NIC 的 VM 中,也可以遵循相同的过程。
向 Linux VM 添加多个网络接口时,必须创建路由规则。 这些规则使 VM 能够发送和接收属于特定网络接口的流量。 否则,无法正确处理流量。 例如,属于 eth1 的流量不能由定义的默认路由正确处理。
以下部分提供了两个网络接口在运行最常见 Linux 分发版的 Linux VM 中所需的配置。
注意
使用根权限运行以下部分中的所有命令(通过切换到根权限或使用 sudo
命令实用工具)。
在每个部分中,假设 VM 有两个具有以下设置的网络接口:
通过运行以下命令将两个路由表添加到 /etc/iproute2/rt_tables 文件(每个 NIC 需要一个条目):
sudo echo "200 eth0-rt" >> /etc/iproute2/rt_tables
sudo echo "201 eth1-rt" >> /etc/iproute2/rt_tables
如果将更多网络接口附加到 VM,请添加额外的路由表(例如 202 eth2-rt、 203 eth3-rt 等)。
请确保 /etc/sysconfig/network-scripts/ 目录中每个网络接口都存在配置文件。 可以根据 ifcfg-eth0 配置文件创建新的网络接口配置文件(修改DEVICE
行并从新文件中删除DHCP_HOSTNAME
和HWADDR
行)。 为此,请运行以下命令:
sudo cat /etc/sysconfig/network-scripts/ifcfg-eth0 > /etc/sysconfig/network-scripts/ifcfg-eth1
sudo sed -i 's/DEVICE=eth0/DEVICE=eth1/' /etc/sysconfig/network-scripts/ifcfg-eth1
sudo sed -i '/DHCP_HOSTNAME/d' /etc/sysconfig/network-scripts/ifcfg-eth1
sudo sed -i '/HWADDR/d' /etc/sysconfig/network-scripts/ifcfg-eth1
若要在网络堆栈激活期间持久更改并应用更改,请编辑文件 /etc/sysconfig/network-scripts/ifcfg-eth0 和 /etc/sysconfig/network-scripts/ifcfg-eth1(ifcfg-eth2、ifcfg-eth3 等),如果 VM 具有两个以上的网络接口,则更改yes
其值NM_CONTROLLED
。no
为此,请运行以下命令:
sudo cp -rp /etc/sysconfig/network-scripts/ifcfg-eth0 /tmp/ifcfg-eth0.bkp
sudo cp -rp /etc/sysconfig/network-scripts/ifcfg-eth1 /tmp/ifcfg-eth1.bkp
sudo sed -i 's/NM_CONTROLLED=yes/NM_CONTROLLED=no/' /etc/sysconfig/network-scripts/ifcfg-eth0
sudo sed -i 's/NM_CONTROLLED=yes/NM_CONTROLLED=no/' /etc/sysconfig/network-scripts/ifcfg-eth1
注意
使用cat /etc/sysconfig/network-scripts/ifcfg-eth*
命令验证该NM_CONTROLLED=no
行是否已添加到 /etc/sysconfig/network-scripts/ifcfg-eth0 和 /etc/sysconfig/network-scripts/ifcfg-eth1 文件。 如果行不在文件中,请使用 sudo echo "NM_CONTROLLED=no" >> /etc/sysconfig/network-scripts/ifcfg-eth0
和 sudo echo "NM_CONTROLLED=no" >> /etc/sysconfig/network-scripts/ifcfg-eth1
命令手动添加它。
修改此配置后,通过运行以下命令重启网络服务以应用更改:
sudo systemctl restart network
使用任何文本编辑器(在以下示例中使用 vi 编辑器)创建相应的规则和路由文件,并将相应的规则和路由添加到每个文件。 使用以下步骤为每个网络接口创建一组 rule-eth# 和 route-eth# 文件。 在每个步骤中相应地替换 IP 地址和子网信息。 如果有更多的网络接口,请使用相应的 IP 地址、网络和网关详细信息为每个接口创建相同的规则 eth# 和 route-eth# 文件集。
为 eth0 创建规则和路由:
若要为 eth0 创建规则文件,请打开文件 /etc/sysconfig/network-scripts/rule-eth0。
sudo vi /etc/sysconfig/network-scripts/rule-eth0
将以下内容添加到规则文件。 相应地替换 IP 地址,确保在配置中指定 IPv4 地址,并保留 32 位值:
from 10.0.1.4/32 table eth0-rt
to 10.0.1.4/32 table eth0-rt
若要为 eth0 创建路由文件,请打开文件 /etc/sysconfig/network-scripts/route-eth0。
sudo vi /etc/sysconfig/network-scripts/route-eth0
将以下内容添加到路由文件。 相应地替换网络和网关值。
10.0.1.0/24 dev eth0 table eth0-rt
default via 10.0.1.1 dev eth0 table eth0-rt
为 eth1 创建规则和路由:
若要为 eth1 创建规则文件,请打开文件 /etc/sysconfig/network-scripts/rule-eth1。
sudo vi /etc/sysconfig/network-scripts/rule-eth1
将以下内容添加到规则文件。 相应地替换 IP 地址,确保你在命令中指定 IPv4 地址,并保留 32 位值。
同一子网中的两个 NIC:
from 10.0.1.5/32 table eth1-rt
to 10.0.1.5/32 table eth1-rt
不同子网中的两个 NIC,但位于同一 VNET 中:
from 10.0.2.5/32 table eth1-rt
to 10.0.2.5/32 table eth1-rt
若要为 eth1 创建路由文件,请打开文件 /etc/sysconfig/network-scripts/route-eth1。
sudo vi /etc/sysconfig/network-scripts/route-eth1
将以下内容添加到路由文件。 相应地替换网络和网关值。
同一子网中的两个 NIC:
10.0.1.0/24 dev eth1 table eth1-rt
default via 10.0.1.1 dev eth1 table eth1-rt
不同子网中的两个 NIC,但位于同一 VNET 中:
10.0.2.0/24 dev eth1 table eth1-rt
default via 10.0.2.1 dev eth1 table eth1-rt
若要应用更改,请运行以下命令以重启网络服务:
sudo systemctl restart network
路由规则现在已正确设置,并且连接应从任何网络接口运行。 可以使用安全外壳(SSH)测试连接性,也可以从同一 VNET 中的 VM 中 ping 这两个 IP。
使用以下命令验证当前路由和规则是否已加载:
sudo ip route show
sudo ip rule show
重要
如果仍存在与第二个 NIC 通信的问题,请使用 sudo reboot
命令重启 VM,重复步骤 7,然后再次测试连接。
默认情况下,不会在 Red Hat Enterprise Linux(RHEL)/CentOS 8 中安装策略路由。x. 若要配置多个网络接口,请安装和启用策略路由。 为此,请运行以下命令:
sudo yum install NetworkManager-dispatcher-routing-rules -y
sudo systemctl enable NetworkManager-dispatcher.service
sudo systemctl start NetworkManager-dispatcher.service
在 RHEL/CentOS 8 中。x, NM_CONTROLLED
该设置默认设置为 yes
在每个网络配置文件(/etc/sysconfig/network-scripts/ifcfg-eth#) 中。 若要避免问题,请确保此设置未在特定的配置文件中设置为 no
。 此外,请确保为每个网络接口创建相应的网络配置文件。 下面是网络配置文件的示例配置:
/etc/sysconfig/network-scripts/ifcfg-eth0:
sudo cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=dhcp
TYPE=Ethernet
USERCTL=no
PEERDNS=yes
IPV6INIT=no
PERSISTENT_DHCLIENT=yes
/etc/sysconfig/network-scripts/ifcfg-eth1:
sudo cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
ONBOOT=yes
BOOTPROTO=dhcp
TYPE=Ethernet
USERCTL=no
PEERDNS=yes
IPV6INIT=no
PERSISTENT_DHCLIENT=yes
运行以下命令,将两个路由表添加到 /etc/iproute2/rt_tables 文件:
sudo echo "200 eth0-rt" >> /etc/iproute2/rt_tables
sudo echo "201 eth1-rt" >> /etc/iproute2/rt_tables
如果将更多网络接口附加到 VM,请添加额外的路由表(例如 202 eth2-rt、 203 eth3-rt 等)。
为每个 NIC 创建相应的规则和路由配置文件,并为每个 NIC 添加相应的规则和路由。 若要为每个网络接口创建一组 rule-eth# 和 route-eth# 文件,请执行以下步骤。 在每个步骤中相应地替换 IP 地址和子网信息。 如果有更多的网络接口,请使用相应的 IP 和子网详细信息为每个接口创建相同的 规则 eth# 和 route-eth# 文件集。
为 eth0 创建规则和路由:
通过运行以下命令为 eth0 创建规则文件:
sudo vi /etc/sysconfig/network-scripts/rule-eth0
将以下内容添加到规则文件。 相应地替换 IP 地址,并确保在命令中指定 IPv4 地址。
from 10.0.1.4/32 table eth0-rt
to 10.0.1.4/32 table eth0-rt
运行以下命令为 eth0 创建路由文件:
sudo vi /etc/sysconfig/network-scripts/route-eth0
将以下内容添加到路由文件:
10.0.1.0/24 dev eth0 table eth0-rt
default via 10.0.1.1 dev eth0 table eth0-rt
为 eth1 创建规则和路由:
运行以下命令为 eth1 创建规则文件:
sudo vi /etc/sysconfig/network-scripts/rule-eth1
将以下内容添加到规则文件。 相应地替换 IP 地址,确保你在命令中指定 IPv4 地址,并保留 32 位值。
同一子网中的两个 NIC:
from 10.0.1.5/32 table eth1-rt
to 10.0.1.5/32 table eth1-rt
不同子网中的两个 NIC,但位于同一 VNET 中:
from 10.0.2.5/32 table eth1-rt
to 10.0.2.5/32 table eth1-rt
运行以下命令为 eth1 创建路由文件:
sudo vi /etc/sysconfig/network-scripts/route-eth1
将以下内容添加到路由文件:
同一子网中的两个 NIC:
10.0.1.0/24 dev eth1 table eth1-rt
default via 10.0.1.1 dev eth1 table eth1-rt
不同子网中的两个 NIC,但位于同一 VNET 中:
10.0.2.0/24 dev eth1 table eth1-rt
default via 10.0.2.1 dev eth1 table eth1-rt
若要应用更改,请运行以下命令重启网络服务:
sudo systemctl restart NetworkManager
路由规则现在已正确设置,并且连接应从任何网络接口运行。 可以使用安全外壳(SSH)测试连接性,也可以从同一 VNET 中的 VM 中 ping 这两个 IP。
使用以下命令验证当前路由和规则是否已加载:
sudo ip route show
sudo ip rule show
重要
如果仍然没有连接到第二个 NIC,请使用 sudo reboot
命令重启 VM,重复步骤 6,然后再次测试连接。
运行以下命令, 将两个路由表添加到 /etc/iproute2/rt_tables 文件:
sudo echo "200 eth0-rt" >> /etc/iproute2/rt_tables
sudo echo "201 eth1-rt" >> /etc/iproute2/rt_tables
如果将更多网络接口附加到 VM,请添加额外的路由表(例如 202 eth2-rt、 203 eth3-rt 等)。
如果设置了 Cloud-Init 自动化(默认情况下,它在 Azure Ubuntu 映像中设置),请确保禁用网络 CI 自动化,以便 每次重新启动系统时都不会覆盖 /etc/netplan/50-cloud-init.yaml 文件。
使用以下命令和内容创建 /etc/cloud.cfg.d/99-disable-network-config.cfg 文件:
sudo vi /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
network:
config: disabled
使用任何文本编辑器修改 netplan 配置文件 /etc/netplan/50-cloud-init.yaml ,并为每个网络接口部分包含以下路由和策略路由块:
routes:
- to: <subnet>/24
via: <gatewayIP>
metric: 200
table: 201
- to: 0.0.0.0/0
via: <gatewayIP>
table: <routingTableID>
routing-policy:
- from: <NICIP>/32
table: <routingTableID>
- to: <NICIP>/32
table: <routingTableID>
相应地替换每个网络接口(eth0 和 eth1)的子网、MAC 地址和 IP 地址信息。 请确保块中 routing-policy
保留 32 位值。
下面是使用给定示例详细信息的示例配置文件:
sudo vi /etc/netplan/50-cloud-init.yaml
同一子网中的两个 NIC:
network:
ethernets:
eth0:
dhcp4: true
dhcp4-overrides:
route-metric: 100
dhcp6: false
match:
driver: hv_netvsc
macaddress: 00:0d:3a:9d:60:e6
set-name: eth0
routes:
- to: 10.0.1.0/24
via: 10.0.1.1
metric: 200
table: 200
- to: 0.0.0.0/0
via: 10.0.1.1
table: 200
routing-policy:
- from: 10.0.1.4/32
table: 200
- to: 10.0.1.4/32
table: 200
eth1:
dhcp4: true
dhcp4-overrides:
route-metric: 200
dhcp6: false
match:
driver: hv_netvsc
macaddress: 00:0d:3a:9a:25:5f
set-name: eth1
routes:
- to: 10.0.1.0/24
via: 10.0.1.1
metric: 200
table: 201
- to: 0.0.0.0/0
via: 10.0.1.1
table: 201
routing-policy:
- from: 10.0.1.5/32
table: 201
- to: 10.0.1.5/32
table: 201
version: 2
不同子网中的两个 NIC,但位于同一 VNET 中:
network:
ethernets:
eth0:
dhcp4: true
dhcp4-overrides:
route-metric: 100
dhcp6: false
match:
driver: hv_netvsc
macaddress: 00:0d:3a:9d:60:e6
set-name: eth0
routes:
- to: 10.0.1.0/24
via: 10.0.1.1
metric: 200
table: 200
- to: 0.0.0.0/0
via: 10.0.1.1
table: 200
routing-policy:
- from: 10.0.1.4/32
table: 200
- to: 10.0.1.4/32
table: 200
eth1:
dhcp4: true
dhcp4-overrides:
route-metric: 200
dhcp6: false
match:
driver: hv_netvsc
macaddress: 00:0x:3x:9x:03:5f
set-name: eth1
routes:
- to: 10.0.2.0/24
via: 10.0.2.1
metric: 200
table: 201
- to: 0.0.0.0/0
via: 10.0.2.1
table: 201
routing-policy:
- from: 10.0.2.5/32
table: 201
- to: 10.0.2.5/32
table: 201
version: 2
重要
如果使用上述任何配置文件示例,请确保相应地替换 MAC 地址值。 可以从命令的 ip a | grep ether | awk '{print $2}'
输出中获取相应的 NIC MAC 地址。
通过运行以下命令来应用更改:
sudo netplan apply
若要测试连接性,请 ping 或 SSH 来自同一 VNET 中另一个 VM 的两个 IP:
ping 10.0.1.4
ping 10.0.1.5
运行以下命令, 将两个路由表添加到 /etc/iproute2/rt_tables 文件:
sudo echo "200 eth0-rt" >> /etc/iproute2/rt_tables
sudo echo "201 eth1-rt" >> /etc/iproute2/rt_tables
如果将更多网络接口附加到 VM,请添加额外的路由表(例如 202 eth2-rt、 203 eth3-rt 等)。
使用任何文本编辑器创建具有 /etc/sysconfig/network/scripts/ 目录中每个网络接口的路由和规则的脚本(在以下命令中使用 vi 文本编辑器)。
/etc/sysconfig/network/scripts/ifup-route.eth0
sudo vi /etc/sysconfig/network/scripts/ifup-route.eth0
#!/bin/bash
/sbin/ip route add default via 10.0.1.1 dev eth0 table eth0-rt
/sbin/ip rule add from 10.0.1.4/32 table eth0-rt
/sbin/ip rule add to 10.0.1.4/32 table eth0-rt
/etc/sysconfig/network/scripts/ifup-route.eth1
sudo vi /etc/sysconfig/network/scripts/ifup-route.eth1
同一子网中的两个 NIC:
#!/bin/bash
/sbin/ip route add 10.0.1.0/24 dev eth1 table eth1-rt
/sbin/ip route add default via 10.0.1.1 dev eth1 table eth1-rt
/sbin/ip rule add from 10.0.1.5/32 table eth1-rt
/sbin/ip rule add to 10.0.1.5/32 table eth1-rt
不同子网中的两个 NIC,但位于同一 VNET 中:
#!/bin/bash
/sbin/ip route add 10.0.2.0/24 dev eth1 table eth1-rt
/sbin/ip route add default via 10.0.2.1 dev eth1 table eth1-rt
/sbin/ip rule add from 10.0.2.5/32 table eth1-rt
/sbin/ip rule add to 10.0.2.5/32 table eth1-rt
相应地调整网络和 IP 地址信息,并保留 32 位值。 如果存在两个以上的 NIC,请确保为每个 NIC 包含相应的 IP 规则和 IP 路由。
使用以下命令为这两个脚本提供执行权限:
sudo chmod +x /etc/sysconfig/network/scripts/ifup-route.eth0
sudo chmod +x /etc/sysconfig/network/scripts/ifup-route.eth1
使用任何文本编辑器修改 eth0 和 eth1(/etc/sysconfig/network/ifcfg-eth#)的网络配置文件,并在这两个文件中包含以下行以指向相应的脚本:
在网络配置文件 /etc/sysconfig/network/ifcfg-eth0 中:
POST_UP_SCRIPT='compat:suse:/etc/sysconfig/network/scripts/ifup-route.eth0'
在网络配置文件 /etc/sysconfig/network/ifcfg-eth1 中:
POST_UP_SCRIPT='compat:suse:/etc/sysconfig/network/scripts/ifup-route.eth1'
下面是两个配置文件的示例:
sudo cat /etc/sysconfig/network/ifcfg-eth0
BOOTPROTO='dhcp'
DHCLIENT6_MODE='managed'
MTU=''
REMOTE_IPADDR=''
STARTMODE='onboot'
CLOUD_NETCONFIG_MANAGE='yes'
POST_UP_SCRIPT='compat:suse:/etc/sysconfig/network/scripts/ifup-route.eth0'
sudo cat /etc/sysconfig/network/ifcfg-eth1
STARTMODE='hotplug'
BOOTPROTO='dhcp'
DHCLIENT_SET_DEFAULT_ROUTE='yes'
DHCLIENT_ROUTE_PRIORITY='10100'
CLOUD_NETCONFIG_MANAGE='yes'
POST_DOWN_SCRIPT='compat:suse:cloud-netconfig-cleanup'
POST_UP_SCRIPT='compat:suse:/etc/sysconfig/network/scripts/ifup-route.eth1'
如果 /etc/sysconfig/network/ifcfg-eth1 文件不存在,请使用 /etc/sysconfig/network/ifcfg-eth0 文件中的内容创建该文件。 请确保已调整为 POST_UP_SCRIPT
使用相应的脚本。 为此,请执行以下命令:
sudo cat /etc/sysconfig/network/ifcfg-eth0 > /etc/sysconfig/network/ifcfg-eth1
若要应用更改,请重启网络服务:
sudo systemctl restart network
路由规则现在已正确设置,并且连接应从任何网络接口运行。 可以使用安全外壳(SSH)测试连接性,也可以从同一 VNET 中的 VM 中 ping 这两个 IP。
使用以下命令验证当前路由和规则是否已加载:
sudo ip route show
sudo ip rule show
重要
如果仍然没有连接到第二个 NIC,请使用 sudo reboot
命令重启 VM,重复步骤 6,然后再次测试连接。
运行以下命令, 将两个路由表添加到 /etc/iproute2/rt_tables 文件:
sudo echo "200 eth0-rt" >> /etc/iproute2/rt_tables
sudo echo "201 eth1-rt" >> /etc/iproute2/rt_tables
如果将更多网络接口附加到 VM,请添加额外的路由表(例如 202 eth2-rt、 203 eth3-rt 等)。
使用任何文本编辑器创建或修改配置文件 /etc/network/interfaces.d/50-cloud-init 。
sudo vi /etc/network/interfaces.d/50-cloud-init
使用以下配置:
同一子网中的两个 NIC:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
metric 100
up /usr/sbin/ip route add default via 10.0.1.1 dev eth0 table eth0-rt
up /usr/sbin/ip rule add from 10.0.1.4/32 table eth0-rt
up /usr/sbin/ip rule add to 10.0.1.4/32 table eth0-rt
auto eth1
iface eth1 inet dhcp
metric 200
up /usr/sbin/ip route add 10.0.1.0/24 dev eth1 table eth1-rt
up /usr/sbin/ip route add default via 10.0.1.1 dev eth1 table eth1-rt
up /usr/sbin/ip rule add from 10.0.1.5/32 table eth1-rt
up /usr/sbin/ip rule add to 10.0.1.5/32 table eth1-rt
不同子网中的两个 NIC,但位于同一 VNET 中:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
metric 100
up /usr/sbin/ip route add default via 10.0.1.1 dev eth0 table eth0-rt
up /usr/sbin/ip rule add from 10.0.1.4/32 table eth0-rt
up /usr/sbin/ip rule add to 10.0.1.4/32 table eth0-rt
auto eth1
iface eth1 inet dhcp
metric 200
up /usr/sbin/ip route add 10.0.2.0/24 dev eth1 table eth1-rt
up /usr/sbin/ip route add default via 10.0.2.1 dev eth1 table eth1-rt
up /usr/sbin/ip rule add from 10.0.2.5/32 table eth1-rt
up /usr/sbin/ip rule add to 10.0.2.5/32 table eth1-rt
相应地调整网络和 IP 地址信息,并保留 32 位值。 如果存在两个以上的 NIC,请确保为每个 NIC 包含相应的 IP 规则和 IP 路由。
使用以下命令激活新配置:
sudo systemctl restart networking
路由规则现在已正确设置,并且连接应从任何网络接口运行。 可以使用安全外壳(SSH)测试连接性,也可以从同一 VNET 中的 VM 中 ping 这两个 IP。
使用以下命令验证当前路由和规则是否已加载:
sudo ip route show
sudo ip rule show
重要
如果仍然没有连接到第二个 NIC,请使用 sudo reboot
命令重启 VM,重复步骤 4,然后再次测试连接。
如果你有任何疑问或需要帮助,请创建支持请求或联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区。