纸上得来终觉浅,绝知此事要躬行。
TCP_Wrappers
是一个工作在应用层的安全工具,它只能针对某些具体的应用或者服务起到一定的防护作用。比如说 ssh
、telnet
、FTP
等服务的请求,都会先受到 TCP_Wrappers
的拦截。TCP_Wrappers
是基于库调用实现的,包名为 tcp_wrappers-lib
。
[root@blog ~]# rpm -ql tcp_wrappers-libs
/usr/lib64/libwrap.so.0
/usr/lib64/libwrap.so.0.7.6
[root@blog ~]# ll /usr/lib64/libwrap.so.0*
lrwxrwxrwx. 1 root root 16 Jul 10 20:22 /usr/lib64/libwrap.so.0 -> libwrap.so.0.7.6
-rwxr-xr-x. 1 root root 42520 Jun 10 2014 /usr/lib64/libwrap.so.0.7.6
1. 机制介绍
了解该功能的实际释放范围和对应配置文件!
TCP Wrappers
是 RHEL7
系统中默认启用的一款流量监控程序,它能够根据来访主机的地址与本机的目标服务程序作出允许或拒绝的操作。换句话说,Linux
系统中其实有两个层面的防火墙,第一种是前面讲到的基于 TCP/IP
协议的流量过滤工具,而 TCP Wrappers
服务则是能允许或禁止 Linux
系统提供服务的防火墙,从而在更高层面保护了 Linux
系统的安全运行。
Linux
上防火墙分为,封包过滤机制的 Netfilter和程序管控机制的 TCP Wrappers。简单来说,TCP Wrappers
就是通过调整和修改 /etc/hosts.allow
和 /etc/hosts.deny
这两个配置文件来管理控制服务的,但并非所有软件都可以使用。
TCP Wrappers
服务的防火墙策略由两个控制列表文件所控制,用户可以编辑允许控制列表文件来放行对服务的请求流量,也可以编辑拒绝控制列表文件来阻止对服务的请求流量。控制列表文件修改后会立即生效,系统将会先检查允许控制列表文件(/etc/hosts.allow
),如果匹配到相应的允许策略则放行流量;如果没有匹配,则去进一步匹配拒绝控制列表文件(/etc/hosts.deny
),若找到匹配项则拒绝该流量。如果这两个文件全都没有匹配到,则默认放行流量。
- 封包过滤机制: 主要是设置软件的防火墙
- 程序管控机制: 并不是所有的服务都是受 tcp_wrappers 管理的,只用采用 libwrap 库的服务才受管理
# 检查服务是否受管理
$ sudo ldd $(which domainname) | grep libwrap
domainname=sshd httpd smb xinetd
......
# sshd
[root@blog ~]# ldd `which sshd` | grep libwrap.so.0
libwrap.so.0 => /lib64/libwrap.so.0 (0x00007fc777586000)
# vsftpd
[root@blog ~]# ldd `which vsftpd` | grep libwrap.so.0
libwrap.so.0 => /lib64/libwrap.so.0 (0x00007fdb8d276000)
# xinetd
[root@blog ~]# ldd `which xinetd` |grep libwrap.so.0
libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f4ae8036000)
2. 工作原理
大致了解一下,其工作原理和使用技巧!
- [1] 当有请求从远程到达本机的时候
首先检查 /etc/hosts.allow
文件的规则
如有匹配到的话,就默认允许访问,跳过 /etc/hosts.deny
这个文件的检查
如果没有匹配到,则去匹配 /etc/hosts.deny
文件,如果有匹配的,那么就拒绝这个访问
- [2] 两个文件均为匹配到
如果在这两个文件中,都没有匹配到,默认是允许访问的
3. 配置文件
注意介绍,配置文件的编写格式和特点!
- 文件编写格式
# 服务列表: 如果有多个服务,那么就用逗号隔开
# 地址列表: 标准IP地址(192.168.1.100)、主机名称(www.baidu.com)、利用掩码(只支持长格式)
服务列表:地址列表:选项
daemon_list: client_list1 [EXCEPT client_list2][:options]
【deamon_list】参数
应用程序文件名称
而非服务名应用程序文件名称列表
彼此间使用逗号或空格分隔All
表示所有服务
【client_list1】参数
IP地址
主机名
域名段
例如.escape.com
,即可以匹配db1.escape.com``node1.web.escape.com
等。网络段
CentOS6 必须使用完整格式的掩码net/mask
,如127.16.111.0/255.255.255.0
,不能使用net/prefix
,如127.16.111.0/24
,从 CentOS7 开始,支持使用net/prefix
短格式的网络段
如172.16.
,相当于172.16.0.0/255.255.0.0
ALL
所有来源主机KNOW
所有能解析到的主机UNKNOW
所有未解析到的主机LOCAL
主机名中不带.
的PARANOID
正反解析不匹配的地址
【EXCEPT client_list2】参数
- 除了
client_list2
的主机之外,client_list1
的都匹配
- 除了
【options】参数
deny
拒绝,主要用于hosts.allow
文件中,实现 deny 功能allow
允许,主要用在hosts.deny
文件中,实现 allow 功能spawn
启动额外应用程序,用的不多twist
无论写在hosts.allow
还是hosts.deny
都是拒绝,并提示
遵循两个原则
编写拒绝策略规则时,填写的是服务名称,而非协议名称
建议先编写拒绝策略规则,再编写允许策略规则,以便直观地看到相应的效果
- 配置文件示例
# hosts.allow
sshd:192.168.10.
sshd:192.168.0.1:allow
# hosts.deny
sshd:*
sshd:ALL
- TCP Wrappers 服务的控制列表文件中常用的参数
客户端类型 | 示例 | 满足示例的客户端列表 |
---|---|---|
单一主机 | 192.168.10.10 | IP 地址为 192.168.10.10 的主机 |
指定网段 | 192.168.10. | IP 段为 192.168.10.0/24 的主机 |
指定网段 | 192.168.10.0/255.255.255.0 | IP 段为 192.168.10.0/24 的主机 |
指定 DNS 后缀 | .escapelife.site | 所有 DNS 后缀为.escapelife.site 的主机 |
指定主机名称 | www.escapelife.site | 主机名称为 www.escapelife.site 的主机 |
指定所有客户端 | ALL | 所有主机全部包括在内 |
4. 实例演示
展示常用的服务规则配置!
- [1] 不允许 172.16.111.100 的 ftp 访问
$ vim /etc/hosts.deny
vsftpd : 172.16.111.100
- [2] 仅允许 172.16.111.网段的 ftp 访问
$ vim /etc/hosts.allow
vsftpd : 172.16.111.
$ vim /etc/hosts.deny
vsftpd : ALL
- [3] 仅允许 172.16.111.网段的 ftp 访问,除了 172.16.111.100 外
$ vim /etc/hosts.allow
vsftpd : 172.16.111. EXCEPT 172.16.111.100
$ vim /etc/hosts.deny
vsftpd : ALL
- [4] 不允许 172.16.111.网段访问 ftp,写在 hosts.allow 里
$ vim /etc/hosts.allow
vsftpd : 172.16.111. : deny
- [5] 不允许 192.168.111.网段 ssh 来访问,尝试的访问记录,在/var/log/sshd.deny.log 里
$ vim /etc/hosts.deny
sshd: 192.168.111. :spawn echo "`date` login attempt from %c to %s,%d" >> /var/log/sshd.deny.log
# 我们用一台192.168.111.网段的机器ssh访问,可以看到下面结果
$ cat /var/log/sshd.deny.log
Mon Aug 14 17:25:08 CST 2017 login attempt from 192.168.111.100 to [email protected],sshd
# 拒绝192.168.111.网段的ftp访问,并输出提示符。
$ vim /etc/hosts.deny 或者 vim /etc/hosts.allow均可
vsftpd: 192.168.111. :twist /bin/echo "connection refused!!!"
5. 参考链接
送人玫瑰,手有余香!