CentOS 7 中的白名單來源 IP 位址

CentOS 7 中的白名單來源 IP 位址

我想設定 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

(這會新增一個完整的/24IP和一個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 關於選擇區域的建議

也可以看看:


如果您想要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

即使答案已被接受並被投票,我也不認為它是正確的。我無法在文件中找到明確的解釋,但從實現的行為來看,它看起來像這樣:

  1. 介面和來源用作選擇器 - 要啟動哪個區域
  2. 對於預設區域,兩者都會被忽略(始終處於活動狀態)

所以答案是:

  1. 鎖定預設區域,例如“公共” - 沒有開放的連接埠或可用的服務
  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

相關內容