我正在处理RHEL 7 中的一个已知 问题,即指定要绑定到的地址的服务将无法正确启动。我发现了许多类似的报告,许多人说它们已通过更新 systemd 得到解决,但我仍然面临这个问题。这会影响我的机器上的所有服务(sshd、sshd、vsftpd、nginx),而不仅仅是绑定到 0.0.0.0。
我找到了各种假设的解决方法,但没有一个对我始终有效。以sshd为例,配置如下:
Port 22
ListenAddress 192.168.242.225
...
Run Code Online (Sandbox Code Playgroud)
这是我单独和组合尝试过的:
来自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
Run Code Online (Sandbox Code Playgroud)
来自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
Run Code Online (Sandbox Code Playgroud)
来自https://bugzilla.redhat.com/show_bug.cgi?id=1438749#c0
systemctl add-wants multi-user.target network.target
Run Code Online (Sandbox Code Playgroud)
从某处
mkdir /etc/systemd/system/sshd.service.requires
ln -s /usr/lib/systemd/system/network-online.target /etc/systemd/system/sshd.service.requires/
Run Code Online (Sandbox Code Playgroud)
无论我尝试什么,我通常都会得到“错误:绑定到 192.168.242.125 上的端口 22 失败:无法分配请求的地址”。有时,一切都完美启动,我猜这归结为时间问题。
运行 Scientific Linux (RHEL) 7.5 并启用网络管理器,所有 IP 地址都是静态的。如果有任何其他细节可能有帮助,请告诉我。这是journalctl启动失败后的输出,在After=network-online.targetsshd 单元文件中。1700线左右开始相关的东西,希望有人遇到这个问题并成功解决!
最好不要将系统服务配置为侦听特定 IP 地址,并在必要时通过主机防火墙控制对它们的访问。
如果您确实需要在网络接口上配置特定 IP 地址之前能够绑定到它们,您可以通过net.ipv4.ip_nonlocal_bind为 IPv4设置 sysctl和net.ipv6.ip_nonlocal_bind为 IPv6设置 sysctl来解决计时问题。然后,服务可以绑定到未在任何网络接口上配置的 IP 地址,但在接口上配置这些 IP 地址之前,它们将无法访问。
如果您使用 NetworkManager,那么为了按network-online.target预期工作,您需要启用 service NetworkManager-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。
您实际上可以通过启用该服务来创建:
$ sudo systemctl enable NetworkManager-wait-online.service
Created symlink from /etc/systemd/system/network-online.target.wants/NetworkManager-wait-online.service to /usr/lib/systemd/system/NetworkManager-wait-online.service.
Run Code Online (Sandbox Code Playgroud)
一旦到位,依赖项就network-online.target应该开始工作,等待 NetworkManager 完成启动它应该在启动时启动的所有接口。
为了帮助诊断该设置的任何问题,您可能还需要查看 和 的输出systemctl status network-online.target,systemctl status NetworkManager-wait-online.service因为它们可能有更多关于正在发生的情况的线索。(特别是,时间戳可能会有所帮助,如果依赖的守护进程在完成之前network-online.target启动,那么您的配置可能有问题。) NetworkManager-wait-online.service
在您列出的解决方案中,我推荐以下一个:
# 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
Run Code Online (Sandbox Code Playgroud)
因为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 的角度来看),而没有说明该设备已启动并已配置。所以这也不是一个选择。
| 归档时间: |
|
| 查看次数: |
1553 次 |
| 最近记录: |