Назад | Перейти на главную страницу

Systemd: как запустить скрипт до запуска службы, после запуска службы и после ее остановки

У меня есть 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 в соответствии с вашей конфигурацией.