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 封包过滤防火墙吧!
原文: https://wizardforcel.gitbooks.io/vbird-linux-server-3e/content/59.html