我遇到了一个问题,无法仅用 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
脚本完成后,我的会话丢失了,我可以看到 中两个方向的 SSH 数据包都被阻止了/var/log/kern.log
。如果连接跟踪信息丢失了,这将是有道理的,但我仍然可以连接conntrack -L
(服务器是虚拟机,所以即使我的 SSH 连接丢失,我也可以检查)。
更奇怪的是,如果我这样做netfilter-persistent flush && ./myscript
,我的连接会保持;但如果我一个接一个地运行这两个命令,我就会失去连接。此外,如果我在 VM TTY 上运行这两个命令,我不会失去连接。
有人能解释这种行为吗?
答案1
您的默认策略设置为“DROP”。
因此,在刷新和添加规则之间的时间内,不会接受任何数据包,并且您会失去连接......
如果您的脚本无法添加规则,您就完蛋了。
您应该将策略设置为接受,并在(每个链的)末尾添加一条规则,以删除所有不匹配的内容......