当 ListenAddress 设置为 Wireguard VPN IP 时,SSH 无法启动

当 ListenAddress 设置为 Wireguard VPN IP 时,SSH 无法启动

wg0假设我有一个被调用的wireguard网络10.0.0.1/24。我使用 systemd 在启动时启动它:

# systemctl enable wg-quick@wg0

我希望 sshd 仅侦听wireguard 地址 ,10.0.0.1而不是0.0.0.0。所以我设置ListenAddress/etc/ssh/sshd_config

ListenAddress  10.0.0.1
#ListenAddress  ::
AddressFamily  inet

笔记:我设置地址族是因为我在这里只使用 IPv4 而不是 IPv6。我认为如果没有设置,ssh将继续监听::IPv6。

如果我保存配置并重新启动 sshd,效果很好。但是服务器重新启动后,尽管在 systemd 中启用了 ssh,但仍无法启动。系统日志输出告诉我们原因:

sshd[xxx]: error: Bind to port 22 on 10.0.0.1 failed: Cannot assign requested address.

显然,我们有一个竞争条件,即 sshd 在 Wireguard 接口准备好之前尝试(但失败)启动。

显而易见的解决方案是编辑/etc/systemd/system/sshd.service并添加wg-quick@wg0为依赖项。然而, After=Wants=、 或的组合并Requires=不能解决问题。似乎wg-quick@wg0报告它已经完成,尽管网络接口实际上还没有准备好。

答案1

sys-devices-virtual-net-XXX.device如果被列为依赖项,Systemd 将等待接口准备好。因此,要让 sshd 等待 wg0 接口,请将这些行添加到以下[Unit]部分/etc/systemd/system/sshd.service

After=network.target [email protected]
Requires=sys-devices-virtual-net-wg0.device

这应该适用于侦听wireguard 地址的任何服务。 SSH 还需要After=auditd.service.中的项目After=可以用空格分隔或多After=行。

最后,重新加载守护进程并重新启动服务:

# systemctl daemon-reload
# systemctl restart sshd

相关内容