/etc/hosts.deny 并非每次都生效

/etc/hosts.deny 并非每次都生效

首先我的sshd里面已经有libwrap.so了,检查结果如下:

root@FS9000:~# ldd sshd | grep libwrap
libwrap.so.0 => /usr/lib/libwrap.so.0 (0x000000555e3fa000)
  1. 当我像这样配置 /etc/hosts.deny 时(没有 /etc/hosts.allow):

    sshd: ALL
    

    这样任何IP访问服务器都会被封,效果很明显。

  2. 当我像这样配置 /etc/hosts.deny 时:

    sshd: 192.168.1.30
    

    我尝试从192.168.1.30访问服务器,登录成功,没有任何阻止!

好像无法屏蔽指定IP,很奇怪,可能是什么问题?

PS:我在嵌入式系统中尝试过,使用busybox(v1.22.1),sshd来自openssh-6.3p1。


  1. 所有的测试都是在本地网络中进行的,下面是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

您还可以添加电子邮件通知以接受规则。如果您不想要通知,可以将其删除。如果您的服务不记录访问,您可以使用类似的规则通过向日志守护程序发送消息来记录访问。

相关内容