TCP_Wrappers
事实上,除了使用 xinetd 的设定档来设定安全机制之外, 我们还可以利用额外的机制来抵挡某些不受欢迎的资料来源喔! 那就是 /etc/hosts.allow 以及 /etc/hosts.deny 这两个档案的功能啦! 这两个档案可以藉由分析:

    * 启动的服务名称 (daemon 执行档档名);
    * 用户端的 IP 来源或网段来源。

来进行用户端使用者是否能够登入的判断呢!不过,虽然这两个档案已经被整合到 xinetd 里面去了, 不过,要获得更多的功能,还是得要安装 tcp_wrappers 这个套件才行! 因为,这两个档案本身就是 tcp_wrappers ( 其实是 /usr/sbin/tcpd 那个档案而已啦! ) 的设定档啊! 而他也可以整合到整个系统的服务里头去,可以算是最最基础的一个防火墙架构啦! ^_^

其实, /etc/hosts.allow 与 /etc/hosts.deny 是 /usr/sbin/tcpd 的设定档, 而这个 /usr/bin/tcpd 则是用来分析进入系统的 TCP 封包的一个软体,他是由 TCP Wrappers 所提供的。 那为什么叫做 TCP_Wrappers 呢?那么 wrappers 有包裹的意思,所以说,这个套件本身的功能就是在分析 TCP 网路资料封包啦!那么刚刚我们稍微提到我们网路的封包资料主要是以 TCP 封包为主,这个 TCP 封包的档头至少记录了来源与目主机的 IP 与 port ,因此,若藉由分析 TCP 封包,就可以比对看我要不要让这个资料进入到主机里面来啰!所以啦,我们要使用 TCP_Wrappers 来控管的,就是:

   1. 来源 IP
   2. port (就是服务啦)

TCP_Wrappers 设定 TCP 封包是否可以进入的设定档在 /etc/hosts.allow 与 /etc/hosts.deny 当中。因此,基本上,如果一个服务是受到 xinetd 或 TCP_Wrappers 的控制时,那么该服务就会受限于 hosts.allow 与 hosts.deny 的管理了!而如果你自己安装的套件当中( 亦即使用 Tarball 安装的方式之套件 ),除非有自行定义支援 TCP_Wrappers 的功能 ,否则就无法使用这个玩意啰!嘿嘿!

那么这两个档案是干嘛用的?刚刚不是提过哪!他主要是用来规范 TCP 封包的规则的,所以呢, 里面记录的当然就是:‘某些 IP 在特定服务中是否能够进入主机’!那么要怎么写? 这两个档案的内容基本的语法是:

<service(program_name)> : <IP, domain, hostname> : <action>

所以我们要先找出来那个 service_name 才行,例如以我们刚刚的 telnet 为例,那个 service_name 是什么呢?其实指的就是在 xinetd.conf 设定档中的 server 这个设定后面接的程式名称啦!所以, telnet 在 FC4 底下的名称为 in.telnetd 因此,如果你不想让 140.116.44.202 这个位址及 140.116.32.0/255.255.255.0 这个 C class 的网域进入你的主机的话,那么可以这样在 /etc/hosts.deny 里面设定: ( 关于 IP, 网域, 网段, 还有相关的网路知识,在这个基础篇当中我们不会谈到, 详细的资料请先自行参考伺服器架设篇的内容! )

[root@linux ~]# vi /etc/hosts.deny
in.telnetd : 140.116.44.202 140.116.32.0/255.255.255.0 : deny

当然也可以写成两行,亦即是:

[root@linux ~]# vi /etc/hosts.deny
in.telnetd : 140.116.44.202             : deny
in.telnetd : 140.116.32.0/255.255.255.0 : deny

这样一来,对方就无法以 telnet 进入你的主机啦!方便吧!不过,既然如此,为什么要设定成 /etc/hosts.allow 及 /etc/hosts.deny 两个档案呢?其实只要有一个档案存在就够了, 不过,为了设定方便起见,我们存在两个档案,其中需要注意的是:

    * 写在 hosts.allow 当中的 IP 与网段,为预设‘可通行’的意思,亦即最后一个栏位 allow 可以不用写;
    * 而写在 hosts.deny 当中的 IP 与网段则预设为 deny ,第三栏的 deny 亦可省略;
    * 这两个档案的判断依据是: (1) 以 /etc/hosts.allow 为优先,而 (2) 若分析到的 IP 或网段并没有纪录在 /etc/hosts.allow ,则以 /etc/hosts.deny 来判断。

也就是说, /etc/hosts.allow 的设定优先于 /etc/hosts.deny 啰!瞭解了吗?基本上,只要 hosts.allow 也就够了,因为我们可以将 allow 与 deny 都写在同一个档案内, 只是这样一来似乎显得有点杂乱无章,因此,通常我们都是:

   1. 允许进入的写在 /etc/hosts.allow 当中;
   2. 不许进入的则写在 /etc/hosts.deny 当中。

此外,我们还可以使用一些特殊参数在第一及第二个栏位喔!内容有:

    * ALL:代表全部的 program_name 或者是 IP 都接受的意思,例如 ALL: ALL: deny
    * LOCAL:代表来自本机的意思,例如: ALL: LOCAL: allow
    * UNKNOWN:代表不知道的 IP 或者是 domain 或者是服务时;
    * KNOWN:代表为可解析的 IP, domain 等等资讯时;

再强调一次,那个 service_name 其实是启动该服务的程式,举例来说, /etc/init.d/ssh 这个 script 里面, 实际上启动 ssh 服务的是 sshd 这个程式,所以,你的 service_name 自然就是 sshd 啰! 而 /etc/xinetd.d/telnet 内有个 server 的设定项目, 那个项目指到 in.telnetd 这个程式来启动的喔!要注意的很!(请分别使用 vi 进这两支 scripts 查阅) 好了,我们还是以 telnet 为例子来说明好了,现在假设一个比较安全的流程来设定,就是:

   1. 只允许 140.116.44.0/255.255.255.0 与 140.116.79.0/255.255.255.0 这两个网域,及 140.116.141.99 这个主机可以进入我们的 telnet 伺服器;
   2. 此外,其他的 IP 全部都挡掉!

这样的话,我可以这样设定:

[root@linux ~]# vi /etc/hosts.allow
in.telnetd:  140.116.44.0/255.255.255.0
in.telnetd:  140.116.79.0/255.255.255.0
in.telnetd:  140.116.141.99
in.telnetd:  LOCAL

[root@linux ~]# vi /etc/hosts.deny
in.telnetd: ALL

那么有没有更安全的设定,例如,当当有其他人扫瞄我的 telnet port 时,我就将他的 IP 记住!以做为未来的查询与认证之用! 是有的!只是,那就得要有额外的动作参数加在第三栏了。主要的动作有:

    * spawn (action)
      可以利用后续接的 shell 来进行额外的工作,且具有变数功能,主要的变数内容为: %h (hostname), %a (address), %d (daemon)等等;

    * twist (action)
      立刻以后续的指令进行,且执行完后终止该次连线的要求 (DENY)

我们知道 finger 可以反向追踪网路封包的来源,所以,我希望这样:

   1. 利用 safe_finger 去追踪出对方主机的资讯;
   2. 将该追踪到的结果以 email 的方式寄给 root ;
   3. 在对方萤幕上面显示不可登入的讯息

此时可以利用 spwan (action1) | (action2) : twist (action3) 来进行, 也就是说,其实在 /etc/hosts.deny 的第三个栏位可以继续延伸下去的!整个资讯有如这样:

[root@linux ~]# vi /etc/hosts.deny
in.telnetd: ALL: spawn (echo "security notice from host `/bin/hostname`" ;\
    echo; /usr/sbin/safe_finger @%h ) | \
    /bin/mail -s "%d-%h security" root & \
    : twist ( /bin/echo -e "\n\nWARNING connection not allowed.\n\n" )

在上面的例子中,第三行的 root 那个帐号,可以写成你的个人帐号或者其他 e-mail ,以免很少以 root 身份登入 Linux 主机时,容易造成不知道的情况,另外,最后几行,亦即 :twist 之后的那几行为同一行。如此一来,当未经允许的电脑尝试登入你的主机时, 对方的萤幕上就会显示上面的最后一行,并且将他的 IP 寄到 root ( 或者是你自己的信箱 )那里去! 另外请注意,那个 /usr/sbin/safe_finger 是由 tcp_wrappers 套件所提供的, 所以您必须要安装该套件才行喔! ^_^