Linux

firewalld 阻止來自預分配 IP 的 ICMP 流量除外

  • February 15, 2018

我一直在嘗試將 iptables 設置轉換為新伺服器上的 firewalld。現有規則阻止 ICMP,但來自 IP 子集的除外。只有來自我們 IT 子網 (192.168.10.0/24) 和我們的監控伺服器 (10.10.10.10) 的人應該能夠 ping 伺服器。在某些情況下,額外的伺服器會啟用額外的 IP 來獲得 ping 響應。

iptables -I INPUT -p ICMP -j DROP
iptables -I INPUT -p ICMP -s 192.168.10.0/24 -j ACCEPT
iptables -I INPUT -p ICMP -s 10.10.10.10 -j ACCEPT
iptables -I INPUT -p ICMP -s N.N.N.N -j ACCEPT

然後,當我嘗試應用類似的規則時,使用 firewalld 豐富的規則,我能夠創建一個規則來允許 IT 子網或監控伺服器,但不能同時允許兩者。我似乎遇到了與此問題中描述的相同的問題。我已經看到其他幾個頁面提出了解決方案,但都以某種方式失敗了。我已經將我的測試框恢復為預設值。

更新此 ICMP 規則後,我將需要編寫更嚴格的 SSH 訪問列表,它允許 IT 範圍的較小子集訪問這些機器。此時在此過程中添加 SSH 規則會產生意想不到的結果。

rich rules:
   rule family="ipv4" source address="192.168.10.0/24" accept
   rule family="ipv4" source address="10.10.10.10" accept
   rule family="ipv4" source NOT address="192.168.10.0/24" drop

這些規則的結果是:

  1. 阻止所有流量,而不僅僅是 ICMP
  2. 如果沒有“NOT address drop”行,我可以在我不應該能夠ping通的設備上ping伺服器
  3. 使用“NOT address drop”行,我無法從位於 10.10.10.10 的監控伺服器 ping
  4. 使用上面的命令將規則添加到 iptables 確實有效,但在重新啟動時會被刪除

更新 1 我按照建議重新審視了多區域方法。問題似乎是我的“ssh”人員正在趕上我的 ITsubnet 區域。這會阻止他們進行 SSH 訪問。

# firewall-cmd --zone=ITsubnet --list-all
ITsubnet (active)
 target: default
 icmp-block-inversion: no
 interfaces:
 sources: 192.168.10.0/24
 services:
 ports:
 protocols:
 masquerade: no
 forward-ports:
 source-ports:
 icmp-blocks:
 rich rules:

# firewall-cmd --zone=MonitoringSRV --list-all
MonitoringSRV (active)
 target: default
 icmp-block-inversion: no
 interfaces:
 sources: 10.10.10.10
 services:
 ports:
 protocols:
 masquerade: no
 forward-ports:
 source-ports:
 icmp-blocks:
 rich rules:

# firewall-cmd --zone=SSH_Access --list-all
SSH_Access (active)
 target: default
 icmp-block-inversion: no
 interfaces:
 sources: 192.168.10.10
 services: ssh
 ports:
 protocols:
 masquerade: no
 forward-ports:
 source-ports:
 icmp-blocks:
 rich rules:

# firewall-cmd --zone=public --list-all
public (active)
 target: DROP
 icmp-block-inversion: no
 interfaces: eno16777984
 sources:
 services:
 ports:
 protocols:
 masquerade: no
 forward-ports:
 source-ports:
 icmp-blocks:
 rich rules:

PS發現這個解釋器有幫助。

用於在UPDATE 1中進行更改的命令

firewall-cmd --permanent --new-zone=ITsubnet
firewall-cmd --permanent --new-zone=MonitoringSRV
firewall-cmd --permanent --new-zone=SSH_access
firewall-cmd --reload
firewall-cmd --permanent --zone=ITsubnet --add-source=192.168.10.0/24
firewall-cmd --permanent --zone=MonitoringSRV --add-source=10.10.10.10
firewall-cmd --permanent --zone=SSH_access --add-source=192.168.10.10
firewall-cmd --permanent --zone=public --remove-service=ssh
firewall-cmd --permanent --zone=SSH_access --add-service=ssh
firewall-cmd --permanent --zone=public --set-target=DROP
firewall-cmd --reload

甚至從 192.168.10.10 阻止所有 ssh 訪問。

用於在UPDATE 2中進行更改的命令

區域名稱似乎會影響順序,因此在 SSH_access 之前處理 ITsubnet。這得到了證實:

iptables -S

或者

iptables -vnL

因此,更改區域名稱以獲得更具體的規則以首先處理此問題。

firewall-cmd --permanent --delete-zone=SSH_Access
firewall-cmd --permanent --new-zone=A1_First010
firewall-cmd --permanent --zone=A1_First010 --add-source=192.168.10.10
firewall-cmd --permanent --zone=A1_First010 --add-service=ssh

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