相关文章推荐
苦恼的伤痕  ·  Python - ...·  1 年前    · 
酷酷的匕首  ·  c++ - Inspecting ...·  1 年前    · 
文雅的领结  ·  java - Junit 5 - No ...·  1 年前    · 
备案 控制台
学习
实践
活动
专区
工具
TVP
写文章
专栏首页 DBA随笔 SSH之hosts.allow和hosts.deny文件
2 1

海报分享

SSH之hosts.allow和hosts.deny文件

SSH之规则配置

1一个线上问题引发的思考

今天中午在搭建MHA的测试环境的时候,出现了一个问题,简单记录如下:

环境介绍:

主库IP:192.168.124.68

从库IP:192.168.124.128

主库--->从库:

ping 正常

telnet 正常

从库--->主库

ping 正常

telnet 正常

主从关系:

IO线程:yes

SQL线程:yes

防火墙:主从节点都开通了192.168.124.0/24段。

存在问题:

主库和从库之间的SSH不通。

解决方法:一开始以为是防火墙开通有问题,但是发现telnet是通的,防火墙应该没有问题,重新检查防火墙内容,添加对应的规则之后,发现问题还没有解决,这个时候查询网上资料,显示可能是hosts.allow文件没有添加相应的规则,于是查询hosts.allow文件,对比之前的正确测试环境,发现目前在建的这套环境里面没有配置相关的hosts.allow网段,重新配置之后,问题解决。这里,看到了hosts.allow和hosts.deny这两个文件,于是研究了一下这两个文件的差别。

2hosts.allow和hosts.deny

hosts.allow和hosts.deny是linux系统/etc/目录中的两个文件,hosts.allow和hosts.deny规则的执行者为TCP wrappers,对应守护进程为tcpd;而tcpd执行依赖于程序使用了libwrap库,也就是说,hosts.allow和hosts.deny支持且只支持使用了libwrap库的服务。 这里可以简单了解下tcp_wrappers,它是linux中一个安全机制[TCP_wrappers防火墙],一定程度上限制某种服务的访问权限,达到了保护系统的目的。

我们可以简单理解为:/etc/hosts.allow和/etc/hosts.deny两个文件是控制远程访问设置的,通过他可以允许或者拒绝某个ip或者ip段的客户访问linux的某项服务。

简单看下hosts.allow中的内容,大致如下:

#
# hosts.allow This file describes the names of the hosts which are
# allowed to use the local INET services, as decided
# by the '/usr/sbin/tcpd' server.
sshd:192.168.18.*:allow
sshd:192.168.224.*:allow

可以看到,上面的文件中写了两个IP地址段,IP地址段后面都跟着allow,顾名思义,这是允许访问的IP段,实际上,它的工作原理是这样的:

1. 当有请求从远程到达本机的时候

首先检查/etc/hosts.allow

如有匹配的,就默认允许访问,跳过 /etc/hosts.deny这个文件

没有匹配的,就去匹配/etc/hosts.deny 文件,如果有匹配的,那么就拒绝这个访问

2. 如果在这两个文件中,都没有匹配到,默认是允许访问的

上面的这种写法表示允许18和224两个ip段连接sshd服务(这必然需要hosts.deny这个文件配合使用),当然:allow完全可以省略的。

再来说说这两个文件中设置规则的 具体格式

服务列表 :地址列表 :选项

也就是:

daemon, daemon, ...: client, client, ...: option

其中:

daemon    表示要监控的服务,如 telnetd、ftpd、sshd
client    表示主机名、IP 地址/IP 范围,或域名
option    具体选项

option的内容包括:

allow    允许对客户端的访问
deny     拒绝对客户端的访问
except   会匹配第一个列表中所有项,除非匹配第二个列表。例如,允许 domainA 中所有项,除了 hostX.domainA 和 hostY.domanA。

A. 服务列表格式:如果有多个服务,那么就用逗号隔开 B. 地址列表格式: 1. 标准IP地址:例如:192.168.0.254,192.168.0.56如果多于一个用,隔开 2. 主机名称:例如:www.baidu.com 3. 利用掩码:192.168.0.0/255.255.255.0指定整个网段 注意:tcp_wrappers的掩码只支持长格式,不能用:192.168.0.0/24这种模式 4. 网络名称:例如 @mynetwork

除此之外,还包含一些宏定义:

ALL :指代所有主机 LOCAL :指代本地主机 KNOWN :能够解析的 UNKNOWN :不能解析的

简单看个宏定义的例子,我们分别在/etc/hosts.allow和/etc/hosts.deny中写下如下的规则:

 cat /etc/hosts.allow
 sshd:192.168.0.0
 cat /etc/hosts.deny
 sshd:ALL

这个规则表明,sshd服务只允许192.168.0.0网段的主机访问,其他拒绝。

上面的规则都需要根据两个文件进行规则匹配,根据规则的灵活性,我们也可以只用一个文件,通常是 hosts.allow 来包含 所有规则,在那些需要拒绝的ip后面跟上deny选项即可。如果在某些测试环境中这些规则我们暂时不想使用,以后的某个时候可能会重新启用,只需要将这两个文件的名称临时改掉,在需要使用的时候重新改回来即可。

最后我们看一个例子:

telnetd,sshd:.myweb.com :allow
ftpd:.myweb.com except user1.myweb.com, user2.myweb.com : allow
telnetd,sshd:192.168.6. , 192.168.7.: allow
telnetd :192.168.8., 192.168.9.: deny