
更新:
我已經嘗試過sudo iptables -A INPUT -p tcp --dport 22 ! -s 1.2.3.4,11.22.33.44 -j DROP
,但不起作用,它給了我一個錯誤
iptables v1.8.2 (nf_tables): !不允許有多個來源或目標 IP 位址
例如,我的目標是僅允許1.2.3.4
並11.22.33.44
連接我的伺服器的 ssh(連接埠 22)。
我更喜歡這種方法/命令而不是其他方法/命令。
sudo iptables -A INPUT -p tcp --dport 22 ! -s 1.2.3.4 -j DROP
但我不知道如何11.22.33.44
在此命令中添加另一個允許的IP,
您能給我一點幫助或提示嗎?
謝謝。
答案1
定義多種的僅使用地址一 iptables
! --source
無法使用命令。
位址可以是網路名稱、主機名稱(使用主機名稱可能是一個非常糟糕的主意)、網路 IP 位址(帶有 /mask)或普通 IP 位址。遮罩可以是網路遮罩或普通數字。
您可以考慮將預設規則集從允許變更為刪除。這將允許您僅基於應該允許的內容進行定義,即類似如下:
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
... your other rules goes here ...
iptables -A INPUT -m state --state NEW -p tcp --dport 22 -s 1.2.3.4,11.22.33.44 -j ACCEPT
iptables -P INPUT DROP
好處/美妙之處在於,由於考慮了包的狀態,這樣的規則集的性能會更高。另外它允許所需的語法。 Plus 也是定義防火牆規則的建議方法。
但是,請記住,如果使用如上所示的語法:-s 1.2.3.4,11.22.33.44
仍然會建立 2 個單獨的表格條目,如使用命令 所示iptables -L INPUT
。此外,它並不適用於所有版本的 iptables。此外,我個人發現它很難閱讀或維護。這就是為什麼我試圖避免它,而是使用兩個單獨的命令。
如果您希望最大程度地減少規則數量,您最接近的做法就是使用一 iptables
規則--match
改為使用--source
.但是,您仍然需要使用其他命令來定義匹配。這是如何工作的已經在其他涉及 ipset 的評論中得到了完美的解釋。
答案2
您可以使用IP設定。
根據您的發行版,您可能需要ipset
先安裝該實用程式。
#(For Debian and Debian-derived distros)
sudo apt install ipset-persistent
然後您創建一個具有友好名稱的集合。
sudo ipset create ssh_friends iphash
一旦你有了一套,你就可以在其中加入IP。
sudo ipset add ssh_friends 1.2.3.4
sudo ipset add ssh_friends 11.22.33.44
現在,您可以使用在規則中建立的集合iptables
而不是單一 IP。
sudo iptables -A INPUT -p tcp --destination-port 22 -m set ! --match-set ssh_friends src -j DROP