我在我的 ubuntu 10.04.04 服务器上使用 /etc/hosts.deny 和 ufw 的组合。大多数时候,我看到来自 .com.cn 域中的机器的 ssh 尝试失败,报告如下:
Failed logins from:
112.114.63.139 (139.63.114.112.broad.km.yn.dynamic.163data.com.cn): 1 time
但是,在 /etc/hosts.deny 中,我有这条规则:
ALL: .com.cn
这不应该在连接到 ssh 之前就阻止连接吗?我已经通过阻止我的家用机器对其进行了测试,它肯定会在我收到登录提示之前立即拒绝我的连接(是的,我已经将我的 ssh 密钥移开,因此不涉及这些)。
这是按预期工作吗?
编辑: James Sneeringer 提示我更仔细地查看日志,也许我明白了为什么会这样。来自 auth.log:
Nov 5 09:38:40 mymachine sshd[22864]: warning: /etc/hosts.deny, line 21: can't verify hostname: getaddrinfo(139.63.114.112.broad.km.yn.dynamic.163data.com.cn, AF_INET) failed
Nov 5 09:38:44 mymachine sshd[22864]: reverse mapping checking getaddrinfo for 139.63.114.112.broad.km.yn.dynamic.163data.com.cn [112.114.63.139] failed - POSSIBLE BREAK-IN ATTEMPT!
Nov 5 09:38:45 mymachine sshd[22864]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=112.114.63.139 user=root
Nov 5 09:38:47 mymachine sshd[22864]: Failed password for root from 112.114.63.139 port 37245 ssh2
Nov 5 09:38:47 mymachine sshd[22866]: Connection closed by 112.114.63.139
这对我来说意味着如果 sshd 不确定 IP-> 名称查找,那么它会谨慎行事并且不会阻止该主机。那正确吗?
这对于 sshd 是预期的,因为它直接链接到 libwrap,所以 sshd 实际上是执行主机检查的。如果你想在调用 sshd 之前阻止连接,你需要在它前面放置一些东西来处理连接尝试,然后再将它传递给 sshd。几个选择是:
在 inetd(或 xinetd)下运行 sshd。这将允许您调用 sshd 作为 tcpd 的参数,而 tcpd 最终执行实际的主机检查。
在 xinetd 下运行 sshd,它具有提供类似于 /etc/hosts.allow 和 /etc/hosts.deny 功能的服务选项
only_from
。no_access
但是,sshd 联机帮助页不鼓励使用这些方法:
使用 iptables 或在服务器前面放置防火墙似乎是一个不错的选择,但大多数都不执行任何名称解析,因此您只能通过 IP 地址控制访问。这不一定是坏事,但对您要实现的目标没有帮助。