Linux
配置 iptables:在 SSH 上被屏蔽
我正在嘗試配置基於 CentOS 6.4 的測試伺服器。我已將預設 SSH 埠更改為另一個埠 56988。現在我正在嘗試創建一組規則,以便:
- 最多允許 56988 上的連接(以防止暴力破解)
- 接受 80 和 443 上的傳入和傳出連接,僅限於防止 DOS 攻擊
- 阻止其他一切
為了實現這一點,我編寫了一個小 bash 腳本:
#! iptables -F iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP iptables -A INPUT -p tcp --dport 56988 -m state --state NEW -m recent --set --name ssh -rsource iptables -A INPUT -p tcp --dport 56988 -m state --state NEW -m recent --update --seconds 60 --hitcount 8 --rttl --name ssh -j DROP iptables -A OUTPUT -p tcp --sport 56988 -m state --state ESTABLISHED -j ACCEPT iptables -A INPUT -p tcp --dports 80,443 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sports 80,443 -m state --state ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --dports 80,443 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -p tcp --sports 80,443 -m state --state ESTABLISHED -j ACCEPT iptables -A INPUT -p tcp --dports 80,443 -m state --state NEW -m limit --limit 50/minute --limit-burst 200 -j ACCEPT iptables -A INPUT -m state --state RELATED,ESTABLISHED -m limit --limit 50/second --limit-burst 50 -j ACCEPT /etc/init.d/iptables save
雖然在執行這個之後,我被 SSH 屏蔽了。我在這個配置上做錯了什麼?提前致謝!
我很高興看到您已經澄清了有關埠號的問題。現在,我所做的只是將 Karma Fusebox 和 Laurentiu Roescu 的評論正式化,因為他們已經確定了實際問題:您指定要丟棄哪些 ssh 數據包,但從不指定要接受哪些數據包。您需要插入一行,如下所示:
iptables -A INPUT -p tcp --dport 56988 -m state --state NEW -m recent --set --name ssh -rsource iptables -A INPUT -p tcp --dport 56988 -m state --state NEW -m recent --update --seconds 60 --hitcount 8 --rttl --name ssh -j DROP ###### new line is the next one ######### iptables -A INPUT -p tcp --dport 56988 -j ACCEPT ###### new line was the previous one #### iptables -A OUTPUT -p tcp --sport 56988 -m state --state ESTABLISHED -j ACCEPT
你明白為什麼嗎?您的 INPUT 鏈有一堆關於速率限制的邏輯,並拒絕任何超過速率限制的數據包 - 但它永遠不會為那些未通過速率限制測試的新數據包提供任何規定,因此它們通過整個鏈並死在策略上(DROP)。
我會贊成 vasco.debian 的回答,但是這條新線路的位置很重要。因為 iptables 以先決勝負的方式工作,所以新行必須在速率限制行之後;否則所有NEW 數據包都將匹配這條新行,並且永遠不會首先針對速率限制行進行測試。