我有一个包含一些 iptables 规则的脚本。当我使用“ssh”在另一台主机上执行此脚本时,此调用会阻塞约 2 小时。
这是脚本的内容。其目的是阻止除 ssh、http(s)、icmp 和广播 udp-discovery 之外的所有流量:
iptables -F
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dport 22,80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p udp -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --sport 22,80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A OUTPUT -p udp -j ACCEPT
我通过以下调用执行脚本:
sshpass -p <pwd> ssh root@<host> '/bin/sh -s' < script.sh
并且大多数时候(并非总是),此调用会挂起并在 7300 秒后中断。我做过 s-trace。似乎只有在设置某些 iptables 规则时才会发生这种情况,通过 ssh 执行任何其他命令都没有问题,尽管 s-trace 相同,但中断发生在 0.1 秒后。
0.000092 wait4(4075588, 0x7ffd2d32bdec, WNOHANG, NULL) = 0
0.000086 pselect6(4, [3], NULL, NULL, NULL, {[], 8}) = ? ERESTARTNOHAND (To be restarted if no handler)
7303.455216 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=4075588, si_uid=1005, si_status=255, si_utime=2, si_stime=0} ---
0.000332 rt_sigreturn({mask=[CHLD]}) = -1 EINTR (Interrupted system call)
0.000328 wait4(4075588, [{WIFEXITED(s) && WEXITSTATUS(s) == 255}], WNOHANG, NULL) = 4075588
0.000423 exit_group(255) = ?
0.000645 +++ exited with 255 +++
奇怪的是,iptables 规则在 7300 秒后正确设置,但添加了一条额外的规则:ACCEPT all -- anywhere anywhere
针对 INPUT 和 OUTPUT 链。
有人可以解释一下这种行为吗?
谢谢