• 9.2 TCP Wrappers
    • 9.2.1 哪些服务有支持
    • 9.2.2 /etc/hosts.{allow|deny} 的设定方式

    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 管理的服务有哪些?答:

    1. [root@www ~]# yum install xinetd
    2. Setting up Install Process
    3. Package 2:xinetd-2.3.14-29.el6.x86_64 already installed and latest version
    4. Nothing to do
    5. # 画面中显示,已经是最新的 xinetd !所以,已经有安装啰!
    6. # 接下来找出 xinetd 所管理的服务群!
    7. [root@www ~]# chkconfig xinetd on <==要先让 xinetd on 后才能看到底下的
    8. [root@www ~]# chkconfig --list
    9. ....(前面省略)....
    10. xinetd based services:
    11. chargen-dgram: off
    12. chargen-stream: off
    13. ....(中间省略)....
    14. rsync: off <==下一小节的范例就用这玩意儿来解释
    15. tcpmux-server: off
    16. telnet: on

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

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

    1. [root@www ~]# ldd $(which rsyslogd sshd xinetd httpd)
    2. # 这个方式可以将所有的动态函式库取出来查阅,不过需要眼睛搜寻。
    3. # 可以透过底下的方式来处理更快!
    4. [root@www ~]# for name in rsyslogd sshd xinetd httpd; do echo $name; \
    5. > ldd $(which $name) | grep libwrap; done
    6. rsyslogd
    7. sshd
    8. libwrap.so.0 => /lib64/libwrap.so.0 (0x00007fb41d3c9000)
    9. xinetd
    10. libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f6314821000)
    11. httpd

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


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

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

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

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

    • 先以 /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 的配置文件时,可以发现:

    1. [root@www ~]# cat /etc/xinetd.d/rsync
    2. service rsync
    3. {
    4. disable = yes
    5. flags = IPv6
    6. socket_type = stream
    7. wait = no
    8. user = root
    9. server = /usr/bin/rsync <==檔名叫做 rsync
    10. server_args = --daemon
    11. log_on_failure += USERID
    12. }

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

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

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

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


    原文: https://wizardforcel.gitbooks.io/vbird-linux-server-3e/content/59.html