我正在尝试让一台服务器运行 2 个网卡。一个网卡将具有动态 ip(DHCP),另一个网卡将具有静态 ip 192.168.0.24
。我在这个服务器上有 2 个网卡,1GB(enp4s0)和 10GB(enp5s0)
我当前全新安装的操作系统:
oven@oven-f1:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.5 LTS
Release: 22.04
Codename: jammy
此 netplan 是使用默认网络配置全新安装操作系统时附带的默认 netplan:
oven@oven-f1:~$ sudo cat /etc/netplan/50-cloud-init.yaml
# This file is generated from information provided by the datasource. Changes
# to it will not persist across an instance reboot. To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
ethernets:
enp4s0:
dhcp4: true
version: 2
wifis: {}
此 netplan 的网卡状态:
oven@oven-f1:~$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether d8:43:ae:90:b8:2e brd ff:ff:ff:ff:ff:ff
3: enp5s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 74:fe:ce:ea:db:b5 brd ff:ff:ff:ff:ff:ff
此 netplan 配置的默认路由:
oven@oven-f1:~$ ip route
default via 192.168.0.1 dev enp4s0 proto dhcp src 192.168.0.27 metric 100
192.168.0.0/24 dev enp4s0 proto kernel scope link src 192.168.0.27 metric 100
192.168.0.1 dev enp4s0 proto dhcp scope link src 192.168.0.27 metric 100
以下是我尝试实现的新 netplan 配置:
network:
version: 2
renderer: networkd
ethernets:
enp4s0:
dhcp4: true
enp5s0:
dhcp4: true
addresses:
- 192.168.0.24/24
routes:
- to: 0.0.0.0/0
via: 192.168.0.1
nameservers:
addresses: [8.8.8.8, 8.8.4.4]
问题是,一旦我sudo netplan --debug apply
使用新配置运行:
oven@oven-f1:~$ sudo netplan --debug apply
** (generate:1778): DEBUG: 07:51:08.869: starting new processing pass
** (generate:1778): DEBUG: 07:51:08.869: enp5s0: adding new route
** (generate:1778): DEBUG: 07:51:08.869: starting new processing pass
** (generate:1778): DEBUG: 07:51:08.869: We have some netdefs, pass them through a final round of validation
** (generate:1778): DEBUG: 07:51:08.869: enp4s0: setting default backend to 1
** (generate:1778): DEBUG: 07:51:08.869: Configuration is valid
** (generate:1778): DEBUG: 07:51:08.869: enp5s0: setting default backend to 1
** (generate:1778): DEBUG: 07:51:08.869: Configuration is valid
** (generate:1778): DEBUG: 07:51:08.869: Generating output files..
** (generate:1778): DEBUG: 07:51:08.869: Open vSwitch: definition enp4s0 is not for us (backend 1)
** (generate:1778): DEBUG: 07:51:08.869: NetworkManager: definition enp4s0 is not for us (backend 1)
** (generate:1778): DEBUG: 07:51:08.869: Open vSwitch: definition enp5s0 is not for us (backend 1)
** (generate:1778): DEBUG: 07:51:08.869: NetworkManager: definition enp5s0 is not for us (backend 1)
** (process:1776): DEBUG: 07:51:09.042: starting new processing pass
** (process:1776): DEBUG: 07:51:09.042: enp5s0: adding new route
** (process:1776): DEBUG: 07:51:09.042: starting new processing pass
** (process:1776): DEBUG: 07:51:09.042: We have some netdefs, pass them through a final round of validation
** (process:1776): DEBUG: 07:51:09.042: enp4s0: setting default backend to 1
** (process:1776): DEBUG: 07:51:09.042: Configuration is valid
** (process:1776): DEBUG: 07:51:09.042: enp5s0: setting default backend to 1
** (process:1776): DEBUG: 07:51:09.042: Configuration is valid
** (process:1776): DEBUG: 07:51:09.128: starting new processing pass
** (process:1776): DEBUG: 07:51:09.128: enp5s0: adding new route
** (process:1776): DEBUG: 07:51:09.128: starting new processing pass
** (process:1776): DEBUG: 07:51:09.128: We have some netdefs, pass them through a final round of validation
** (process:1776): DEBUG: 07:51:09.128: enp4s0: setting default backend to 1
** (process:1776): DEBUG: 07:51:09.128: Configuration is valid
** (process:1776): DEBUG: 07:51:09.128: enp5s0: setting default backend to 1
** (process:1776): DEBUG: 07:51:09.128: Configuration is valid
** (process:1776): DEBUG: 07:51:09.128: starting new processing pass
** (process:1776): DEBUG: 07:51:09.128: enp5s0: adding new route
** (process:1776): DEBUG: 07:51:09.128: starting new processing pass
** (process:1776): DEBUG: 07:51:09.128: We have some netdefs, pass them through a final round of validation
** (process:1776): DEBUG: 07:51:09.128: enp4s0: setting default backend to 1
** (process:1776): DEBUG: 07:51:09.128: Configuration is valid
** (process:1776): DEBUG: 07:51:09.128: enp5s0: setting default backend to 1
** (process:1776): DEBUG: 07:51:09.128: Configuration is valid
此新 netplan 的网卡状态:
oven@oven-f1:~$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether d8:43:ae:90:b8:2e brd ff:ff:ff:ff:ff:ff
3: enp5s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 74:fe:ce:ea:db:b5 brd ff:ff:ff:ff:ff:ff
使用此新 netplan 配置的默认路由:
oven@oven-f1:~$ ip route
default via 192.168.0.1 dev enp5s0 proto static
default via 192.168.0.1 dev enp4s0 proto dhcp src 192.168.0.27 metric 100
192.168.0.0/24 dev enp5s0 proto kernel scope link src 192.168.0.24
192.168.0.0/24 dev enp4s0 proto kernel scope link src 192.168.0.27 metric 100
192.168.0.1 dev enp4s0 proto dhcp scope link src 192.168.0.27 metric 100
我的配置没有错误,但我失去了对服务器的 ssh 访问权限。我仍然可以从服务器访问互联网并 ssh 到其他机器,但我无法从我的笔记本电脑 ssh 到服务器。
我无法 ping 通服务器,但仍然可以看到它的地址:
s@M1 ~ % nslookup oven-f1
Server: 2001:8003:d44e:7600::1
Address: 2001:8003:d44e:7600::1#53
Name: oven-f1.modem
Address: 192.168.0.27
s@M1 ~ % ping oven-f1
PING oven-f1.modem (192.168.0.27): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
Request timeout for icmp_seq 3
^C
--- oven-f1.modem ping statistics ---
5 packets transmitted, 0 packets received, 100.0% packet loss
我不确定为什么在启用 2 个网卡后无法通过 ssh 进入服务器,任何帮助都将不胜感激,因为我陷入了困境
编辑答案更新
以下是有效的 netplan 配置。我只是将 10GB 卡和 10GB 交换机分成不同的子网192.168.1.0/24
,并保持 1GB 卡和交换机处于开启状态192.168.0.0/24
。
network:
version: 2
renderer: networkd
ethernets:
enp4s0:
dhcp4: true
enp5s0:
dhcp4: false
addresses:
- 192.168.1.24/24
还更新了服务器上的 hosts 文件以映射子网上的192.168.1.0/24
主机
这里的第一个问题是您有两个使用相同地址编号的独立子网。
不要这样做。如果 10Gbit 1交换机与主 1Gbit LAN 交换机没有连接,那么它们应该使用不同的网络号 - 例如一个使用 192.168.1.0/24,另一个使用 192.168.10.0/24 - 无论这是否是问题的根本原因。
这是因为操作系统主要将其本地子网作为一个单元进行路由,而且它们独立于请求路由响应(有一些例外)。因此,当您尝试联系 192.168.0.26,但您有两张网卡连接到两个不同的 192.168.0.0/24 子网时,操作系统不会尝试确定哪个网络具有这样的地址(Windows 可能是一个例外)——相反,通过卡 A 的整个/24 路由被设置为比通过卡 B 的相同路由具有更高的优先级。
例如,当你的 Linux 服务器有这些路由时:
并且它需要响应您 PC 的 SSH 连接请求,它将通过
dev enp5s0
(您的 10Gbit 卡)发送该响应,因为该路由具有相同的前缀长度(/ 24)和较小的度量(更低成本);并且由于 10Gbit 卡没有连接到 1Gbit 子网,该数据包永远不会到达 PC。将 10Gbit 交换机连接到 1Gbit 交换机是使其工作的最简单方法,通过将它们合并到单个网络中(不会造成任何性能损失) - 尽管一开始就不需要 1Gbit 卡。
但是由于 10Gbit 交换机上没有可用的端口,并且必须将子网分开,所以您必须对其中一个子网重新编号 - 仅此一点就可以使一切正常工作,至少目前如此(只要您通常只有两个子网)。
附注:(一旦您整理好子网编号),从技术上讲,在一台服务器上安装第二张卡就足够了,然后该服务器可以充当“1Gbit”和“10Gbit”子网之间的路由器 - 尽管如果您有足够的端口和足够的卡,那么在每台服务器上安装第二张卡肯定会使配置更简单。
另一个问题是,enp5s0 上有默认路由,即使你说这条路由通向未连接到任何路由器的交换机,这意味着 192.168.0.1 可能不存在于此网络上,即使存在,它也无法访问互联网。这可能会导致之前问题的另一个实例,即无用的“0.0.0.0/0 到 enp5s0”路由比有效的“0.0.0.0/0 到 enp4s0”路由具有更高的优先级。
如果网络没有默认网关,则不要配置默认网关。接口工作时不需要默认路由。(根据定义,同子网通信不需要使用网关!)
1请注意,“GB”(大写)表示“千兆字节”,与“Gb”(千兆位)相差 8 到 10 倍。
发生这种情况的原因是,您在同一个广播子网上有 2 个网卡,数据包只会在其中一个网卡上发送。
您正在尝试从同一子网访问服务器(ssh),因此默认路由不会成为一个因素,它只会是 192.168.0.0/24 路由。
在静态接口上,您有以下路由:192.168.0.0/24 dev enp5s0 proto kernel scope link src 192.168.0.24
在 DHCP 上您有:192.168.0.0/24 dev enp4s0 proto kernel scope link src 192.168.0.27 metric 100
由于 dhcp 上的度量为 100,而由于未分配度量,静态为 0,因此将使用 0 路由。这意味着 192.168.0.0/24 的所有流量都将通过 enp5s0 发送。这会导致问题,因为客户端接收的 mac 地址与它发送到的 mac 地址不同,而且除非您启用了 route_localnet,否则这两个接口无法在它们之间路由流量。
如果您希望将两个网卡放在同一个子网上,则有很多选择,其中一些取决于您使用的交换机类型。无论您使用哪种交换机,这两个选项都可以使用。
ip a 添加 192.168.0.27/32 dev enp4s0 ip a 删除 192.168.0.27/24 dev enp4s0
您需要更新 netplan 配置以应用新的 ip 地址,并在该接口上禁用 dhcp。否则它将再次获得 /24 子网。
您还需要启用 route_localnet
sysctl -w net.ipv4.conf.all.route_localnet=1
为了使该功能在重启后仍然有效
echo net.ipv4.conf.all.route_localnet=1 >> /etc/sysctl.conf
这将导致任何发往 192.168.0.27 的数据包都从此接口发送,度量值无关紧要,因为始终会使用更高的子网,度量值仅在子网相同时才是一个因素。使用 /32 地址还将禁用该接口上的广播,这将停止广播循环。
在 Ubuntu 上:apt install bridge-utils
brctl addbr br0 brctl addif br0 enp4s0 brctl addif br0 enp5s0
ip 链路设置 enp4s0 promisc 开启 ip 链路设置 enp5s0 promisc 开启
ip 链路设置 br0 启动 dhclient br0 ip a del 192.168.0.27/24 dev enp4s0 ip a del 192.168.0.24/24 dev enp5s0
这将为桥接接口提供一个新的 IP 地址。
此设置可能会导致广播循环,如果确实如此,请尝试 stp。
brctl stp br0 on
确保您可以通过本地或带外管理(如 iDrac 或 iLo)访问终端,切换到桥接可能会导致连接在切换时断开。
****请注意,我不推荐这种设置,您不应该在同一个广播子网上有 2 个网卡(VLAN 是创建单独广播子网的一种方法)。链路聚合将是最好的解决方案。
如果网络接口连接到网络的不同物理段,那么桥接选项是可行的,并且是推荐的,因为桥接是交换机的另一个术语,因此您的服务器将充当两个物理段之间的交换机,将两个物理段连接成一个逻辑网络。