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.denyin.telnetd : 140.116.44.202 140.116.32.0/255.255.255.0 : deny固然也能够写成两行,亦便是:[root@linux ~]# vi /etc/hosts.denyin.telnetd : 140.116.44.202 : denyin.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.allowin.telnetd: 140.116.44.0/255.255.255.0in.telnetd: 140.116.79.0/255.255.255.0in.telnetd: 140.116.141.99in.telnetd: LOCAL[root@linux ~]# vi /etc/hosts.denyin.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.denyin.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 套件所提供的, 因此您必需要安装该套件才行喔! ^_^