AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 941421
Accepted
miken32
miken32
Asked: 2018-11-24 16:08:07 +0800 CST2018-11-24 16:08:07 +0800 CST 2018-11-24 16:08:07 +0800 CST

服务器无法在启动时绑定到地址

  • 772

我正在处理 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 行开始。希望有人遇到此问题并成功解决!

systemd
  • 2 2 个回答
  • 2536 Views

2 个回答

  • Voted
  1. Michael Hampton
    2018-11-24T17:54:39+08:002018-11-24T17:54:39+08:00

    最好不要将系统服务配置为侦听特定 IP 地址,并在必要时通过主机防火墙控制对它们的访问。

    如果您确实需要在网络接口上配置特定 IP 地址之前能够绑定它们,您可以通过设置net.ipv4.ip_nonlocal_bindIPv4 的 sysctlnet.ipv6.ip_nonlocal_bind和 IPv6 的 sysctl 来解决时间问题。然后,服务可以绑定到未在任何网络接口上配置的 IP 地址,但在这些 IP 地址在接口上配置之前,它们将无法访问。

    • 6
  2. Best Answer
    filbranden
    2018-11-25T00:44:40+08:002018-11-25T00:44:40+08:00

    如果您使用的是 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.
    

    一旦到位,依赖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
    

    因为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 的角度来看),这并没有说明它正在启动和配置。所以这也不是一个选择。

    • 4

相关问题

  • SSH 会话在关机/重启时挂起

  • 我可以使用 systemd 重新启动依赖服务吗?

  • 让我的旧初始化脚本在 systemd 中工作的最简单方法是什么?

  • 在 CentOS 7 上为 systemd 启动的进程增加 nproc

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve