![/etc/hosts.deny 并非每次都生效](https://linux22.com/image/643694/%2Fetc%2Fhosts.deny%20%E5%B9%B6%E9%9D%9E%E6%AF%8F%E6%AC%A1%E9%83%BD%E7%94%9F%E6%95%88.png)
首先我的sshd里面已经有libwrap.so了,检查结果如下:
root@FS9000:~# ldd sshd | grep libwrap
libwrap.so.0 => /usr/lib/libwrap.so.0 (0x000000555e3fa000)
当我像这样配置 /etc/hosts.deny 时(没有 /etc/hosts.allow):
sshd: ALL
这样任何IP访问服务器都会被封,效果很明显。
当我像这样配置 /etc/hosts.deny 时:
sshd: 192.168.1.30
我尝试从192.168.1.30访问服务器,登录成功,没有任何阻止!
好像无法屏蔽指定IP,很奇怪,可能是什么问题?
PS:我在嵌入式系统中尝试过,使用busybox(v1.22.1),sshd来自openssh-6.3p1。
所有的测试都是在本地网络中进行的,下面是sshd连接的详细信息。192.168.1.30是一个linux客户端,192.168.1.212是嵌入式系统。
root@FS9000:~# cat /etc/hosts.deny 全部:192.168.1.30
root@FS9000:~# env | grep SSH SSH_CLIENT=192.168.1.30 36425 22 SSH_TTY=/dev/pts/0 SSH_CONNECTION=192.168.1.30 36425 192.168.1.212 22
root@FS9000:~# netstat -antp 活动的 Internet 连接(服务器和已建立) Proto Recv-Q Send-Q 本地地址 外部地址 状态 PID/程序名称
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1726/portmap tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 1770/vsftpd tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 2359/sshd tcp 0 0 192.168.1.212:22 192.168.1.30:36425 ESTABLISHED 3256/0 tcp 0 0 :::22 :::* LISTEN 2359/sshd tcp 0 0 :::23 :::* 监听 2148/telnetd
4.配置/etc/hosts.deny如下:
root@FS9000:~# cat /etc/hosts.deny
ALL: ALL :\
spawn (/bin/echo "%d connection to %N from %n[%a] denied" > /dev/pts/1)
pts/1 is one telnetd connection,telnetd doesn't support libwrap,so all telnetd connections won't be blocked. Then I tried access 1.212 from 1.30, it prints this(and of course it blocked successfully):
sshd connection to unknown from unknown[0.0.0.0] denied
当像这样配置 /etc/hosts.deny 时:
sshd: 192.168.0.0/24 127.0.0.1 [ffe0::]/10 [::1]
仍然无法屏蔽192.168.0.0/24内的任何IP,192.168.1.30也可以访问它。
答案1
也许您没有使用 IP 地址 192.168.1.30 连接到 sshd。
你可以让(某些)ssh 程序使用特定的接口-b
-b bind_address 使用本地机器上的 bind_address 作为连接的源地址。只在有多个地址的系统上有用。
因此尝试
ssh -b 192.168.1.30 [email protected]
答案2
如果您没有连接到本地网络上的主机,则看到的地址sshd
将无法192.168.1.30
通过 Internet 路由。如果您在本地网络上的主机之间进行连接,大多数系统将首先尝试 IPv6。IPv6 并不容易按主机阻止,因为主机通常配置为使用隐私扩展并定期更改其 IP 地址。
如果这是您有权访问的主机,则使用 ssh 连接后,检查您连接的 IP 地址。 sshd
导出有关与环境的连接的信息。您可以使用命令查看此信息env | grep SSH
。
您可能希望实现一个几乎封闭的配置。在测试时保持连接打开,配置/etc/hosts.deny
以阻止所有连接,如下所示。
ALL: ALL :\
spawn (/bin/echo "%d connection to %N from %n[%a] denied" | \
/usr/bin/mailx -s "Access Denied - %d" root@localhost)
然后允许通过服务和/或网络地址进行访问。您可以按 DNSPTR
记录查找返回的名称以及地址范围进行阻止。以下仅允许从本地网络进行访问,但阻止路由器访问。
sshd: 192.168.0.0/24 127.0.0.1 \
[ffe0::]/10 [::1] \
EXCEPT 192.168.0.1
您还可以添加电子邮件通知以接受规则。如果您不想要通知,可以将其删除。如果您的服务不记录访问,您可以使用类似的规则通过向日志守护程序发送消息来记录访问。