![Ubuntu 20.04:服务仅在用户首次登录后运行](https://linux22.com/image/188157/Ubuntu%2020.04%EF%BC%9A%E6%9C%8D%E5%8A%A1%E4%BB%85%E5%9C%A8%E7%94%A8%E6%88%B7%E9%A6%96%E6%AC%A1%E7%99%BB%E5%BD%95%E5%90%8E%E8%BF%90%E8%A1%8C.png)
我正在尝试设置一个 openvpn 服务器,它使用 nat 让用户可以访问 AWS 中的多个 VPC。
为此,我正在运行命令...
iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -o ens5 -j MASQUERADE
...其中 10.10.0.0/24 是 openvpn 分配的私有 IP 范围。
虽然让这个 iptables 命令在服务器重新启动时自动运行,但我遇到了麻烦。
我目前正在做的方式是使用以下服务......
/etc/systemd/system/vpn_iptables.service
:
[Unit]
Description=Set up the firewall
After=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/vpn_iptables
[Install]
WantedBy=multi-user.target
脚本本身是这样定义的......
/usr/local/sbin/vpn_iptables
:
#!/usr/bin/sh
iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -o ens5 -j MASQUERADE
我一直在绞尽脑汁试图找出看似不一致的行为。伪装似乎有效,但突然间就失效了。
我最终发现,重新启动后我需要至少一次 ssh 进入服务器,然后它才能正常工作。
这使得调试出现的问题变得非常困难。
我猜这与我定义 my 的方式有关vpn_iptables.service
,但我对此了解不够,无法理解我做错了什么。
我想要做的是让服务始终在网络可用时立即启动,但不应等到用户登录。
我的理解是,这WantedBy=multi-user.target
是为了确保系统准备好接受用户连接,但我不知道为什么它实际上需要用户登录。
任何指示将不胜感激。
另外我应该提到我已经尝试了各种其他方法来自动运行它,包括将其放入 /etc/rc.local 以及 cloud-init per-boot 脚本等中。其他似乎都不起作用。我假设这与这些不同脚本运行的时间有关。
答案1
如果它对其他人有帮助,我找到了解决方案......
我只需要将 WantedBy 更改为...
[Install]
WantedBy=openvpn.service
现在我更好地理解了这实际上意味着什么,这真的很有意义。