·之前介绍的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的都拒绝