💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## 9.2 TCP Wrappers 在进入主题之前,我们先来玩一个简单的防火墙机制,那就是 TCP Wrappers 这玩意儿。如同前面说的, TCP wrappers 是透过客户端想要链接的程序文件名,然后分析客户端的 IP ,看看是否需要放行。那么哪些程序支持 TCP wrappers 的功能?这个 TCP wrappers 又该如何设定?我们这里先简单的谈谈吧!(这个小节仅是简单的介绍过 TCP wrappers ,更多相关功能请参考基础学习篇的[第十八章](http://linux.vbird.org/linux_basic/0560daemons.php#security)内容喔!) * * * ### 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 封包过滤防火墙吧! * * *