Systemd:如何在服务启动前、服务启动后和服务停止后运行脚本

Systemd:如何在服务启动前、服务启动后和服务停止后运行脚本

我有一个 daemon.service,每次启动时都会在不同的端口上启动,因此每次启动时我都需要通过 iptables 允许这个随机端口,每次停止时则拒绝它。因此我需要运行一个脚本,允许 iptables 中的每个端口守护进程服务启动然后运行脚本,将“允许每个端口”规则更改为“仅允许 daemon.service 使用的端口”守护进程服务启动当 daemon.service 停止时,我需要运行一个删除该规则的脚本。请注意,daemon.service 以其自己的用户身份运行,并且要通过 iptables 允许/拒绝端口,我需要以 root 身份执行此操作,因此我无法在 daemon.service 中使用 ExecStartBefore/ExecStartAfter

以下是需要发生的事情的(某种程度上)计划:

systemctl start deamon.service
|-executing as root 'iptables -A OUTPUT -p tcp -m multiport --dports 0:65535 -j ACCEPT'
|-starting daemon.service as it's own user (not as root)
|-finding (as root) what ports daemon.service uses with netstat (I can do that so I don't need explanation on how to do it)
|-executing as root 'iptables -D OUTPUT -p tcp -m multiport --dports 0:65535 -j ACCEPT'
|-executing as root 'iptables -A OUTPUT -p tcp -m multiport --dports 56731,31267 -j ACCEPT' (ports that were found by netstat)
systemctl stop daemon.service
|-stopping daemon.service as it's own user (not as root)
|-executing as root 'iptables -D OUTPUT -p tcp -m multiport --dports 56731,31267 -j ACCEPT'

笔记:daemon.service 无法在指定端口(非随机)运行

顺便说一下,我正在运行 debian。

答案1

好吧,要设置这些iptables东西,您必须将服务用户添加到sudoers并使用 运行这些命令sudo ...
不过,您不必摆弄iptables,而是可以在防火墙中打开一个静态端口,然后使用 将该静态端口连接到您的动态守护进程端口socat

socat -s TCP4-LISTEN:<open-firewall-port>,fork TCP4:localhost:<random-daemon-port>

然后您只需运行ExecStartAfter确定随机端口并开始socat连接这些端口的脚本。

另请注意,您可能必须更改TCP4-LISTENTCP4/或localhost以匹配您的配置。

相关内容