我有一个 CentOS 7 的最小安装。
我已经禁用网络管理器,因为我想以“老式”的方式设置我的网络。
systemctl stop NetworkManager
systemctl disable NetworkManager
chkconfig network on
service network restart
我的网络配置(/etc/sysconfig/network-scripts/ifcfg-ens4)如下所示:
DEVICE="ens4"
TYPE="Ethernet"
NOZEROCONF="yes"
PERSISTENT_DHCLIENT="1"
BOOTPROTO="dhcp"
DEFROUTE="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
NAME="ens4"
ONBOOT="yes"
NM_CONTROLLED="no"
我的 DHCP 租约文件如下所示:
lease {
interface "ens4";
fixed-address 144.76.190.238;
option subnet-mask 255.255.255.255;
option routers 144.76.190.224;
option dhcp-lease-time 86400;
option dhcp-message-type 5;
option domain-name-servers 8.8.8.8,8.8.4.4;
option dhcp-server-identifier 144.76.190.224;
option host-name "hello.example.com";
option domain-name "example.com";
renew 2 2014/10/21 05:44:47;
rebind 2 2014/10/21 15:04:03;
expire 2 2014/10/21 18:04:03;
}
现在,我的问题是 DHCP 中的“路由器”字段似乎被 CentOS 7 忽略了。IP、网络掩码和主机名设置正确,但我的默认路由未设置(空白)。
如您所见,我使用网络掩码 255.255.255.255,因此网关 IP 位于我的网络“外部”。因此需要额外的路由。如果我手动运行这些:
route add -host 144.76.190.224 dev ens4
route add default gw 144.76.190.224
然后一切正常:
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 144.76.190.224 0.0.0.0 UG 0 0 0 ens4
144.76.190.224 0.0.0.0 255.255.255.255 UH 0 0 0 ens4
我测试过的所有其他 Linux 发行版(包括 Centos 6)都运行良好并从 DHCP 自动设置这 2 个路由。
所以我的问题是:为什么它不能在 CentOS 7 中自动设置?是否发生了一些变化,我必须向 DHCP 客户端添加一些其他标志才能使其正常工作?
看来 CentOS 6 使用 dhclient 版本 4.1.1-P1,而 CentOS 7 使用 4.2.5。也许他们在这两个版本之间做了一些更改?
更新 1:
我查看了 dhclient 的发行说明并发现了 4.0.0 的内容:
“如果为 IPv4 地址提供的子网掩码为 /32,则 dhclient 脚本会更新为创建默认网关的主机路由。这允许客户端在‘强制’网络环境中工作,而操作员不希望客户端直接串扰。”
所以这应该早就起作用了。也许 CentOS 7 已将其从“dhclient-script”中删除?
更新2:
我将文件“/sbin/dhclient-script”从 CentOS 6 安装复制到 CentOS 7 服务器。现在一切正常。我将调查他们做了哪些更改,但似乎他们在 CentOS 7 中引入了一个错误。
更新 3:
我找到了问题所在。他们在新版 /sbin/dhclient-script 中添加了一个(愚蠢的)ping 检查,在添加网关之前尝试 ping 网关。由于我在 DHCP 服务器上的防火墙中阻止了 ping,因此它没有响应,因此 dhclient-script 没有添加任何默认路由。
答案1
确保 DHCP 服务器响应 ping。否则,/sbin/dhclient-script 将无法正确设置默认路由。
这个额外的“检查”似乎是在 dhclient 的后续版本中添加的,或者是在 CentOS 7 中特别添加的。在 CentOS 7 之前的版本中不存在 ping 检查。
答案2
也许您已经设置了默认网关/etc/sysconfig/network/routes
?
如果没有,您至少可以配置该文件中自动完成的手动路由:
144.76.190.224 - 255.255.255.255 ens4
default 144.76.190.224 - ens4
答案3
我刚刚在全新安装的 CentOS 7 VMWare 客户机上遇到了这个问题,这是因为我之前在 VMWare Workstation 中为该客户机设置了 dhcp 预留:
目录:\ProgramData\VMware\vmnetdhcp.conf
因此,修复方法是注释掉或删除与 CentOS 服务器相关的 conf 文件中的两行:
host VMnet8 {
hardware ethernet 00:40:56:C0:00:08;
fixed-address 192.168.80.1;
#hardware ethernet 00:0C:29:19:C7:7A; <--Comment or remove this CentOS line
#fixed-address 192.168.80.111; <--Comment or remove this CentOS line
option domain-name-servers 0.0.0.0;
option domain-name "";
option routers 0.0.0.0;
}
保存文件(以管理员身份),在主机上重新启动 VMWare DHCP 服务,然后network service restart
在 CentOS 上执行。现在您将拥有一个网关来访问互联网。但是,您还需要yum update
修复 dhcp 预留无网关问题。否则,如果您在此之前重新添加预留,则下次重新启动时将没有网关。更新完成后,问题应该得到解决。因此,将上面的行添加回 conf 文件并再次重新启动 VMWare DHCP 服务,以便您的预留恢复到位,然后您就设置好了。
这只是 CentOS 初始设置时的情况。所以,在全新安装后,这种情况很痛苦。尽管这样做有缺点,但我以后会继续使用 VMWare 快照。
顺便说一下,我的 NetworkManager 已启用。如果有人知道在全新安装后永久避免此问题的方法,请分享。它可能会在 CentOS 的后续更新中得到修复,因为yum update
它已修复此问题。
这是一种特殊情况,但并非罕见的情况。我发布这个答案主要是因为我将来可能会回到这里试图记住我做了什么。但是,我花了一些时间在这上面,所以希望它也能帮助别人。
答案4
我遇到了这个问题。我正在从 VMware 模板部署 CentOS 7 VM
有关‘/etc/sysconfig/network/routes’的答案为我提供了很大的线索!
虽然在 /var/lib/dhclient/dhclient--eth0.lease 中设置了“选项路由器”,但当我查看路由命令输出时,它并未生效,我只能访问子网中的节点
我可以在 /etc/sysconfig/network-scripts/ifcfg-eth0.cfg 中手动设置网关,这样就可以正常工作
最终我找到了一个名为 /etc/sysconfig/network 的文件,其中包含一个默认网关
当我注释掉该网关并重新启动网络服务时,一切都正常了