我有一台可以通过 SSH 访问的服务器(Ubuntu 20.04)通常情况下。我在此服务器上设置了 OpenVPN,并且运行正常……
除了当我启动 OpenVPN 时,我失去了通过 SSH 进入服务器的能力。
我发现有关设置防火墙规则的答案在一定程度上解决了该问题:
https://serverfault.com/a/918441/602437
我将这些规则放入脚本中然后执行:sudo ./set-ssh-rules.sh && sudo service openvpn start
并且它按预期工作。
问题是,这是一个手动的步骤,因为在我重新启动后规则似乎就消失了,我必须重新完成整个过程。
我如何才能让这些规则持续存在?或者在更现实的情况下,OpenVPN 服务已“启用”,在启动时设置规则,但前初始化系统(systemd?)启动 OpenVPN 服务。
我确信这个问题的答案散布在互联网上,但我无法将它们拼凑起来 - 抱歉。
提前谢谢了。
答案1
我发现最简单的方法是创建如下服务:
# Documentation available at:
# https://www.freedesktop.org/software/systemd/man/systemd.service.html
[Unit]
Description=Setup Firewall on each reboot
Before=network.target
[Service]
Type=oneshot
WorkingDirectory=~
RemainAfterExit=yes
ExecStart=/usr/sbin/set-ssh-rules.sh
User=root
Group=root
[Install]
WantedBy=multi-user.target
# vim: syntax=dosini
您的脚本必须放在可以使用完整路径引用的位置,如上所示。
要安装该文件,您可以将其复制到这里:
/lib/systemd/system/my-firewall.service
当您手动添加新文件时,您需要使用以下命令唤醒系统:
systemctl daemon-reload
如果您编辑 .service 文件,systemd 命令还会告诉您运行该命令,以便它可以在尝试运行其他命令之前根据需要进行自我更新。当您安装/卸载软件包时,此操作会自动完成,但当您手动执行此操作时则不会。
然后您可以启用它并且它将在每次重启时启动。
systemctl enable my-firewall
要查看它是否有效,请检查状态:
systemctl status my-firewall
您还可以手动启动/停止以验证脚本是否按预期运行:
systemctl start my-firewall
systemctl stop my-firewall
由于我没有脚本来停止防火墙,所以什么也不会发生stop
,但如果已经在运行,则start
不会执行任何操作......所以您需要stop
执行start
。 (您也可以使用restart
)