У меня есть daemon.service, который запускается каждый раз на другом порту, поэтому мне нужно разрешать этот случайный порт через iptables каждый раз, когда он запускается, и запрещать его каждый раз, когда он останавливается. Поэтому мне нужно запустить скрипт, который разрешает каждый порт в iptables перед запускается daemon.service затем запустить скрипт, который изменяет правило «разрешить каждый порт» на «разрешить только порт, который использует daemon.service» после запускается daemon.service и когда daemon.service останавливается, мне нужно запустить сценарий, который удаляет это правило. ОБРАТИТЕ ВНИМАНИЕ, что daemon.service запускается как собственный пользователь, и чтобы разрешить / запретить порты через iptables, мне нужно сделать это как root, поэтому я не могу использовать ExecStartBefore / ExecStartAfter в daemon.service
Вот схема (вроде) того, что должно произойти:
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.
Ну, для настройки iptables
вещи, которые вам нужно будет добавить пользователя службы в sudoers
и запустите эти команды с помощью sudo ...
.
Тем не менее, вместо того, чтобы возиться с iptables
, вы можете открыть статический порт в брандмауэре, а затем подключить этот статический порт к порту динамического демона с помощью socat
.
socat -s TCP4-LISTEN:<open-firewall-port>,fork TCP4:localhost:<random-daemon-port>
Тогда вам нужно будет только запустить ExecStartAfter
скрипт, который определяет случайный порт и запускает socat
для подключения этих портов.
Также обратите внимание, что вам, возможно, придется изменить TCP4-LISTEN
, TCP4
и / или localhost
в соответствии с вашей конфигурацией.