9.2 TCP Wrappers

在进入主题之前,我们先来玩一个简单的防火墙机制,那就是 TCP Wrappers 这玩意儿。如同前面说的, TCP wrappers 是透过客户端想要链接的程序文件名,然后分析客户端的 IP ,看看是否需要放行。那么哪些程序支持 TCP wrappers 的功能?这个 TCP wrappers 又该如何设定?我们这里先简单的谈谈吧!(这个小节仅是简单的介绍过 TCP wrappers ,更多相关功能请参考基础学习篇的第十八章内容喔!)


9.2.1 哪些服务有支持

说穿了, TCP wrappers 就是透过 /etc/hosts.allow, /etc/hosts.deny 这两个宝贝蛋来管理的一个类似防火墙的机制, 但并非所有的软件都可以透过这两个档案来控管,只有底下的软件才能够透过这两个档案来管理防火墙规则,分别是:

  • 由 super daemon (xinetd) 所管理的服务;
  • 有支援 libwrap.so 模块的服务。

经由 xinetd 管理的服务还好理解,就是配置文件在 /etc/xinetd.d/ 里面的服务就是 xinetd 所管理的啊! 那么什么是有支持 libwrap.so 模块呢?就让我们来进行底下的例题,你就比较容易明白啰:

例题:请查出你的系统有没有安装 xinetd ,若没有请安装。安装完毕后,请查询 xinetd 管理的服务有哪些?答:

[root@www ~]# yum install xinetd
Setting up Install Process
Package 2:xinetd-2.3.14-29.el6.x86_64 already installed and latest version
Nothing to do
# 画面中显示,已经是最新的 xinetd !所以,已经有安装啰!
# 接下来找出 xinetd 所管理的服务群!

[root@www ~]# chkconfig xinetd on   <==要先让 xinetd on 后才能看到底下的
[root@www ~]# chkconfig --list
....(前面省略)....
xinetd based services:
        chargen-dgram:  off
        chargen-stream: off
....(中间省略)....
        rsync:          off   <==下一小节的范例就用这玩意儿来解释
        tcpmux-server:  off
        telnet:         on

上述结果最终输出的部分就是 xinetd 所管理的服务群啰!上述的服务之防火墙简易设定,都可以透过 TCP wrappers 来管理的噜!

例题:请问, rsyslogd, sshd, xinetd, httpd (若该服务不存在,请自行安装软件),这四个程序有没有支持 tcp wrappers 的抵挡功能?答:由于支持 tcp wrappers 的服务必定包含 libwrap 这一个动态函式库,因此可以使用 ldd 来观察该服务即可。 简单的使用方式为:

[root@www ~]# ldd $(which rsyslogd sshd xinetd httpd)
# 这个方式可以将所有的动态函式库取出来查阅,不过需要眼睛搜寻。
# 可以透过底下的方式来处理更快!

[root@www ~]# for name in rsyslogd sshd xinetd httpd; do echo $name; \
> ldd $(which $name) | grep libwrap; done
rsyslogd
sshd
        libwrap.so.0 => /lib64/libwrap.so.0 (0x00007fb41d3c9000)
xinetd
        libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f6314821000)
httpd

上述的结果中,在该档名档下有出现 libwrap 的,代表有找到该函式库,才有支持 tcp wrappers。 所以, sshd, xinetd 有支持,但是 rsyslogd, httpd 这两支程序则不支持。也就是说, httpd 与 rsyslogd 不能够使用 /etc/hosts.{allow|deny} 来进行防火墙机制的控管。


9.2.2 /etc/hosts.{allow|deny} 的设定方式

那如何透过这两个档案来抵挡有问题的 IP 来源呢?这两个档案的语法都一样,很简单的:

<service(program_name)> : <IP, domain, hostname> 
<服务   (亦即程序名称)> : <IP 或领域 或主机名>
# 上头的 > < 是不存在于配置文件中的喔!

我们知道防火墙的规则都是有顺序的,那这两个档案与规则的顺序优先是怎样呢?基本上是这样的:

  • 先以 /etc/hosts.allow 为优先比对,该规则符合就予以放行;
  • 再以 /etc/hosts.deny 比对,规则符合就予以抵挡;
  • 若不在这两个档案内,亦即规则都不符合,最终则予以放行。

我们拿 rsync 这个 xinetd 管理的服务来进行说明好了,请参考底下的例题吧:

例题:先开放本机的 127.0.0.1 可以进行任何本机的服务,然后,让区网 (192.168.1.0/24) 可以使用 rsync , 同时 10.0.0.100 也能够使用 rsync ,但其他来源则不允许使用 rsync 喔。答:我们得要先知道 rsync 的服务启动的档名为何,因为 tcp wrappers 是透过启动服务的档名来管理的。 当我们观察 rsync 的配置文件时,可以发现:

[root@www ~]# cat /etc/xinetd.d/rsync
service rsync
{
        disable = yes
        flags           = IPv6
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/bin/rsync   <==檔名叫做 rsync
        server_args     = --daemon
        log_on_failure  += USERID
}

因此程序字段的项目要写的是 rsync 喔!因此,我们应该要这样设定的:

[root@www ~]# vim /etc/hosts.allow
ALL: 127.0.0.1    <==这就是本机全部的服务都接受!
rsync: 192.168.1.0/255.255.255.0 10.0.0.100

[root@www ~]# vim /etc/hosts.deny
rsync: ALL

上面的例题有几个重点,首先, tcp wrappers 理论上不支持 192.168.1.0/24 这种透过 bit 数值来定义的网域, 只支持 netmask 的地址显示方式。另外,如果有多个网域或者是单一来源,可以透过空格来累加。 如果想要写成多行呢?也可以啊!多写几行『 kshd: IP 』的方式也可以,不必要将所有数据集中在一行啦!因为 tcp wrappers 也是一条一条规则比对嘛!

基本上,你只要理解这些数据即可!因为绝大部分的时刻,我们都会建议使用底下介绍的 Netfilter 的机制来抵挡封包。 那让我们准备开始来玩玩 iptables 封包过滤防火墙吧!