说明:本文转自 http://zhumeng8337797.blog.163.com/blog/static/100768914200911142146740/
像Telnet、SSH、FTP、POP和SMTP等很多服务都会用到TCP Wrapper,它被设计为一个介于外来服务请求和服务回应的中间处理。
tcp_wrapper (tcpd) 由 xinetd 启动,而非作为一个独立的服务启动。
它的基本过程是这样的:当接收到一个外来服务请求的时候,先由TCP Wrapper处理这个请求,TCP Wrapper根据这个请求所请求的服务和针对这个服务所定制的存取控制规则来判断对方是否有使用这个服务的权限,如果有,TCP Wrapper将该请求按照配置文件定义的规则转交给相应的守护进程去处理同时记录这个请求动作,然后自己就等待下一个请求的处理。
TCP Wrapper机制的主要目的在于,来自客户端的请求只被允许同一个独立的守护进程(xinetd)直接通信, 而它请求的目标服务被TCP Wrapper包裹起来,这样就提高了的安全性和管理的方便性。
安全性的具体体现主要有两点,一个是获取访问权限前的控制,一个是获取访问后的处理。获取权限前,它会根据/etc/hosts.allow和/etc/hosts.deny定制的规则来判断对方是否有权限;获取权限后,通过bind、redirect等属性的设置,可能已经由另一台主机或者另一个服务在处理了对方的请求,而对方并不会感知中间经过了这样的处理。
一方面可以抽取所有服务共有的属性放到/etc/xinetd.conf中,另一方面,将每一个服务具体的配置放到/etc/xinetd.d目录下,而每个配置文件都遵循同样的语法和规则。
/etc/hosts.allow /etc/hosts.deny
TCP Wrapper的功能来自于libwrap.a或libwrap.so,它是一个服务库。象xinetd、sshd和portmap等许多服务编译时都依赖于它,其他的网路服务甚至你自己编写的服务都可以加上这个编译选项来提供TCP Wrapper的功能。
bash-3.00# ps -e PID TTY TIME CMD 2137 ? 00:00:00 xinetd 2157 ? 00:00:00 sshd 2180 ? 00:00:00 mysqld_safe 2205 ? 00:00:00 mysqld ......
[root@Enter-Mysql-Proxy ~]# ldd /usr/sbin/sshd |grep wrap libwrap.so.0 => /usr/lib/libwrap.so.0 (0xb7fcb000)如果有以上的返回值,表示程序支持tcp_wrapper
hosts.allow :用于保存允许访问的策略 hosts.deny :用于保存拒绝访问的策略这两个文件都具有相同的格式用来配置记录
<服务程序列表>:<客户机地址列表>[:动作]
文件中每行为一个设置记录,其前两个字段是必须有的,动作字段是“可选”的
1、ALL代表所有的服务程序 2、单个服务的名称,例如in.telnetd代表telnet服务器程序, vsftpd代表vsftpd服务器程序 3、多个服务程序名称可以组成列表,中间用逗号分隔,例如“in.telnetd,vsftpd”
SERVICE 项就是服务的进程名称,也就是ps –e 命令中显示的进程名称。并且可以是用ALL和关键字,代表所有的服务或例外。
如: ALL EXCEPT sshd 代表除了ssh 服务以外的所有服务。
1、ALL代表所有的客户机地址 2、LOCAL代表本机地址 3、KNOW代表可解析的域名 4、UNKNOW代表不可解析的域名 5、以句点“.”开始的域名代表该域下的所有主机,例如“.ltest.com”代表“ltest.com”域中的所有主机 6、对某个子网中的所有主机使用“子网/掩码”的形式表示 7、对于网络中的某个主机可直接使用IP地址表示
HOST(s)代表某台主机或一系列主机,也可以使用ALL 和 EXCEPT 关键字。
如 192.168.0.3 代表一台主机。 192.168.0. EXCEPT 192.168.0.3 代表除了192.168.0.3以外的192.168.0.0整个网段。 .abc.com EXCEPT bad.abc.com 代表除了 bad.abc.com 以外的所有以abc.com为结尾的域名。
“动作”字段使用“allow”表示允许,使用“deny”表示拒绝 ,hosts.deny文件文件中,默认是deny,可以省略不写,hosts.allow文件中默认是allow,也可以省略不写。
如写入日志或发email通知管理员等工作。写法通常为 spawn /bin/echo `date` %c >> /var/log/tcp_wrapper
含义是当有访问请求时。将日期和客户机的信息写如 /var/log/tcp_wrapper 作为日志。除了%c 之外,还可以用 %d、%a、%p等参数来代表不同的信息。
详细用法可以用man xinetd.conf 来查询。
下面给出一个完整的tcp_wrappers 防火墙的配置,这也是笔者在工作中的实际配置之一。
sshd: 192.168.10. 61.164.42.18 mysqld: 192.168.10. 61.164.42.18 portmap: 192.168.10. snmpd: 192.168.10. nfsd: 192.168.10. nfslock: 192.168.10. mountd: 192.168.10. svnserve:ALL
ALL: ALL: spawn /bin/echo `date` %c >> /var/log/tcp_wrapper sshd:ALL: spawn /bin/echo `date` %c >> /var/log/tcp_wrapper通过/etc/hosts.deny 和/etc/hosts.allow 的组合配置,实现的功能如下:
TCP Wrappers防火墙虽然设置简单,功能却不弱,对Linux中网络服务的访问控制与管理十分有用。但它与IPtables网络防火墙有区别,TCP Wrappers是指针对指定的网络服务程序进行基于主机地址的访问控制,而IPtables可以做更多的基于协议,
然而,TCP Wrapper机制并不是仅仅有了libwrap.a库就起作用,只有当libwrap.a库和xinetd服务结合使用的时候才能发挥出TCP Wrapper机制的作用。xinetd是RedHat 7.x的超级守护进程,它提供诸如访问控制、请求记录、地址绑定、重定向和资源利用控制等服务。
RedHat Linux 7.x版本中的很多服务都用到了xinetd,象FTP, IMAP, POP, 和 telnet.等。
/etc/services中所有的服务通过他们的端口来访问的时候,先由xinetd来处理,在唤起对方请求的服务之前,xinetd先检验请求者是否满足配置文件中指定的访问控制规则,当前的访问是否超多了指定的同时访问数目,还有配置文件中指定的其他规则等,检查通过,xinetd将这个请求交付到相应的服务去处理,自己就进入sleep状态,等待下一个请求的处理。
Rredhat 7.x开始更加注重安全,最大的特征就是用xinetd.conf代替原来的inetd.conf。xinetd(eXtended InterNET services daemon)提供类似于inetd+tcp_wrapper的功能,但是更加强大和安全。它能提供以下特色:
内置对恶意用户和善意用户的差别待遇设定; 使用libwrap支持,其效能更甚于tcpd 可以限制连接等级,基于主机的连接数和基于服务的连接数 设置特定的连接时间 将某个服务设置到特定的主机提供服务
可以限制连接的等级 可以限制一个主机的最大连接数,从而防止某个主机独占某个服务 可以限制日志文件的大小,防止磁盘空间被填满
可以为每一个服务就syslog设定日志等级 如果不使用syslog,也可以为每个服务建立日志文件 可以记录请求的起止时间以决定对方的访问时间 可以记录试图非法访问的请求
可以将客户端的请求转发到另一台主机去处理
xinetd 自 xinetd 2.1.8.8pre* 起的版本支持 IPv6
无论客户端请求是否成功,xinetd都会有提示告知连接状态 当前,它最大的缺点是对RPC支持的不稳定性,但是可以启动protmap与xinetd共存来解决这个。
原则上任何服务都可以使用xinetd,然而,我认为,最适合应该是哪些常用的internet服务,同时,这个服务的请求数目和频繁程度不会太高。
象DNS和Apache就不适合采用这种方式,而象Ftp、telnet、 SSH等就很适合使用xinetd方式,至于pop、imap等邮件服务是否适合使用这种方式,我自己也很难下结论,默认使用xinetd,很多人也是这样做的,但我没有这方面的测试。
service telnet { #使用telnet服务的标准端口,即23 disable = no #启动xinetd服务时自动打开本服务 socket_type = stream #服务使用的数据传输方式 wait = no #本服务是多线程的 user = root #执行本服务的用户名 server = /usr/sbin/in.telnetd #启动telnet 服务所使用的命令 log_on_failure += USERID #登陆不成功时日志记载用户名的信息 }上边是telnet 服务的基本配置。如果深入一下:
1. telnet服务服务器的最大连接数是20个
instances = 20
2. 若每秒的telnet请求达到4个,则服务自动停止1分钟
cps = 4 60
3. 只允许来自trust.com域和192.168.0.0/24这个网络的主机访问你的telnet服务器
only_from = .trust.com 192.168.0.0/24
4. 拒绝192.168.0.100和bad.trust.com这两台主机访问你的telnet服务器
no_access = bad.trust.com 192.168.0.100
5. 允许以上的客户端在9:00-11:00 13:00-15:00访问telnet服务器
access_time = 9:00-11:00 13:00-15:00
注意要用24小时制来表示。小时可以是0-23 ,而分钟可以是0-59,但不可以用24来表示小时或用60来表示分钟。
6. 允许每个客户端最多同时有2个telnet联系到服务器
per_source = 2
7. 使telnet 服务只在某一个IP地址上提供服务
bind = 192.168.0.200
如果一个很大的网络的同一个子网上具有很多或全部集群,ARP 表就可能会过载,就会让人觉得网络请求的响应速度太慢。为了避免上述现象,需要对运行中的系统做如下更改,并将这些更改添加到 /etc/sysctl.conf 文件,以使更改能够持久有效:
net.ipv4.conf.all.arp_filter = 1 net.ipv4.conf.all.rp_filter = 1 net.ipv4.neigh.default.gc_thresh1 = 512 net.ipv4.neigh.default.gc_thresh2 = 2048 net.ipv4.neigh.default.gc_thresh3 = 4096 net.ipv4.neigh.default.gc_stale_time = 240
Ping的返回值意义:
TTL=32 Windows 9x/Me TTL=64 LINUX TTL=128 Windows 200x/XP TTL=255 Unix
注意:可以通过修改运行参数来改变TTL值,迷惑对方的嗅探软件,如下命令
echo “128” > /proc/sys/net/ipv4/ip_default_ttl