我正在处理 RHEL 7 中的一个已知 问题,即指定要绑定到的地址的服务将无法正确启动。我发现了许多类似的报告,许多人说它们已经通过更新 systemd 得到解决,但我仍然面临这个问题。这会影响我盒子上的所有服务(sshd、sshd、vsftpd、nginx),这些服务不仅仅绑定到 0.0.0.0。
我找到了各种假设的解决方法,但没有一个能始终如一地为我工作。以 sshd 为例,config 如下所示:
Port 22
ListenAddress 192.168.242.225
...
这是我尝试过的,单独的和组合的:
来自https://bugzilla.redhat.com/show_bug.cgi?id=1352214#c4(我也尝试过sys-subsystem-net-devices-eth1.device
,network-online.target
但我怀疑这不会等待寻址发生。)
mkdir /etc/systemd/system/sshd.service.d
tee /etc/systemd/system/sshd.service.d/wait.conf << 'EOF'
[Unit]
After=network-online.target
EOF
来自https://bugzilla.redhat.com/show_bug.cgi?id=1352214#c11
mkdir /etc/systemd/system/sshd.service.d
tee /etc/systemd/system/sshd.service.d/wait.conf << 'EOF'
[Unit]
Wants=network-online.target
After=network-online.target
EOF
来自https://bugzilla.redhat.com/show_bug.cgi?id=1438749#c0
systemctl add-wants multi-user.target network.target
从某处
mkdir /etc/systemd/system/sshd.service.requires
ln -s /usr/lib/systemd/system/network-online.target /etc/systemd/system/sshd.service.requires/
无论我尝试什么,我通常都会以“错误:绑定到 192.168.242.125 上的端口 22 失败:无法分配请求的地址”结束。有时,一切都开始完美,我猜这是时间问题。
运行 Scientific Linux (RHEL) 7.5 并启用网络管理器,所有 IP 寻址都是静态的。如果还有其他可能有帮助的细节,请告诉我。这journalctl
是启动失败后的输出,After=network-online.target
在 sshd 单元文件中。相关内容从第 1700 行开始。希望有人遇到此问题并成功解决!
最好不要将系统服务配置为侦听特定 IP 地址,并在必要时通过主机防火墙控制对它们的访问。
如果您确实需要在网络接口上配置特定 IP 地址之前能够绑定它们,您可以通过设置
net.ipv4.ip_nonlocal_bind
IPv4 的 sysctlnet.ipv6.ip_nonlocal_bind
和 IPv6 的 sysctl 来解决时间问题。然后,服务可以绑定到未在任何网络接口上配置的 IP 地址,但在这些 IP 地址在接口上配置之前,它们将无法访问。如果您使用的是 NetworkManager,那么为了
network-online.target
按预期工作,您需要启用 serviceNetworkManager-wait-online.service
,它实际上是等待网络上线以满足该目标的服务。需要将
network-online.target
其“挂钩”到您的网络管理器中(由于 NetworkManager 不是唯一的选择,因此还有 systemd-networkd 可用于管理网络。)要
network-online.target
使用 NetworkManager,您需要有一个/etc/systemd/system/network-online.target.wants/
指向/usr/lib/systemd/system/NetworkManager-wait-online.service
.您可以通过启用该服务来实际创建:
一旦到位,依赖
network-online.target
应该开始工作,等到 NetworkManager 完成启动它应该在启动时启动的所有接口。为了帮助诊断该设置的任何问题,您可能还需要查看 和 的输出
systemctl status network-online.target
,systemctl status NetworkManager-wait-online.service
因为它们可能对正在发生的事情有更多的线索。(特别是时间戳可能会有所帮助,如果依赖的守护进程在完成之前network-online.target
启动,那么您的配置可能存在问题。)NetworkManager-wait-online.service
在您列出的解决方案中,我推荐这个:
因为
network-online.target
是您真正想要的(以确保所有 IP 都已启动等),并且包括Wants=
确保将请求其启动。从其他方法来看,这个方法不起作用:
systemctl add-wants multi-user.target network.target
,因为它不会在服务本身(SSH 守护程序等)和完全启动的网络之间创建任何依赖关系。这只是说您希望网络正常运行...并且涉及
/etc/systemd/system/sshd.service.requires/
目录的那个缺少After=
依赖项(我认为这是必不可少的,而不是仅仅通过它来暗示.requires/
。)如果您认为Requires=
比Wants=
(它更强大,如果依赖项失败会导致单元失败),那么我建议只使用它/etc/systemd/system/sshd.service.d/wait.conf
,覆盖文件绝对是管理此配置的更灵活的方式。添加对 的依赖
sys-subsystem-net-devices-eth1.device
也无济于事,因为这仅表明设备存在(从 udev 的角度来看),这并没有说明它正在启动和配置。所以这也不是一个选择。