我在我的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,它具有only_from和no_access服务选项,提供类似于/etc/hosts.allow和/etc/hosts.deny的功能.
但是,sshd手册页不鼓励这些方法:
-i Specifies that sshd is being run from inetd(8). sshd is normally not run from inetd because it needs to generate the server key before it can respond to the client,and this may take tens of seconds. Clients would have to wait too long if the key was regenerated every time. However,with small key sizes (e.g. 512) using sshd from inetd may be feasible.
使用iptables或在服务器前放置防火墙似乎是一个不错的选择,但大多数都不执行任何名称解析,因此您只能通过IP地址控制访问.这不一定是坏事,但它对你想要完成的事情没有帮助.