1.课程目标
了解Linux过滤数据包的规则、顺序;
了解TCP_Wrappers的过滤机制;
掌握TCP_Wrappers的配置;
学会判断服务是否能通过TCP_Wrappers过滤;
能够熟练运用TCP_Wrappers。
2.TCP_Wrappers简介
2.1.Linux中数据包的处理过程
当一个数据包到达一台Linux服务器之后,处理流程是这样的:
1) 首先经过Firewall的处理(RHEL6中为iptables),Firewall允许,则到达下一个步骤;Firewall拒绝,则直接拒绝访问请求;
2) TCP_Wrappers检测,当此检测通过,无策略阻挡时,直接通过,有策略阻挡,拒绝请求;
3) 服务本身的策略,可以在服务本身的配置文件中设置策略;
4) 最后的一道防线就是SELinux的限制,当前面都通过之后,会经过SELinux的严格过滤,通过了SELinux的策略验证才能最终允许访问。
2.2.为什么需要TCP_Wrappers
Firewall包括iptables,大多数是基于IP和端口过滤,这对于很多服务是没有问题的。但是有些服务一开启,端口就是随机分发的,此时在使用firewall或iptables的过滤机制就行不通了。而TCP_Wrappers可以基于服务名称来控制,不用管服务的端口是什么,怎么变都没关系。
3.配置文件
TCP_Wrappers有两个配置文件
/etc/hosts.allow
默认都是注释行,无配置。此文件为allow策略文件,一般所做配置为允许策略。
/etc/hosts.deny
默认全注释,无配置。此文件为deny策略文件,一般所做配置为拒绝策略。
注:
当数据要经过TCP_Wrappers过滤时,先检查/etc/hosts.allow文件,如果文件中有匹配的话就放行;
如果/etc/hosts.allow这个文件没有具体的匹配策略,则检测/etc/hosts.deny这个文件,有匹配策略,则拒绝访问请求;
如果两个文件都没有匹配的策略,缺省放行;
如果两个文件发生冲突,则允许优先(即按/etc/hosts.allow策略执行)。
配置文件的语法格式
Daemon_list: client_list [:option]
| |
进程列表:即那些服务(服务名) 客户端列表:那些客户端
Daemon_list:如:vsftpd:、sshd:、in.telnetd:;
client_list:此处主要写IP地址(192.168.1.0&192.168.1.)、网络地址(1.1.1.0/255.255.255.0、172.16.)、主机名(www.baidu.com、.example.com);
宏定义(MACRO):
ALL:匹配所有;
LOCAL:本地来宾,和本地网卡在同一个网段内的主机;
KNOWN:主机名可以正常解析;
UNKNOWN:主机名不可以正常解析;
PARANOID:主机名的正向解析和反向解析匹配不正常;
EXCEPT:除了,不包含。
[:option]:此处可以填写[:DENY]或[:ALLOW]或[:spawn]。如可以在hosts.allow文件里写拒绝策略,如下:
in.telnetd: 192.168.114. :DENY |
但是此方法很少使用,一般直接在hosts.deny里面写拒绝策略。
4.TCP_Wrappers与Firewall的关系
我们知道,在RHEL7中,Firewall缺省是拒绝所有(除了缺省选项,如:ssh)。所以,如果针对一个访问请求,要使用TCP_Wrappers进行验证,前提是Firewall放行了此访问请求,否则,根本不用TCP_Wrappers,直接在firewall阶段就过滤掉了。
5.TCP_Wrappers配置
例1:缺省情况下,frirewall是放行ssh访问请求的,所以,此处可以用TCP_Wrappers来过滤,如:拒绝192.168.10.11访问本机:
[root@freeit etc]# echo sshd: 192.168.10.11 >> /etc/hosts.deny cat: /etc/host: No such file or directory [root@freeit etc]# cat /etc/hosts.deny # # hosts.deny This file contains access rules which are used to # deny connections to network services that either use # the tcp_wrappers library or that have been # started through a tcp_wrappers-enabled xinetd. # # The rules in this file can also be set up in # /etc/hosts.allow with a 'deny' option instead. # # See 'man 5 hosts_options' and 'man 5 hosts_access' # for information on rule syntax. # See 'man tcpd' for information on tcp_wrappers # sshd: 192.168.10.11 ----------------------------------------------------登录主机11验证-------------------------------------------- [root@freeit ~]# ifconfig eth0 |grep "netmask" | cut -d " " -f10 192.168.10.11 [root@freeit ~]# ssh -o StrictHostKeyChecking=no root@192.168.10.10 ssh_exchange_identification: read: Connection reset by peer //连接失败。 |
例2:在hosts.allow重做上个策略(做之前删除hosts.deny的配置)
[root@freeit etc]# cat /etc/hosts.deny # # hosts.deny This file contains access rules which are used to # deny connections to network services that either use # the tcp_wrappers library or that have been # started through a tcp_wrappers-enabled xinetd. # # The rules in this file can also be set up in # /etc/hosts.allow with a 'deny' option instead. # # See 'man 5 hosts_options' and 'man 5 hosts_access' # for information on rule syntax. # See 'man tcpd' for information on tcp_wrappers # --------------------------------------------------/etc/hosts.allow拒绝策略­------------------------------------- [root@freeit etc]# echo sshd: 192.168.10.11 :DENY >> /etc/hosts.allow [root@freeit etc]# cat /etc/hosts.allow # # hosts.allow This file contains access rules which are used to # allow or deny connections to network services that # either use the tcp_wrappers library or that have been # started through a tcp_wrappers-enabled xinetd. # # See 'man 5 hosts_options' and 'man 5 hosts_access' # for information on rule syntax. # See 'man tcpd' for information on tcp_wrappers # sshd: 192.168.10.11 :DENY --------------------------------------------------访问测试---------------------------------------------------- [root@freeit ~]# ifconfig eth0 |grep "netmask" | cut -d " " -f10 192.168.10.11 [root@freeit ~]# ssh -o StrictHostKeyChecking=no root@192.168.10.10 ssh_exchange_identification: read: Connection reset by peer //连接失败。策略同样失效。 |
但是,在/etc/hosts.allow里面写拒绝策略,一般很少写。如果要做拒绝策略,建议直接在/etc/hosts.deny文件里面做。
6.TCP_Wrappers支持那些服务
TCP_Wrappers并不是所有的服务都支持,一些服务是不支持的。常用的有:sshd、vsftpd、in.telnetd等,这些服务都支持TCP_Wrappers。那么,如何验证一个服务是否支持TCP_Wrappers呢?
一个服务能不能通过TCP_Wrappers来过滤,要看此服务是否支持libwrap.so动态连接库。
例:查看sshd、vsftpd、httpd服务是否支持libwrap.so动态连接库(需要先安装服务)
[root@freeit etc]# ldd /usr/sbin/sshd |grep libwr libwrap.so.0 => /lib64/libwrap.so.0 (0x00007fe2f5d6f000) [root@freeit etc]# ldd /usr/sbin/vsftpd |grep libwr libwrap.so.0 => /lib64/libwrap.so.0 (0x00007fd9d2dc5000) [root@freeit etc]# ldd /usr/sbin/httpd |grep libwr [root@freeit etc]# //无动态连接库文件 |
如上:sshd、vsftpd都有动态连接库文件,但是httpd服务没有。也就是说,httpd服务不支持TCP_Wrappers。