这是我的问题:为什么 iptables 无法阻止 SSH 连接到本地主机?
更详细的描述如下。
在尝试 iptables 的过程中,我遇到了以下我想了解的好奇心。即使我将每个策略设置为 DROP,我仍然可以通过 SSH 在本地访问计算机。
这就是我正在做的事情。
首先,我将iptables
所有 POLICY 值设置为 DROP:
cat <<HEREDOC | sudo iptables-restore
*filter
:INPUT DROP
:FORWARD DROP
:OUTPUT DROP
COMMIT
*mangle
:PREROUTING DROP
:INPUT DROP
:FORWARD DROP
:OUTPUT DROP
:POSTROUTING DROP
COMMIT
*nat
:PREROUTING DROP
:POSTROUTING DROP
:OUTPUT DROP
:INPUT DROP
COMMIT
*raw
:PREROUTING DROP
:OUTPUT DROP
COMMIT
HEREDOC
然后我尝试通过 SSH 连接:
ssh localhost
而且,令我惊讶的是,这有效!我看到了一个新的 shell 会话,就好像没有防火墙一样。作为健全性检查,我然后尝试 ping localhost,这会导致以下错误消息:
ping: sendmsg: Operation not permitted
这似乎表明防火墙实际上正在运行。最后我尝试使用 IP 地址进行 SSH
ssh 127.0.0.1
正如我所预料的,这会挂起。
所以我最好的客人是,当 SSH 将字符串“localhost”作为参数传递时,它会做一些不同的事情 - 这实际上并不涉及环回接口。如果事实确实如此,那么我的问题就变成了“ssh 到底在做什么?”
答案1
最有可能的是,解析为未被(使用)过滤的localhost
IPv6 地址 ( ) 。::1
iptables
ip6tables
输出:
strace -e connect ssh localhost
会告诉你使用什么IP地址和什么协议。
答案2
正如 xhienne 所建议的,它可能连接到 ::1。你可以试试ssh -vv 本地主机并查看 ssh 的完整调试输出。
# ssh -vvv localhost
OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 Mar 2010
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug2: ssh_connect: needpriv 0
debug1: Connecting to localhost [::1] port 22.