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