我有一個問題無法僅用 SSH 和 iptables 來解釋。簡而言之:如果我使用 SSH 連線到遠端主機(執行 Ubuntu 18.04)並執行腳本來套用 iptables 規則,我會遺失正在執行的 SSH 會話。我可以再次連接,但我的跑步會話丟失了。
腳本使用以下命令刷新 iptables 規則netfilter-persistent flush
,然後按iptables-save
以下格式套用此規則集:
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m state --state INVALID -j DROP
-A INPUT -s x.x.x.x/XX -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j LOG --log-prefix "INPUT DROP: "
-A FORWARD -j LOG --log-prefix "FORWARD DROP: "
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -m state --state INVALID -j DROP
-A OUTPUT -d x.x.x.x/XX -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A OUTPUT -d x.x.x.x/32 -p udp -m udp --dport 53 -j ACCEPT
-A OUTPUT -d x.x.x.x/32 -p udp -m udp --dport 123 -j ACCEPT
-A OUTPUT -d x.x.x.x/32 -p tcp -m tcp --dport 3128 -j ACCEPT
-A OUTPUT -j LOG --log-prefix "OUTPUT DROP: "
COMMIT
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
*raw
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
腳本完成後,我的會話丟失,並且我可以在/var/log/kern.log
.如果連線追蹤資訊遺失,這是有意義的,但我仍然可以連線conntrack -L
(伺服器是虛擬機,所以即使我的 SSH 連線遺失我也可以檢查)。
更奇怪的是,如果我這樣做netfilter-persistent flush && ./myscript
,我的連結就會保留;但如果我依序運行這兩個命令,我就會失去連線。另外,如果我在 VM TTY 上執行這兩個命令,我不會失去連線。
誰能解釋這種行為?
答案1
您的預設策略設定為“DROP”。
因此,在刷新和添加規則之間的時間內,沒有資料包被接受,並且您失去了連接...
如果您的腳本無法新增規則,那麼您就完蛋了。
您應該將策略設定為接受並在(每個鏈的)末尾添加一條規則以刪除所有不匹配的內容...