我有一个 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-LISTEN
和TCP4
/或localhost
以匹配您的配置。