1 前言
TCPWrapper,顾名思义,偶个人理解就是用来封装使用TCP/IP协议应用的一个东东,例如:telnet,ftp,ssh,exec,rsh,rlogin,finger,talk等。封装起来干啥呢? 做地址过滤啊,不让不认识的人随便到主机上串门,也就是安全上常说的access control list。
tcpWrapper的工作原理其实很简单,打个比方说吧。
如果说telnet,ftp,ssh等工具是进入主机的大门,那么tcpwrapper就是守大门的老头。当有人想从telnet,ftp,ssh这些大门进入主机时,这个守大门的老头可不简单呢,它根据主机给它的你从哪儿来的信息(就是客户端IP)去翻翻资料允许进入以及不允许进入的列表(hosts.allow和hosts.deny文件),如果你来的这个地方在允许列表里,就放你进去,然后亮出一个欢迎你的牌子。^_^,如果你来的这个地方不在允许列表里,或者干脆被加入ィ╤osts.deny)了,嘿嘿,他就睬都不睬你,你就自个人在那里撞门吧。
早期偶们做的小项目,没那么多钱,买不起硬件防火墙,solaris上又不像后期的linux那样有iptables这种强大的工具(我昨天试图搞个iptables放在solaris上编译的,居然发现这可爱的小东西扎根于Linux的开源土壤,不愿意移植到Solaris上,非得linux的内核才能支持。。。),只好使用土装备--tcpwrapper。
2 安装
tcpwrapper的安装有2种方式,一种是直接用编译好的二进制包安装,一种是自己吭哧吭哧的改Makefile编译。这儿对2种方式都做一下简单介绍。
2.1 二进制包的安装
二进制包的安装很简单,Solaris提供一种叫Package的二进制安装包格式,执行起来跟在windows上执行.exe的可执行文件差不多,很是方便快捷。这样的二进制包可以在sunfreeware的网站上找到,都是些热心人将各个软件包编译好之后,放在这个上面共享的。默认安装在/usr/local下的,solaris7,solaris8,solaris9 环境下编译的GNU的常用工具都有。
获得package文件之后,执行下列命令即可完成安装:
pkgadd -d <package_name>
2.2 源码包编译安装
如果想要增强TcpWrapper的功能(例如记日志,或者让登录者看到好看的欢迎信息^_^)或者不想安装在/usr/local目录下,就需要自己下载源码包来编译安装。
tcpwrapper的作者一定不太负责任…,它的源码包没有configure文件,连make install的target都没有。。。要靠自己改Makefile文件,对我这个一窍不通C的人而言,实在是件巨痛苦无比的事情。所以虽然偶一向有记笔记的好习惯,在那次编译完TCPWrapper之后,居然没有留下只言片语。。。咳咳,跑题了,继续继续。
在sunfreeware上同样可以找到每个gnu应用程序包的源码包,下载下来之后是.tar.gz的包格式,类似于tcp_wrappers-7.6.tar.gz这样的一个名字。
1.解开tar.gz包
gzip –d tcp_wrappers-7.6.tar.gz
tar xvf tcp_wrappers-7.6.tar
solaris tar令人厌恶的一点就是不支持z选项,所以得分成2条命令来解这个包,偶的习惯是直接装个gnu的tar把这个tar直接替换掉。^_^
2.编辑Makefile
1)先把#REAL_DAEMON_DIR=/usr/sbin前的注释打开
2)添加如下配置项
WORKDIR=/usr/security
SBINDIR=$(WORKDIR)/bin
LIBDIR=$(WORKDIR)/lib
INCDIR=$(WORKDIR)/include
MANDIR=$(WORKDIR)/man
BANNERS=$(WORKDIR)/banner
并且修改TABLES参数的值为:
TABLES = -DHOSTS_DENY="$(WORKDIR)/etc/hosts.deny" -DHOSTS_ALLOW="$(WORKDIR)/etc/hosts.allow"
这些参数依次是指定tcp_wrapper的安装路径,执行程序路径,库文件路径,include文件路径,MAN文件路径,欢迎信息文件路径,以及配置access control list信息的文件所在路径;
3)增加Install 项(高手看这段不要笑,偶的方法很土的…:$ 或者笑完把你比较高明的install方法留下让俺学习学习也行^_^)
install:
mkdir -p $(SBINDIR) $(LIBDIR) $(INCDIR) $(MANDIR)/man3 $(MANDIR)/man5 $(MANDIR)/man8 $(BANNERS)
cp tcpd tcpdchk tcpdmatch safe_finger try-from $(SBINDIR)
cp libwrap.a $(LIBDIR)
cp tcpd.h $(INCDIR)
cp *.3 $(MANDIR)/man3
cp *.5 $(MANDIR)/man5
cp *.8 tcpdmatch.8 $(MANDIR)/man8
make CC=gcc -f Banners.Makefile
cp in.* $(BANNERS)
4)增强选项配置
修改FACILITY为LOG_LOCAL2,这个是为了让tcpwrappers记录log,需要相应的修改syslog.conf的配置;
5)显示欢迎信息
如果要让你的主机显示欢迎信息给来访问的人,需要手工编辑一个prototype文件
内容举例如下:
*************************************
* Hello %c, Welcome you here
*************************************
当然了,有兴趣的话,可以再放些自己喜欢的文字进去。
OK,这个令当时的偶费了无数时间吐血不已的Makefile文件终于大功告成了。接下来是编译,安装
3.编译,安装
make STYLE=-DPROCESS_OPTIONS sunos5
make install
去WORKDIR指定的目录下看看?那些文件已经乖乖的都就位了。
3 配置
3.1配置inetd.conf文件
前文讲过,tcpwrapper就是用来封装telnet,ftp,ssh等程序的工具,那么如何封装呢? 窍门在inetd.conf文件里。
这儿就不多描述inetd.conf文件在unix环境下的伟大作用了,有兴趣的人可以自行google
在inetd.conf 文件里,大家可以看到这样的配置项:
telnet stream tcp6 nowait root /usr/sbin/in.telnetd in.telnetd
如果要用tcpwrapper来封装telnet,则需要修改为如下这个样子:
telnet stream tcp nowait root /usr/security/bin/tcpdin.telnetd
这样,所有对主机的telnet访问,就变成由tcpd也就是tcpwrapper这个看门老头来控制了,很简单吧?
然后不要忘了让inetd重读一下你改的配置
ps –ef|grep inetd
kill –HUP inetd_PID
3.2 配置hosts.allow及hosts.deny文件
Tcpwrapper最至关重要的2个配置文件就是hosts.allow及hosts.deny文件,这2个文件不存在,或者为空,看门老头就会偷懒,放人家通通进来的。
首先,你要根据Makefile里指定的
TABLES = -DHOSTS_DENY="$(WORKDIR)/etc/hosts.deny" -DHOSTS_ALLOW="$(WORKDIR)/etc/hosts.allow"
这个选项所在的位置来创建hosts.allow和hosts.deny文件
通常情况下,可以在hosts.allow文件中指定ALL: ALL : DENY,这样就不用配置hosts.deny文件里
3.2.1hosts.allow文件的内容格式
ALL: ALL : banners /usr/security/banner/
ALL: ALL : ALLOW
ALL: ALL : DENY
第一行,就是显示那个欢迎信息的banner的配置
第二行,就是允许进入的地址列表
第三行,就是说,不在允许列表中的地址通通不许进。
3.2.2配置举例
如果你要对所有被tcpwrapper管理起来的TCP/IP协议应用程序做相同的地址过滤规则的话
第一行和第二行的第一个ALL可以保持不变;
第一行和第二行的第二个ALL,需要换成允许进入的IP地址的列表,各个IP之间用逗号分隔。这些IP地址列表也支持地址段的方式加入,例如下面这样:
ALL: 192.168.0.0/255.255.0.0,127.0.0.1 : banners /usr/security/banner/
ALL: 192.168.0.0/255.255.0.0,127.0.0.1 : ALLOW
ALL: ALL : DENY
如果你要对被tcpwrapper管理起来的TCP/IP协议应用程序分别做地址过滤规则的话,可以在第一行和第二行的第一个ALL上做文章。
例如下面这个样子:
telnet: 192.168.0.0/255.255.0.0,127.0.0.1 : banners /usr/security/banner/
ftp: 192.168.1.0/255.255.255.0,127.0.0.1 : banners /usr/security/banner/
telnet: 192.168.0.0/255.255.0.0,127.0.0.1 : ALLOW
ftp: 192.168.1.0/255.255.255.0,127.0.0.1 : ALLOW
ALL: ALL : DENY
好了,这样就可以控制访问的IP地址啦,是不是很简单?
3.2.3 配置syslog.conf文件
通常情况下,我们还需要配置tcpwrapper的日志文件,让它记录下所有试图连接我们主机的尝试及成功进入主机的信息。
这就需要修改syslog.conf文件
添加如下信息:
local2.info /var/log/tcpd.log
记住local2.info和/var/log/tcpd.log之间要用tab键分开来,这个也是曾经折磨我到快要吐血的位置。^_^
最后也别忘了让syslogd重读一下你改过的配置文件
ps –ef|grep syslog
kill –HUP syslog_PID
4 后记
在Linux上有个xinetd,干的活就是tcpwrapper+inetd的活,也是个好东东。不过linux是江山代有才人出啊,现在又有个iptables横空出世,已经很少很少人在用xinetd或者tcpwrapper了。
本文转自:http://echo.sharera.com/blog/BlogTopic/9379.htm 为方便阅读,在原文基础上作了简单修改,再次感谢原作者的辛苦创作。