分享文章到朋友圈
海报分享
SSH之规则配置
1一个线上问题引发的思考
今天中午在搭建MHA的测试环境的时候,出现了一个问题,简单记录如下:
环境介绍:
主库IP:192.168.124.68
从库IP:192.168.124.128
主库--->从库:
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