在启动接口时是否可以阻止添加默认路由?


12

我有一个带有两个NIC的系统。这台机器和一些附带的设备将被移动并连接到不同的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和Internet不会有任何麻烦。

如果我首先或第二次启动eth0,它将获取其地址并将默认网关设置为其地址空间内(在10.xxx范围内)。如果我先启动eth0,然后启动eth1,则默认网关仍保持在10.xxx范围内。

因此,无论我做什么,eth0都会覆盖eth1并“声明”路由中的网关。

有什么方法可以防止eth0声明网关,或确保eth1(如果是第2个启动的话)使用其网关?还是我可以以某种方式优先使用哪个接口的网关,而不是其他接口?

我基本上想确保eth1的默认地址空间网关(如果处于活动状态)被使用,否则,则使用ppp0的默认网关。我希望能够防止eth0拥有默认网关。


奇怪的是,使用ifconfig会导致任何类型的DHCP交互。通常ifup,可以通过启动来做到这一点dhclient。您的eth *接口是否可能是由系统引导过程(例如/etc/init.d/network)或NetworkManager 引导的?
Mark Plotnick

@MarkPlotnick:这是在我启动并使用“ ifconfig eth1 up”(或down或eth0 ...)之后。我想我想做的最简单的形式就是调出eth0而不添加除10.xxx地址空间之外的任何路由。
探戈

Answers:


5

DHCP服务器配置错误。当它不能提供到世界其他地方的路由时,它不能发送默认网关选项。如果确实发送了该选项,则任何客户端都可以假定它可以将任何离线目标的数据包发送到指定的默认网关。

因此,如果DHCP告知您,则使用eth0的默认网关是正确的。解决方案是从DHCP服务器中删除错误的选项。


好的,这很有意义。不幸的是,DHCP服务器是DLink DNS-321,它不允许许多控制选项。似乎要求我包括一个网关。我将不得不查看是否可以通过某种方式对其进行修改并编辑配置文件。但是,另一个问题是:为什么它总是从10.xxx DHCP服务器获取网关,而不总是从另一台服务器获取网关?
探戈

1
我不确定linux在相同的路由之间如何选择。它可能基于指标。有多个默认路由时,可以显示路由表吗?
桑德·斯特凡2015年

它不允许多个默认路由。令人沮丧的是,由于某种原因,eth0总是侦听DHCP并更新网关。使用eth1,它只有在第一个也是唯一的接口启动时,才侦听和使用网关。如果eth0的网关不总是覆盖eth1的网关,那么我只需要编写一个脚本,以便在启动eth0时,先删除eth1,然后再启动。
探戈

在DHCP客户端中,这听起来几乎像是硬编码的怪异。您正在使用哪一个?作为替代方案:交换eth0和eth1可能更容易;)
Sander Steffann 2015年

在D-Link DNS-321上。但是我已经遍历了/ var / logs / syslog,可以看到eth1的DHCP每次也都在网关中发送。我只是不知道为什么eth1总是采用网关并将其添加到路由而eth1却不这样做。我将尝试限制DHCP eth0的范围,从10.0.0.3开始,然后使用10.0.0.2使eth0静态,看看是否导致它忽略了该粗鲁的DHCP服务器。
探戈

16

我在Raspbian上遇到了类似的问题(我想下面的解决方案也将适用于Debian)。Raspberry Pi 3集成了2个NIC:Wi-Fi和以太网。我都使用它们,它们分别是wlan0和eth0。wlan0已连接到我的家庭Wi-Fi网络,并且可以通过此接口访问Internet。它通过我的家庭路由器通过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

因此,我没有Internet访问权限,因为系统试图通过eth0路由它,并且它没有Internet访问权限,如上所述。

为了解决该问题,我nogateway/etc/dhcpcd.confeth0接口中使用了option 。因此,特定于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

出现了Internet访问,问题已解决。


1
这正是我的情况,这正是解决方案。
PNDA

谢谢,nogateway是最新的Debian发行版中的一种方式
Alessandro Dionisi '18

您无法想象在Raspbian Pi中面对这个问题有什么麻烦,您只是提供了最优雅,最正确的解决方案。谢谢你,兄弟。
TechNyquist,

7

在RHEL6 / Fedora 22上,已经测试了以下内容。

在/ etc / sysconfig / network-scripts / ifcfg-eth1中添加以下行:

DEFROUTE=no

将eth1替换为不需要默认路由的接口名称。

也可以通过选中“ IPv4”选项卡底部的“仅将此连接用于其网络上的资源”复选框,通过Network Manager GUI来完成。

启用接口后,DEFROUTE = no阻止将默认路由(目标0.0.0.0)添加到路由表。即。以下条目将不会添加。

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

1
请解释为什么它可以解决问题。当它起作用时。它可以在基于Debian的发行版上运行(我相信),但不能在具有不同接口命名的发行版上使用(或使用systemd进行发行的服务网络)。
grochmal

1
与基于Debian的系统相比,它更像Red Hat。
ilkkachu 2016年

4

好的,因此,您想要的是该机器在启动eth0并通过DHCP获取其地址时永远不会启动默认网关。

解决方法如下:

编辑文件:

/etc/dhcp/dhclient-up-hooks

并填充:

#!/bin/sh
## Prevent DHCP server on eth0 from forcing a default route on us

case ${interface} in
  eth0)
     printf "executing ip route delete default via $new_routers\n" 
     ip route delete default via $new_routers
  ;;
     *)
  ;;
esac

之前:

[root@centos7lab dhcp]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.4.1     0.0.0.0         UG    20     0        0 eth0
192.168.4.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

在ifdown eth0之后,ifup eth0:

[root@centos7lab dhcp]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.4.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

建立网关后,这将删除该路由,这意味着它已使用默认网关清除了所有其他路由。还是我误会了?
探戈

它只会删除DHCP客户端启动eth0时创建的网关,不会影响系统上已有的任何其他网关。从您的描述中,我认为您的问题是,您在某个时候同时获得两个默认网关(一个在eth0上,一个在eth1上),并且您甚至在将eth0放入路由表之前都需要摆脱它。如果您在问题发布时发布route -n输出,我可能会更改我的假设。
里卡多

1

您可以编辑dhcpclient.conf文件,而不从远程DHCP服务器请求任何默认路由。

我所做的一小部分样本正在为我的案例服务

发送主机名=“随机主机名”;

请求子网掩码,广播地址,时间偏移,接口MTU,rfc3442-classless-static-routes,ntp服务器;

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.