·之前介绍的iptables是很强大的防火墙管理工具,不过易用性较差,这里并不是说不好用,而是相对来说比较复杂.在Linux系统中,针对主机防火墙的常用软件有三个:iptables,xinetd,tcp_warpper.

·tcp_warpper是一个tcp包装器,他的工作进程是tcpd,工作在tcp协议栈的tcp协议入口出,他对每一个进出本主机的tcp协议的套接字进行检测,而后对进出本主机的套接字与tcp_warpper的放行或拒绝规则做对比,一旦匹配到了相应的规则就放行或拒绝.因为tcp_warpper工作的层级比工作在网络层的Iptables更高一层,所以他们可以结合使用,但是对于同一个程序的控制,只使用其中一个就可以了.与其说tcp_warpper是一个程序,但他更像是一个库,用户在开发应用程序的时候,如果连接到这个库上,就表示是接受tcp_warpper控制的,所以并不是所有的tcp程序都受tcp_warpper控制

·配置文件

/etc/hosts.allow
/etc/hosts.deny

·如何查看哪些程序接受tcp_warpper控制

·如果是动态编译(共享对象),使用ldd命令检测其是否连接至libwrap库上即可

[root@www ~]# ldd `which sshd`
...
libwrap.so.0 => /lib64/libwrap.so.0 (0x00007fee8734c000)
...

·如果是静态编译(把库文件编译至程序内部):使用strings

[root@www ~]# strings `which rpcbind` | grep host
...
hosts_access
...
#通常一个应用程序中出现hosts.allow或hosts.deny,以为着他可以接受tcp_warpper控制

·匹配规则

1.当一个客户端来访问某一服务时,先检测 /etc/hosts.allow,如果被允许,则直接放行.

2.如果 /etc/hosts.allow没有匹配规则,则检查 /etc/hosts.deny,如果被拒绝则禁止访问.

3.如果两者都不匹配,默认放行.

·配置文件语法格式

daemon_list:client_list [options]

daemon_list
1.一定要是应用程序名称
2.应用程序列表,如果有多个,用逗号隔开
3.ALL:匹配所有进程

client_list:

IP地址:172.16.21.2
主机名:www.magedu.com
网络地址/子网掩码:255.255.255.0,仅允许使用长格式,不允许使用CIRD格式,也就是172.16.0.0/16,这种格式是不被允许的.172.16.表示172.16.0.0/255.255.0.0

tcp_wrapper内置Macro

用于client_list的有:
ALL:所有的
KNOWN:主机名能够正常解析的地址
UNKNOWN:不能正常解析的地址
PARANOID:主机名正向解析反向解析不匹配的地址
用于daemon_list的有:ALL
EXCEPT:可以用于client或daemon中,


[:options]

options:通常有两个选项
deny:在hosts.allow中使用deny选项:在hosts.allow文件中定义拒绝规则
allow:在hosts.denyw中使用allow选项:在hosts.deny文件中定义放行规则
#不明白的看下面实例

spawn


spawn:用于在执行allow或deny后执行一些可执行命令,常用的是记录日志
[root@www ~]# vim /etc/hosts.deny
in.telnetd:     ALL : spawn echo "login attempt from %c to %s" >>/var/log/tcp_warpper.log
in.telnetd:     ALL : spawn echo `date` login attempt from %c to %s >>/var/log/tcp_warpper.log        #同上,但是可以显示具体时间
#拒绝所有的主机,并把被拒绝主机尝试登录的信息记录在log中,%c是客户端信
#息,%s是服务器信息,这些都是tcp_warpper的内置宏,如果想知道还有哪些内置的
#宏,请man tcp_warpper(这个不行)或者man hosts.deny或man 5 hosts_access
%h:客户端主机名
%p:服务器上的进程

注:echo的时候,语句不需要加双引号,否则无法使用命令,如上示例



·实例:

·允许172.16.0.0/16网段的用户访问telnet,拒绝其他所有的

[root@www ~]# ldd `which in.telnetd`    #没有libwrap库,是否就不接受tcp_warpper控制了呢??
linux-vdso.so.1 =>  (0x00007fff0ebc9000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007f5ea37fd000)
libc.so.6 => /lib64/libc.so.6 (0x00007f5ea3469000)
/lib64/ld-linux-x86-64.so.2 (0x0000003d3dc00000)
[root@www ~]# ldd `which xinetd`       #非也,telnet是受xined控制的,所以得看xinetd
...
libwrap.so.0 => /lib64/libwrap.so.0 (0x00007ff7c6501000)
...

[root@www ~]# vim /etc/hosts.allow  #编辑 /etc/hosts.allow 添加如下行
in.telnetd:     172.16.             #这里可以填172.16.0.0
[root@www ~]# vim /etc/hosts.deny   #编辑 /etchosts.deny 添加如下行
in.telnetd:     ALL                 #应用程序名,他与iptables一样都是立即生效的,不需要重启,因为他是工作在内核的库上的????

·允许172.16.0.0/16网段的用户访问telnet,除了172.16.251.105,拒绝其他所有的

[root@www ~]# vim /etc/hosts.allow
in.telnetd:     172.16. EXCEPT 172.16.251.105        #EXCEPT表示除了

·在hosts.allow中定义deny

[root@www ~]# vim /etc/hosts.allow
in.telnetd:     172.16. :deny           #表示不允许172.16.0.0的网段访问,使用冒号隔开
#在deny中定义allow同上
扩展?:
[root@www ~]# vim /etc/hosts.allow
in.telnetd:     ALL EXCEPT 172.16.251.11 : deny   #表示除了172.16.251.11的都拒绝