出于一般目的,最好知道如何检测网络更改并重新启动服务--但我的具体用例是希望在OpenVPN客户端连接后重新启动sshd。如果不对默认服务进行广泛的重新配置(我想避免这种情况),似乎sshd就会立即在基本网络服务上启动(这在单元文件包含After=network.target时是有意义的)。
还有sshd特有的-我不希望它在外部接口上监听端口22。一开始,我以为我可以通过防火墙来保护它,但是由于我发现我的防火墙脚本没有运行correctly...better来保护这两种方式。是的,我已经发现了愚蠢的错误并修复了防火墙(用于在/etc/default/ START_FIREHOL=yes中配置所需的记录)。
看起来,如果sshd配置为侦听显式IP,但IP不是活动的,则侦听器将不会启动,也不会在IP活动时自动绑定。由于可能最好让sshd启动任何其他有效的侦听器,而不是完全不启动,所以我不想“要求”OpenVPN客户端在sshd启动之前完成。这就是我的挑战。
我在OpenVPN中找到了"ipchange“设置--但我无法让它在短时间内工作,而且我还是希望有一个更通用的解决方案供将来使用。
我尝试过的任何针对OpenVPN客户端实例的依赖都会触发太快--客户机单元显示为“已启动”,尽管它尚未完成DHCP初始化。这意味着IP还没有激活。
我没有找到任何与网络接口状态相关的systemd单元依赖关系的文档,所以我想知道一些想法。
发布于 2020-04-07 04:05:53
我不知道这是否是最好的解决办法--但这是个可行的办法。
当创建/激活接口时,Systemd会自动创建网络设备单元。在我的例子中,作为第一个OpenVPN连接,所涉及的单元是“sys设备-虚拟-net-tun0.Device”。当IP被配置时,这个单元似乎被计算为“已启动”。
我没有为systemd单元找到明确的“重新启动”配置设置,因此我创建了以下服务:
openvpn-online.service
[Unit]
Description=Restart Network Services on VPN Connection
Conflicts=shutdown.target
Requires=openvpn-client@myclient.service sys-devices-virtual-net-tun0.device
BindsTo=openvpn-client@myclient.service sys-devices-virtual-net-tun0.device
After=openvpn-client@myclient.service sys-devices-virtual-net-tun0.device
[Service]
Type=oneshot
ExecStart=/bin/systemctl restart sshd
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target这个feels...inelegant...but,它工作得很完美。现在sshd很早就开始了,然后在OpenVPN客户机完成DHCP后重新启动。
Systemd还允许多个ExecStart=行用于oneshot单元--因此,如果其他服务需要,我可以对此进行调整。
https://serverfault.com/questions/1011225
复制相似问题