1、tcp_wraper是什么?
iptables无论是在防火墙、还是端口转发的场景下,功能都异常强悍和灵活。但并不是每个人都有时间来潜心研修iptables。这就使得初级人员,书防火墙规则变得十分痛苦(无知是一种痛苦)。因此为了满足普通人对防火墙的需求,这里就总结了tcp_wraper这种轻量级的iptables防火墙应用。
值得注意的是tcp_wraper虽然能起到防火墙的作用,但也是有局限性的。并不是所有的数据包都能被tcp_wraper管理(一般来说只有tcp协议的数据包能够被tcp_wraper这种轻量级防火墙控制。而且并不是所有的tcp协议数据包都能被tcp_wraper控制)。为什么说不是所有的tcp协议数据包都能被tcp_wraper控制呢,因为tcp_wraper本质上是一个“库”,只有那些包含这个库“”的服务才能被tcp_wraper控制(比如静态编译程序时,把这个库编译进去了;或者动态能加载这个“库”。那么这样的应用就可以受到tcp_wraper控制)。
2、需要熟悉的常识:对我们判断应用程序是否受tcp_wraper控制有帮助
一般操作系统上进程分为:独立守护进程(单独运行监听在某端口上);非独立守护进程(由xinetd进程统一管理的进程)
3、tcp_wraper访问控制原理
注释:我们经常操作/etc/hosts.allow /etc/hosts.deny文件,其实这就是tcp_wraper这个轻量级防火墙给我们提供的接口,方便我们管理服务器上的服务如何被访问。
流程是这样的:当用户访问我们的服务器时,数据包先流向/etc/hosts.allow文件过滤,如果被匹配到了的话直接允许访问访问我们机器上的服务(不在流向/etc/hosts.deny文件)。如果/etc/hosts.allow文件没有匹配到数据包的话,数据包才会经过/etc/hosts.deny文件过滤,加入被hosts.deny里边的规则匹配到了就会禁止访问我们的机器上的服务,但是如果hosts.deny还是没有匹配到数据包的话,则直接允许访问我们本机上的任何服务。
4、实战例子:
因此用tcp_wraper做防火墙需要按照下面步骤来做:
1>、判断应用程序是否受tcp_wraper这个轻量级防火墙控制。注意下边两个命令任何一个成立都表示这个应用可以被tcp_wraper控制。而且值得注意的是所有收到xinetd这个超级守护进程管理的应用也都受到tcp_wraper控制。
方法一:ldd `which COMMAND` | grep libwrap ##如果含有libwrap.so 表示可以被防火墙控制,你就可以写规则来管理访问这个服务的数据包
例如: ldd `which xinetd` | grep libwrap 或者ldd `which sshd` | grep libwrap
方法二:string `whick COMMAND`| grep hosts ## 只要含有hosts.allow文件即表示这个应用程序是静态编译了“库”。
2>、书写tcp_wraper类型的防火墙规则:
先给出语法:不想看的直接看后边的实例,有注释。
注释:注意,所有的服务必须写它运行时的二进制程序名称(比如telnet服务的真实名称是in.telnetd 所以不能乱写)。
sshd:192.168.0. 表示匹配所有,192.168.0.网段的机器访问我们这台机器的sshd服务的数据包。注意192.168.0.这个“.”不能少,并且需要注意的是这只是匹配到数据包但是是拒绝还是允许得看你把这条规则放到那个文件中(hosts.allow中表示允许,hosts.deny中表示拒绝)。下同
vsftpd,sshd,in.telnetd:192.168.0. 表示所有192.168.0.网段的机器访问我们这台机器上的vsftpd,sshd,in.telnetd服务的数据包都能配匹配到。
ALL:192.168.0. 表示所有192.168.0.网段的机器访问我们这台机器的,所有受tcp_wraper控制的服务的数据包都会被匹配到。
vsftpd@192.168.0.186:192.168.0. 表示192.168.0.网段的机器通过我们这台机器192.168.0.186这个ip访问vsftpd服务时的数据包会被匹配到。不要小看这,如果你们公司各部门的网段那不一样,那么你这台机器就可能会有多个ip,这里就可以限定那些部门不能访问,那些部门能访问vsftpd服务。
注释:IP表示客户端ip地址(用户从哪个主机上访问)。
172.16. 客户所在的网段。
.magedu.com 客户所在的域
ALL 表示所有的客户端
LOCAL 表示与本机在同一网段的客户端
KNOWN 表示能被dns正常解析的客户端
UNKNOWN 表示不能被dns正常解析的客户端
PARANOID 表示不能被dns正常解析客户端(正向域名->ip,和反向ip->域名)
EXCEPT 表示出了某些ip的客户端
实例:
1、允许172.16.0.0/16 网段访问sshd服务(放行sshd服务)
vim /etc/hosts.allow ##匹配到172.16.网段的数据包就放行
sshd:172.16.
vim /etc/hosts.deny ##其他的非172.16.网段的数据包访问sshd服务都拒绝
sshd:ALL
2、telnet服务不允许172.16.0.0/16网段访问,但允许172.16.100.200这台访问
方法一:
vim /etc/hosts.allow #表示允许172.168.100.200访问
in.telnetd:172.16.100.200
vim /etc/hosts.deny #拒绝172.16.网段的访问
in.telnetd:172.16.
方法二:
vim /etc/hosts.deny ##表示出了172.16.100.200这个ip所有的172.16.网段的数据包都无法访问telnet服务
in.telnetd:172.16. EXCEPT 172.16.100.200
方法三:
vim /etc/hosts.allow ##表示除了172.16.这个网段但不包含172.16.100.200这个ip的所有IP数据包都允许访问telnet服务。
in.telnetd: ALL EXCEPT 172.16. EXCEPT 172.16.100.200
测试开始:
yum install telnet-server ##安装telnet服务
chkconfig telnet on ##加入开机启动,这个服务是受到xinetd控制的,所以你需要保证xinetd开机自启动才可以。默认安装完xinetd就会开机自启动
service xinetd restart
chkconfig --list | grep telnet ##查看telnet服务是否开启了,有on表示开启
service iptables stop ##关闭防火墙,防止影响我们测试
setenforce 0 ##关闭selinux,防止影响到我们测试 确认是否关闭getenforce 如果显示Permissive的话表示selinux关闭已经完成(临时的关闭重启失效)。
useradd hadoop ##创建一个测试用户,默认root不允许远程登录telnet服务。
passwd hadoop ##生成密码,否则无法登陆
telnet 192.168.100.7 ##测试下是不是能登陆(没安装telnet客户端? yum install telnet -y 或者你到windows的cmd下执行telnet(没有telnet嘛?参看:http://jingyan.baidu.com/article/1e5468f9033a71484961b7d7.html)和ssh很像吧,这可是不加密的,以后不能用来登录服务器(你的账号密码直接都能被看到)。
##注意换成你的ip地址,经测试完全正确。没有问题。最后最好你关了telnet服务。并回复iptables防火墙。
vim /etc/hosts.allow #表示允许172.168.100.200访问。
in.telnetd:172.16.100.200
vim /etc/hosts.deny #拒绝172.16.网段的访问 。
in.telnetd:172.16.