Linux中TCP wrapper的使用

Linux中TCP wrapper的使用

tcpwrapper的目的是对那些访问控制功能较弱的服务提供访问控制功能要想了解访问控制就必须先知道服务监听的概念:

服务监听的两种方式:

listen     :        socket                  监听在套接字上提供服务

                   循环                   不停歇的查看某个端口来提供服务

有两种方式来判断一个服务是否支持tcp wrapper:

1.通过查找库文件看是否有libwrap

ldd `which command`

2.查看是否连接到/etc/hosts.allow|deny

strings `which command`                   # 查看静态链接库

如果有/etc/hosts.allow

/etc/hosts.deny       就说明这个命令静态链接了tcpwrraper

tcpwrraper自身工作在内核,却可以通过这两个文件来提供访问控制

请求

服务   --->/etc/hosts.allow     --->     如有有就放行

↓         没有

/etc/hosts.deny     ---->    如果没有就放行

如果有明确的匹配条目拒绝

/etc/hosts.allow|deny文件格式:damon_list: client_list [:option]

匹配服务列表:damon_list

vsftpd: 192.168.0.

vsftpd,sshd,in.telnetd:

ALL

[email protected]

[email protected]

#可以简写192.168.0  代表192.168.0.0网段

#可以一次指定多个服务

#可以使用通配符ALL来指定所有的服务

#@只对某个主机来控制

匹配客户端列表clent_list

IP

network address

network/mask:   mask不能使用长度格式 ,只能是有完全ip的格式

172.16.0.0--->172.16.    也可以简写网段

HOSTNAME

fqdn

.a.rog            表示a.org域内的所有主机

option  选项

spawn                     #可以通过spawn来实现日志定义

spawn echo ""

#下面定义一个条件,只要用户通过telnet登录就记录到一个日志

vim /etc/hosts.deny

in.telnetd:ALL EXCEPT 172.16.0.1: spawnecho "Login attemp(`date`) %u from %a attemp to login %A, the deamon is%d." >> /var/log/telnet.log

##注意不能在echo后面用: 分号在这里有特殊意义。

##可以通过man 5 hosts_access 来查看上述%的含义

 

常用的宏定义 MACRO

ALL                                   #代表所有主机,或者所有服务

LOCAL                                   #表示本地主机,非FQDN主机

KNOWN                                      #表示可以被解析的主机

UNKNOWN                #反向可以被解析的主机

PARANOID                #正反向解析不匹配的主机

EXCEPT                                    #排除某个主机或某个网络

-

怎么来控制vsftpd的访问

[cpp] view plain copy

  1. 1. which vsftpd                       # 确定文件路径
  2. 2. vim /etc/hosts.deny                 # 改文件立即生效
  3. vsftpd: 172.16.100.100
  4. #假设仅允许172.16网段访问
  5. vim /etc/hosts.allow
  6. vsftpd: 171.16                        # 只允许172.16.0.0/16网段
  7. vim /etc/hosts.deny
  8. ALL: ALL                                            # 拒绝其他的用户登陆

这样就只有172.16.0.0网段可以访问了

控制SSH ,只允许192.168.0.32网段登陆,并且不允许192.168.0.32登陆

[cpp] view plain copy

  1. vim /etc/hosts.deny
  2. ALL:ALL
  3. vim /etc/hosts.allow
  4. sshd: 192.168.0 EXCEPT 192.168.0.32

效果:

将/etc/hosts.deny 里面的ALL: ALL去掉就可以恢复登陆

一、Tcp_wrapper简介

Tcp_wrapper是Wietse Venema开发的一个免费软件。Tcp_wrapper的诞生有个小小的故事,大约1990年,作者所在大学的服务器屡屡受到一个外来黑客侵入,因为受害主机的硬盘数据屡次被rm -rf/命令整个抹掉,所以找寻线索极为困难,直到有一天晚上作者在工作的过程中无意中发现这个黑客在不断的finger 受害主机、偷窥受害者的工作。于是,一个想法诞生了:设计一个软件,使它可以截获发起finger请求的IP,用户名等资料。Venema很快投入了工作,而Tcp_wrapper也由此诞生!此后,Tcp_wrapper随着广泛的应用逐渐成为一种标准的安全工具。通过它,管理员实现了对inetd提供的各种服务进行监控和过滤。

Tcp_wrapper编译安装成功后,会生成一个tcpd程序,它可以在inetd.conf这个控制文件中取代in.telnetd的位置,这样,每当有telnet的连接请求时,tcpd即会截获请求,先读取管理员所设置的访问控制文件,合乎要求,则会把这次连接原封不动的转给真正的in.telnetd程序,由in.telnetd完成后续工作。如果这次连接发起的ip不符合访问控制文件中的设置,则会中断连接请求,拒绝提供telnet服务。Tcp_wrapper访问控制的实现是依靠两个文件:hosts.allow,hosts.deny来实现的。

如果我们编辑/etc/syslog.conf文件,为Tcp wrapper加入了日志记录功能,即:

#tcp wrapper loglocal3.info /var/log/tcplog

编辑结束后,保存文件,在/var/log下会生成tcplog文件,注意这个文件的读写属性,应该只对root有读写权限。然后ps -ef | grep syslogd,找出syslogd的进程号,kill -HUP 重启syslogd进程使改动生效。在这里,我们可以预先看一看以后生成的tcplog文件内容,如下:

Jul 31 22:00:52 [url]www.test.org[/url] in.telnetd[4365]: connect from 10.68.32.1

Jul 31 22:02:10 [url]www.test.org[/url] in.telnetd[4389]: connect from 10.68.32.5

Jul 31 22:04:58 [url]www.test.org[/url] in.ftpd[4429]: connect from 10.68.32.3

Aug 2 02:11:07 [url]www.test.org[/url] in.rshd[13660]: connect from 10.68.32.5

Aug 2 02:11:07 [url]www.test.org[/url] in.rlogind[13659]: connect from 10.68.32.1

从上面我们可以看到,在安装了Tcp_wrapper的主机上,系统的每一次连接,Tcp_wrapper都做了记录,它的内容包括时间、服务、状态、ip等,对攻击这有很大的参考价值,不过,一定要记得清除日志了。

二、inetd服务介绍

最重要的网络服务进程,即inetd服务器程序,实际上,大部分请求不太频繁的服务都是由它启动的。

inetd程序在系统中是作为一个服务进程出现,它监听许多端口并且在得到客户请求时启动这个端口的服务程序。inetd程序可以由命令行来启动:inetd [-d]   -d选项用于打开调试信息。

inetd的工作方式是由/etc/inetd.conf和/etc/services文件设定的,下面我们来解释一下这两个文件。

services文件的格式基本上是这样:

netstat 15/tcp

qotd 17/tcpquote

msp 18/tcp# message send protocol

msp 18/udp# message send protocol

chargen19/tcpttytst source

chargen19/udpttytst source

ftp21/tcp

# 22 - unassigned

telnet23/tcp

每一行都是两栏或者三栏,第一栏是服务的名字,第二行是使用的端口和协议,例如这里的telnet 23/tcp是表示telnet服务应该使用端口23,协议类型为tcp。第三栏是服务的别名,通常可以省略。

inetd.conf是依赖于services文件的,它也是个文本文件,每行代表一种服务的工作方式,由"#"引导的行表示注释行,非注释行的格式大体是这样:

服务名  数据类型  协议  监听方式  用户身份  服务程序  参数

例如,要启动telnet的服务,应该加入这样一行:

telnet  stream  tcp  nowait  root  /usr/sbin/tcpd  in.telnetd

服务的名字就是telnet,这个名字按照/etc/services的定义将在23号端口提供服务;stream表示数据的发送和接收将使用简单的流式文件读写来完成(fscanf和fprintf);tcp表示使用tcp协议,监听方式这一栏可以由两个选项,即wait和nowait。简单地说,如果相应的服务程序是多进程的,那么要设置为nowait,这时inetd会每接受到一个请求之后启动一个服务程序进程,例如telnet就是这样工作的,每个独立的telnet对话都会启动一个telnet服务进程。相反,如果是单进程的,就可以设置为wait。

用户身份表示对应服务进程启动时所使用的uid/euid,因为telnet可以是任何用户发出,而且用户可以通过telnet执行任何命令,所以使用root用户身份。/usr/sbin/tcpd 是实际启动的程序,这个程序实际是一个通用的TCP连接处理程序,参数使用in.telnetd,连起来就是当有23端口的连接请求时,inetd去执行/usr/sbin/tcpd in.telnetd。

通常情况下,各种服务都已经写在inetd.conf中,不启用的服务使用注释#使之失效。如果需要打开这服务,只要把引导的#注释符号删除就可以了。值得一提的是/usr/sbin/tcpd程序,它是一个TCP连接过滤程序,通常大部分需要做连接验证的服务都应该通过tcpd程序启动,这个程序能够自动对客户机器的IP地址进行验证并且进行某些安全性过滤,其中最主要的功能是禁止某些地址来的连接。例如,按照

上面的形式,in.telnetd程序就是通过/usr/sbin/tcpd程序启动的,因此可以对telnet请求进行地址检验。

tcpd的地址检验是通过/etc/hosts.deny和/etc/hosts.allow文件完成的,如果不存在这样的文件,你可以自己建立一个,两者的语法几乎是一样的,只是hosts.allow是允许某个地址来的连接,而hosts.deny是禁止某个地方来的连接。基本的语法是:服务程序:客户地址(域名或主机名)

服务程序是指通过tcpd程序被启动的程序名字,客户地址是相关地址的一个列表,例如,/etc/hosts.allow文件中加入这样一行:in.telnetd:10.0.0.2  。将允许10.0.0.2处的机器使用本地的telnet服务,如果这一行加入到/etc/hosts.deny重将禁止10.0.0.2处的机器登录上来。

地址可以使用集合形式,常用的集合形式主要有下列几种:

以逗点开头的字符串定义一个域,例如.edu.cn表示所有域名后缀是.edu.cn的机器。

以逗点结束的字符串定义一串IP地址,如202.199.248.代表202.199.248.0到202.199.248.255。

以/分开的字符串解释为网络地址/子网掩码的形式,例如172.13.0.0/255.255.0.0代表172.13.0.0到172.13.255.255。

另外,地址和服务程序都可以使用通配符,通配符有下列几种:

ALL 代表所有,所有的服务程序或者所有的地址。经常和EXCEPT子句连用,EXCEPT代表“除了”。例如,在hosts.deny中写上ALL:ALL EXCEPT 202.199.248.将禁止除了202.199.248.*的机器之外的所有客户机器使用任何基于tcpd的服务。写上ALL EXPECT in.telnetd:ALL将使得除了telnet以外的所有基于tcpd的服务都被禁止。

LOCAL 指代所有没有名字后缀的机器。

KNOWN 所有IP地址和域名都知道的机器

UNKNOWN IP地址或者域名无法确定的机器

PARANOID IP地址和从域名服务返回的名字不匹配的机器。

tcp wrapper是一款访问控制的工具,很类似iptables的功能,但是要比iptables功能要小很多,一般只有在满足以下条件时才能使用tcp wrapper
       1),在编译的时候明确表示能接受tcp wrapper的控制
                        通过ldd `which sshd`来查看
                        通过strings `which portmap`| grep hosts查看
             
       2),必须是tcp协议
这个时候才能实现tcp wrapper的控制,虽然能功能范围少了一点,但是tcp wrapper配置起来要比iptables简单很多

能接受tcp wrapper控制的服务比如:telnet ,ssh ,vsftp

所谓的监听从编程角度来讲就是一段程序通过循环不停的对一个端口进行扫描

实际上tcp wrapper的实现就是主要是通过配置以下两个文件:

/etc/hosts.allow
   /etc/hosts.deny

tcp wrapper的格式:

daemon_list: client_list [:options]
   服务名     : 客户端名    [选项]

daemon_list有以下几种格式:
                vsftpd: 192.168.0.
                vsftpd,sshd,telnetd: 192.168.0.
                All: 192.168.0.
                [email protected]                     #指定只在某个特定的地址上进行控制比如:
                [email protected]            #有多块网卡的情况下

client_list有以下几种格式:
                IP
               
network address/mask          
#网络地址(只能使用类似255.255.完全ip地址
格                                                式,不能使用位长度表示)
                hostname                       #主机名称
                     .a.org                     #表示.a.org域内的所有主机

以下是以vsftp为例进行演示(拒绝172.16.100.1访问ftp服务器):
 1),yum install vsftpd
 2),  service vsftpd start
 3),vim /etc/hosts.deny 里面写入
                        vsftpd: 172.16.100.1
 4),配置完立即生效,不需要重启服务
 5),通过windows客户端进行认证

只允许172.16.网段访问ftp:
 1),vim  /etc/hosts.allow 写入: vsftpd: 172.16.
 2), vim /etc/hsots.deny      :   vsftpd: ALL

以下是对telnet(监听23号端口)的介绍:

telnet是一个非独立守护进程,由超级守护进程(xinetd)代为管理,它接受tcp wrapper的控制,但是     实际上不是telnet接受tcp wrapper的控制,而是xinetd接受tcp wrapper的控制
  telnet传输的过程是明文
  telnet一般不允许管理员直接登录(可以先以普通身份登进去,然后su - root)

1),yum install telnet-server
 2),ls /etc/xinetd.d               #里面会有telnet,由此说明telnet是接受超级进程xinetd控制
 3),ldd `which xinetd`           #可以发现超级守护进程是接受tcp wrapper控制的
 4),chkconfig telnet on          #注意这里只是说明下一次开机会自动启动,不能立即生效
 5),service xinetd restart       #通过重启超级进程来重启telnet
 6),useradd gentoo
 7),passwd gentoo
 8),telnet 172.168.25.1测试

只允许172.16.0.1登录telnet:
 vim /etc/hosts.deny 写入:  in.telnetd:ALL EXCEPT 172.16.0.1

[:options] 介绍:

spawn                              #发起一些额外的命令
vim /etc/hosts.deny         写入:
in.telnet:
ALL EXCEPT 172.16.0.1 : spawn echo "%u from %a attempt to login %A ,the
daemon is %d." >>/var/log/telnet.log

除了spawn还有allow 和 deny分别表示在/etc/hosts.allow中deny 和 /etc/hosts.deny中允许
 比如:
   vim /etc/hosts.deny中写入 :   in.telnetd: 172.16. :ALLOW
                                  ALL:ALL        #表示只允许172.16.网段使用telnet登录

时间: 2024-09-30 11:05:58

Linux中TCP wrapper的使用的相关文章

linux下tcp wrapper 使用详解

wrapper是一款访问控制的工具,很类似iptables的功能,但是要比iptables功能要小很多,一般只有在满足以下条件时才能使用tcp wrapper 检查要控制的软件工具是否支持tcp_wrap: ldd /usr/sbin/sshd(如果有wrap库代表支持)/ ldd `which xinted` | grep libwrap wrapper访问控制语句是写在:/etc/hosts.allows和/etc/hosts.deny 这两个文件当中 下面我举一些例子1: /etc/hos

Linux 中 TCP Wrappers 访问控制

TCP Wrappers机制的保护对象为各种网络服务程序,针对访问服务的客户端地址进行访问控制.对应的两个策略文件为/etc/hosts.allow和/etc/hosts.deny,分别用来设置允许和拒绝的策略. 两个策略文件的作用相反,但配置记录的格式一样: <服务程序列表>:<客户端地址列表>服务程序列表和客户端地址列表之间以冒号分隔,在每个列表内的多个项之间以逗号分隔. 1.服务程序列表: ALL:代表所有服务. 单个服务程序:如"dhcpd" 多个服务程

Linux运维 第三阶段 (十二)tcp wrapper

Linux运维第三阶段(十二)tcp wrapper tcp wrapper tcp wrapper(工作在TCP层的访问控制工具,通常只对TCP协议的应用做控制,它本身只是个库文件libwrap.so(由glibc提供)) 当来自客户端的请求访问本机服务时,请求先到达本机网卡,再到内核TCP/IP协议栈,路由发现是访问本机的,转至用户空间服务所监听的套接字上,服务响应送至内核TCP/IP协议栈,再通过路由经网卡返回至客户端:有了tcp wrapper后,在这过程当中附加了一层访问控制机制,由t

【翻译】TCP backlog在Linux中的工作原理

原文How TCP backlog works in Linux水平有限,难免有错,欢迎指出!以下为翻译: 当应用程序通过系统调用listen将一个套接字(socket)置为LISTEN状态时,需要为该套接字指定一个backlog参数,该参数通常被描述为用来限制进来的连接队列长度(queue of incoming connections). 由于TCP协议的三次握手机制,一个进来的套接字连接在进入ESTABLISHED状态并且可以被accept调用返回给应用程序之前,会经历中间状态SYN RE

查看linux中的TCP连接数【转】

转自:http://blog.csdn.net/he_jian1/article/details/40787269 查看linux中的TCP连接数 本文章已收录于:  计算机网络知识库  分类: 安全测试总结(2)  性能经验总结(107)  版权声明:本文为博主原创文章,未经博主允许不得转载. 一.查看哪些IP连接本机 netstat -an 二.查看TCP连接数 1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数ps

Linux中,Tomcat 怎么承载高并发(深入Tcp参数 backlog)

一.前言 这两天看tomcat,查阅 tomcat 怎么承载高并发时,看到了backlog参数.我们知道,服务器端一般使用mq来减轻高并发下的洪峰冲击,将暂时不能处理的请求放入队列,后续再慢慢处理.其实操作系统已经帮我们做了一些类似的东西了,这个东西就是backlog.服务端一般通过 accept 调用,去获取socket.但是假设我们的程序处理不过来(比如因为程序bug,或者设计问题,没能及时地去调用 accept),那么此时的网络请求难道就直接丢掉吗? 当然不会!这时候,操作系统会帮我们放入

Linux中配置ftp服务器

1. 先用rpm -qa| grep vsftpd命令检查是否已经安装,如果ftp没有安装,使用yum  -y  install vsftpd 安装,(ubuntu 下使用apt-get install vsftpd) 2. service vsftpd start / service vsftpd restart 启动要让FTP每次开机自动启动,运行命令:  chkconfig --level 35 vsftpd on 3. 设置ftp权限 vi  /etc/vsftpd/vsftpd.con

Linux中的select,poll,epoll模型

Linux中的 select,poll,epoll 都是IO多路复用的机制. select select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回后,该数组中就绪的文件描述符便会被内核修改标志位,使得进程可以获得这些文件描述符从而进行后续的读写操作.select目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点,事实上从现在看来,这也是它所剩不多的优点之一.select的一个缺点在于单个进程能够监视的文件描

linux中如何查询端口被占用的情况

今日要运用python写一个端口勘探的小程序,以检测一些特定的效劳端口有没有被占用,突然发现自个竟然不知道在linux中怎么查询端口被占用的情况,天呐,从速学习一下. Linux如何查看端口 1.lsof -i:端口号 用于查看某一端口的占用情况,比如查看8000端口使用情况,lsof -i:8000 # lsof -i:8000 COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME lwfs    22065 root    6u