我想以某种方式将服务所需的网络端口绑定到它的 systemd 配置,以便只有在服务正常运行时才会打开相关端口。
仅添加添加/删除防火墙规则的触发器并不是一个明智的解决方案,因为这会扰乱规则集顺序。
提前致谢。
答案1
请考虑一般来说服务需要持续运行。
在这方面,在服务启动或停止时动态打开和关闭防火墙中的端口并没有带来太多好处。
当防火墙中的端口打开,但由于服务停止/失败而没有侦听器接受传入连接时,该连接无论如何都会被拒绝。
仅添加添加/删除防火墙规则的触发器并不是一个明智的解决方案,因为这会扰乱规则集顺序。
尽管在底层,所有 Linux 版本都使用 iptables/netfiler 作为实际的防火墙,但它们并不直接操作规则,而是大多数都带有一个用户友好的前端来管理防火墙设置。
让您的应用程序与这些前端协同工作,这样启用/禁用您的服务造成的破坏的风险就会小得多。
Systemd 服务可能带有防火墙 - 例如检查 https://firewalld.org/documentation/howto/add-a-service.html如何为您的服务定义防火墙配置文件。
一旦定义了服务,在运行时打开与该服务相关的所有端口就仅限于一个命令,例如:
firewall-cmd --zone=public --add-service=myservice
删除服务也同样简单:
firewall-cmd --zone=public --remove-service=myservice
我想以某种方式将服务所需的网络端口绑定到它的 systemd 配置,以便只有在服务正常运行时才会打开相关端口。
在您的 systemd 服务单元文件中使用ExecStartPre=
使用适当的命令在启动服务之前打开防火墙,并在服务停止后再次关闭端口ExecStopPost=
。
[Unit]
Description=My service
[Service]
Type=forking
ExecStart=/usr/sbin/my-simple-daemon -d
ExecStartPre=firewall-cmd --zone=public --add-service=myservice
ExecStopPost=firewall-cmd --zone=public --remove-service=myservice
[Install]
WantedBy=multi-user.target