Firewall

如何將埠綁定到 systemd 服務以進行防火牆配置?

  • October 3, 2019

我想以某種方式將服務需要的網路埠綁定到它的 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

引用自:https://serverfault.com/questions/986626