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

Как привязать порты к службам systemd для настройки брандмауэра?

Я хотел бы как-то привязать сетевые порты, необходимые службе, к ее конфигурации 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