我正在运行 Arch Linux,并且有一个正在运行的 SSH 守护进程,可以在我位于 LAN 之外时访问我的计算机。我可以连接,但 iptables 一直阻止 SSH Daemon,所以只有关闭防火墙才能连接。我在端口 5000 上运行 SSH。
我的 iptables 规则
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p icmp -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
# SSH
-A INPUT -p tcp --dport 22 -j REJECT --reject-with icmp-host-unreachable
-A INPUT -p tcp --dport 5000 -j ACCEPT
# VNC
-A INPUT -p tcp --dport 5001 -j REJECT --reject-with icmp-host-unreachable
-A INPUT -p tcp -i lo -s 127.0.0.1/32 -d 127.0.0.1/32 --dport 5001 -j ACCEPT
# HTTP/HTTPS
-A INPUT -p tcp --dport 80 -j REJECT --reject-with icmp-host-unreachable
-A INPUT -p tcp --dport 8080 -j REJECT --reject-with icmp-host-unreachable
-A INPUT -p tcp --dport 443 -j REJECT --reject-with icmp-host-unreachable
-A INPUT -p tcp -i lo -s 127.0.0.1/32 -d 127.0.0.1/32 --dport 80 -j ACCEPT
答案1
您必须重新排序 iptables 规则。
您无法连接到 sshd,因为规则是逐行检查的。并且您已经告诉 iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset
= 拒绝所有 tcp 流量。即使您后来告诉他接受端口 5000 的连接也没关系 - 您已经拒绝了这些连接。
因此,当您编写 iptables 规则时,请考虑顺序:首先插入您想要允许的内容,然后拒绝其余内容。