我想設定 CentOS 7 防火牆,以便阻止除我列入白名單的原始 IP 位址之外的所有傳入請求。對於白名單 IP 位址,所有連接埠都應可存取。
我能夠找到一些解決方案(不確定它們是否有效),iptables
但 CentOS 7 使用firewalld
.我找不到類似的東西可以用firewall-cmd
指令來實現。
接口位於公共區域。我也已經將所有服務移至公共區域。
答案1
我將透過向區域添加來源來實現此目的。首先檢查您所在區域有哪些來源:
firewall-cmd --permanent --zone=public --list-sources
如果沒有,您可以開始添加它們,這是您的“白名單”
firewall-cmd --permanent --zone=public --add-source=192.168.100.0/24
firewall-cmd --permanent --zone=public --add-source=192.168.222.123/32
(這會新增一個完整的/24
IP和一個IP,這樣您就可以同時獲得子網路和單一IP的參考)
設定您要開啟的連接埠範圍:
firewall-cmd --permanent --zone=public --add-port=1-22/tcp
firewall-cmd --permanent --zone=public --add-port=1-22/udp
這僅適用於連接埠 1 到 22。
現在,重新加載您所做的事情。
firewall-cmd --reload
並檢查你的工作:
firewall-cmd --zone=public --list-all
附註/社論:這並不重要,但我喜歡firewalld中白名單IP組的「可信」區域。您可以透過閱讀進行進一步評估redhat 關於選擇區域的建議。
也可以看看:
- 使用防火牆的 RHEL 7 文章
- Fedora FirewallD 文檔(相當不錯,fedora 使用firewalld已經有一段時間了)
如果您想要DROP
在此來源之外的資料包,這裡有一個範例,用於刪除/24
我之前用作範例的外部的資料包,你可以為此使用豐富的規則, 我相信。這是概念性的,我還沒有測試過它(除了看到 centos 7 接受命令之外),但是,應該很容易執行 pcap 並看看它的行為是否如您所期望的那樣
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.0/24" invert="True" drop'
答案2
即使答案已被接受並被投票,我也不認為它是正確的。我無法在文件中找到明確的解釋,但從實現的行為來看,它看起來像這樣:
- 介面和來源用作選擇器 - 要啟動哪個區域
- 對於預設區域,兩者都會被忽略(始終處於活動狀態)
所以答案是:
- 鎖定預設區域,例如“公共” - 沒有開放的連接埠或可用的服務
- 在另一個區域,說“工作” - 定義來源和開放端口
例如,假設預設區域是公共區域並且沒有開放端口,請將來源和連接埠範圍新增至“工作”區域:
$ sudo firewall-cmd --zone=work --add-source=192.168.0.0/24
$ sudo firewall-cmd --zone=work --add-port=8080-8090/tcp
現在檢查活動區域(預設區域始終處於活動狀態):
$ sudo firewall-cmd --get-active-zones
你會得到:
work
sources: 192.168.0.0/24
因此「工作」區域規則將適用於特定子網路。您將擁有一系列“白名單”開放端口=子網按照要求。當然,--permanent
在語句中使用選項--add-xxx
可以讓行為堅持下去。
反過來,您在「公共」(預設)區域中擁有的任何連接埠或服務將適用於所有介面和來源位址。
$ sudo firewall-cmd --list-all-zones
public (default)
interfaces:
sources:
services:
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
work (active)
interfaces:
sources: 192.168.0.0/24
services: dhcpv6-client ipp-client ssh
ports: 8080-8090/tcp
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
相同的系統也適用於介面。透過將介面“ens3”加入到“工作”區域來表示:
$ sudo firewall-cmd --zone=work --add-interface=ens3
您將對來自特定介面的任何請求使用“工作”區域規則 - 比“來源”更粗略的選擇器。
答案3
免責聲明:我實際上還沒有嘗試過我在這裡建議的內容,但它與我上次所做的防火牆設定相當接近,所以我將不再這樣做。 Firewalld 為您提供了一些預先配置的區域,就是為了這個目的。有一種稱為“drop”,它會丟棄任何傳入的內容,還有一種稱為“trusted”,它允許任何連接(即,我認為您甚至不需要打開單獨的連接埠)。訣竅是找到正確的區域來觸發你想要的東西。
Firewalld 將根據以下優先順序應用區域規則:
- 如果來源 IP 與綁定到區域的來源 IP 匹配,則使用該來源 IP。
- 如果來源 IP 與任何特定區域都不匹配,則會檢查是否有為該來源配置的區域介面數據包進來了。如果有的話,它就會使用它。
- 最後,如果沒有其他匹配,它將使用預設區域。
因此,首先,您需要將可信任 IP 綁定到「可信任」區域:
firewall-cmd --permanent --zone=trusted --add-source=1.2.3.4
然後,將預設區域設為“drop”或將您的介面綁定到它:
firewall-cmd --permanent --set-default-zone=drop
firewall-cmd --permanent --zone=drop --change-interface=eth0
然後使變更生效(警告:如果您透過網路執行此操作並且沒有將來源 IP 新增至受信任區域,這可能會中斷您的連線):
firewall-cmd --reload
當然,您也可以透過省略「--permanent」來暫時測試這些(然後您也不必--reload)。
答案4
我很驚訝受信任區域的答案不是選定的答案。受信任區域有一個預設的“target: ACCEPT”,而其餘的都是“target: default”。雖然這實際上並不重要,但由於其名稱和預設目標值,它似乎是預期的方法。
如何快速鎖定盒子以便只有您可以訪問它:
firewall-cmd --zone=trusted --add-source=1.2.3.4
firewall-cmd --zone=trusted --add-source=5.6.7.8/24
firewall-cmd --zone=drop --change-interface=eth1
firewall-cmd --set-default-zone=drop
firewall-cmd --runtime-to-permanent
firewall-cmd --reload
firewall-cmd --list-all-zones
列出所有區域後,您應該看到如下內容:
trusted (active)
target: ACCEPT
icmp-block-inversion: no
sources: 1.2.3.4 5.6.7.8/24
masquerade: no
drop (active)
target: DROP
icmp-block-inversion: no
interfaces: eth1
masquerade: no
注意:我刪除了具有空值/缺失值的行。重要的是,trusted 和 drop 都是(活動的)並且 drop 有你的公共介面。
示範這對 iptables 的作用:
Chain INPUT_ZONES_SOURCE (1 references)
target prot opt source destination
IN_trusted all -- 1.2.3.4 0.0.0.0/0
IN_trusted all -- 5.6.7.8/24 0.0.0.0/0
Chain INPUT_ZONES (1 references)
target prot opt source destination
IN_drop all -- 0.0.0.0/0 0.0.0.0/0
IN_drop all -- 0.0.0.0/0 0.0.0.0/0
IN_drop all -- 0.0.0.0/0 0.0.0.0/0