Я хотел бы как-то привязать сетевые порты, необходимые службе, к ее конфигурации systemd, чтобы коррелирующие порты открывались только в том случае, если служба работает правильно.
Простое добавление триггера для добавления / удаления правил брандмауэра не будет разумным решением, поскольку это нарушит порядок набора правил.
Заранее спасибо.
Учтите, что в целом службы должны работать непрерывно.
В этом отношении динамическое открытие и закрытие портов в вашем брандмауэре при запуске или остановке службы не дает большого преимущества.
Когда порт открыт в вашем брандмауэре, но нет слушателя для приема входящего соединения, потому что служба остановлена / не работает, это соединение в любом случае будет отклонено.
Простое добавление триггера для добавления / удаления правил брандмауэра не было бы разумным решением, так как это нарушило бы порядок набора правил.
Хотя под капотом все разновидности Linux используют iptables / netfiler для фактического межсетевого экрана, вместо того, чтобы напрямую манипулировать правилами, большинство из них имеют удобный интерфейс для управления настройками межсетевого экрана.
Сделайте так, чтобы ваше приложение работало с этими интерфейсами, и гораздо меньше риска того, что включение / отключение вашего сервиса сломает работу.
Сервисы systemd, вероятно, будут поставляться с firewalld - проверьте, например 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 используйте ExecStartPost=
с соответствующей командой, чтобы открыть брандмауэр после успешного запуска службы и снова закрыть порты, когда служба остановлена с помощью ExecStopPost=
.
[Unit]
Description=My service
[Service]
Type=forking
ExecStart=/usr/sbin/my-simple-daemon -d
ExecStartPost=firewall-cmd --zone=public --add-service=myservice
ExecStopPost=firewall-cmd --zone=public --remove-service=myservice
[Install]
WantedBy=multi-user.target