我的系统有两个网卡。这台机器和一些附带的设备将被移动并连接到不同的 LAN,或者有时会使用拨号连接。
eth0:
- 10.x.x.x address space
- no internet gateway
- only a few devices
eth1 (when used):
- 172.16.x.x or 192.168.x.x or other address spaces
- access to the gateway from LAN to internet
ppp0 (when used):
- internet access through dialup using KPPP
我使用 ifconfig 来启动或关闭接口(除了 ppp0,它由 KPPP 处理)。
如果我先启动 eth1,它会从 DHCP 获取地址并获取网关,并将其添加到路由中,这样就可以毫无问题地访问 LAN 和互联网。
如果我首先或第二次启动 eth0,它会获取其地址并将默认网关设置在其地址空间内(在 10.xxx 范围内)。如果我先启动 eth0,然后启动 eth1,默认网关仍保持在 10.xxx 范围内。
因此,无论我做什么,eth0 都会覆盖 eth1 并在路由中“声明”网关。
有没有办法阻止 eth0 声明网关,或者确保 eth1(如果是第二个)使用其网关?或者我可以以某种方式优先考虑应该使用哪个接口的网关而不是其他接口的网关吗?
我基本上想确保 eth1 的默认地址空间网关在活动状态下被使用,如果没有,则使用 ppp0 的默认网关。我希望能够阻止 eth0 拥有默认网关。
答案1
我在 Raspbian 上遇到了类似的问题(我想下面的解决方案也适用于 Debian)。 Raspberry Pi 3 集成了 2 个 NIC:Wi-Fi 和以太网。我两个都用,分别是wlan0和eth0。 wlan0 连接到我的家庭 Wi-Fi 网络,并且通过此接口访问互联网。它通过 DHCP 从我的家庭路由器获取其设置。 eth0 直接连接到我的 Windows PC,并且有静止的已分配 IP。由于我没有在 Windows PC 上配置它,因此无法通过 eth0 访问互联网。
在 Raspbian 中,dhcpcd 守护进程负责配置网络接口。为了将静态 IP 设置为 eth0 接口,在末尾添加了以下几行/etc/dhcpcd.conf
:
interface eth0
static ip_address=192.168.2.2/24
static routers=192.168.2.1
static domain_name_servers=192.168.2.1
通过此设置,dhcpcd 创建了 2 个默认路由,并且通过 eth0 的路由比通过 wlan0 的路由具有更高的优先级:
pi@raspberrypi:~ $ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.2.1 0.0.0.0 UG 202 0 0 eth0
default 192.168.1.254 0.0.0.0 UG 303 0 0 wlan0
192.168.1.0 * 255.255.255.0 U 303 0 0 wlan0
192.168.2.0 * 255.255.255.0 U 202 0 0 eth0
所以我无法访问互联网,因为系统尝试通过 eth0 路由它,但它没有互联网访问权限,正如我上面提到的。
为了解决这个问题,我在eth0接口中使用了nogateway
选项。/etc/dhcpcd.conf
所以 eth0 特定的配置开始看起来像这样:
interface eth0
static ip_address=192.168.2.2/24
static routers=192.168.2.1
static domain_name_servers=192.168.2.1
nogateway
保存此配置并重新启动后,没有通过 eth0 的默认路由:
pi@raspberrypi:~ $ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.1.254 0.0.0.0 UG 303 0 0 wlan0
192.168.1.0 * 255.255.255.0 U 303 0 0 wlan0
192.168.2.0 * 255.255.255.0 U 202 0 0 eth0
互联网出现了,问题就解决了。
答案2
在 RHEL6/Fedora 22 上,已测试以下内容。
在 /etc/sysconfig/network-scripts/ifcfg-eth1 中添加以下行:
DEFROUTE=no
将 eth1 替换为不需要默认路由的接口名称。
这也可以通过网络管理器 GUI 来完成,方法是选中 IPv4 选项卡底部的“仅将此连接用于其网络上的资源”框。
DEFROUTE=no 会阻止在启用接口时将默认路由(目标 0.0.0.0)添加到路由表中。 IE。将不会添加以下条目。
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 172.16.x.x 0.0.0.0 UG 0 0 0 eth1
答案3
DHCP服务器配置错误。当它无法提供到世界其他地方的路由时,它不得发送默认网关选项。如果它确实发送了该选项,则任何客户端都可以假设它可以将任何离线目标的数据包发送到指定的默认网关。
因此,如果 DHCP 告知您的设备使用来自 eth0 的默认网关,那么您的设备是正确的。解决方案是从 DHCP 服务器中删除错误的选项。
答案4
Roman Me 的回答很好,但我在想,如果有一天你想使用eth0
互联网怎么办?
我所做的不是nogateway
在 my 中指定/etc/dhcpcd.conf
,而是添加了metric 1000
通过这样做,它仍然会添加路由,但会将其作为其他路由的高度量(低优先级)。