前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SSH之hosts.allow和hosts.deny文件

SSH之hosts.allow和hosts.deny文件

作者头像
AsiaYe
发布2019-11-06 15:33:13
13.3K0
发布2019-11-06 15:33:13
举报
文章被收录于专栏:DBA随笔DBA随笔

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中的内容,大致如下:

代码语言:javascript
复制
#
# 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完全可以省略的。

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

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

也就是:

代码语言:javascript
复制
daemon, daemon, ...: client, client, ...: option

其中:

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

option的内容包括:

代码语言:javascript
复制
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中写下如下的规则:

代码语言:javascript
复制
 cat /etc/hosts.allow
 sshd:192.168.0.0

 cat /etc/hosts.deny
 sshd:ALL

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

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

最后我们看一个例子:

代码语言:javascript
复制
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

这个例子中每一行规则的意思如下:

第1行:允许使用 telnet 和 ssh 访问以下域:myweb.com域

第2行:允许从 myweb.com 域中的所有主机上进行 ftp 访问,除了 myweb.com 中的两个主机:user1 和 user2

第3行:允许从 192.168.6.网段和192.168.7.网段的所有主机上进行telnet和ssh 访问

第4行:拒绝192.168.8.网段和192.168.9.网段所有主机进行telnet访问

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档