TCP Wrapper


TCP-Wrapper是一个基于主机的网络访问控制表系统,用于过滤对类Unix系统(如Linux或BSD)的网络访问。其能将主机或子网IP地址、名称及ident查询回复作为筛选标记,实现访问控制。采用C语言编写开发并在BSD协议下授权使用。
原始代码是1990年左右由荷兰人Wietse Venema编写的,目的是监视埃因霍温理工大学数学和计算机科学系的Unix工作站上的黑客行动,他一直维护这个程序到1995年;2001年6月1日,在其自己的BSD风格的许可证下发布。
TCP-Wrappers是一种安全工具,用于过滤对类Unix操作系统上基于internet的服务的网络访问。它提供了基于主机的访问控制和日志功能,以增强安全性。其中包含一个名为libwrap的库,它实现了实际的功能。最初只有为超级服务器(如inetd)的每个连接生成的服务才会使用tcpd程序进行包装。然而现在大多数常见的网络服务守护进程都可以直接链接到libwrap。它用于不从超级服务器派生的守护进程,或者当一个进程处理多个连接时。否则,只会根据其acl检查第一次连接尝试。是Unix和Linux系统安全体系结构中的关键组件。它允许管理员控制和监视服务对特定主机的访问,为未经授权的访问提供一层防御。通过对网络服务进行包装,可以基于IP地址强制执行访问策略,增强了系统的安全性。它作为对Unix系统上日益增长的安全问题的响应。它的主要功能是监视和控制到网络服务的连接,例如Telnet、FTP和其他基于Tcp的服务。该工具因其简单和有效而获得广泛采用,成为类Unix操作系统中的标准安全措施。
工作原理
1.访问控制
TCP-Wrappers通过在网络服务到达实际的服务守护进程之前拦截传入的请求来操作。该工具使用两个主要配置文件来控制访问:/etc/hosts.allow和/etc/hosts.deny,这些文件定义了基于客户端IP地址允许或拒绝连接的规则。
1.1)./etc/hosts.allow:该文件指定允许哪些主机连接到哪些服务。例如,sshd: 192.168.1.0/255.255.255.0允许192.168.1.0子网内的所有主机访问SSH服务。
1.2)./etc/hosts.deny:该文件指定拒绝访问哪些主机。例如,ALL: ALL默认拒绝所有连接,除非/etc/hosts.allow中明确允许。
2.日志记录
除了访问控制之外,其还提供了健壮的日志记录功能。无论何时尝试连接,它都可以记录该尝试,包括客户端的IP地址和正在访问的服务。这种日志记录对于跟踪可疑活动和审计对网络服务的访问是无价的。
相关实现
1.安装
大多数类unix系统都预装了TCP-Wrappers。如果没有,可以使用系统的包管理器安装它。例如,在基于debian的系统上,它可以通过以下方式安装:
apt-get install tcpd
2.配置
要配置TCP Wrappers,管理员需要编辑/etc/hosts. conf文件允许和/etc/hosts.deny文件。下面是一个配置示例:
/etc/hosts.allow
sshd: 192.168.1.0/24 httpd: .example.com
/etc/hosts.deny
ALL: ALL
在此配置中,允许从192.168.1.0子网进行SSH访问,并且允许从example.com域中的任何主机进行HTTP访问。所有其他访问尝试都被拒绝。其它示例:
in.telnetd: ALL EXCEPT 172.16. EXCEPT 172.16.10.20
##表示除了172.16.这个网段但不包含172.16.10.20这个ip的所有IP数据包都允许访问telnet服务。
格式化访问规则
/etc/hosts.allow和/etc/hosts.deny是相同的。每个规则必须有自己的行。空行或以散列(#)开头的行将被忽略。
每条规则使用以下基本格式来控制对网络服务的访问:
<daemon list>: <client list> [: <option>: <option>:…]
<daemon list>—以逗号分隔的进程名列表(不是服务名)或ALL通配符。守护进程列表还接受操作符的控制,以实现更大的灵活性。
<client list>—由主机名、主机IP地址、特殊模式或通配符组成的逗号分隔列表,用于标识受规则影响的主机。客户端列表也接受“操作符”中列出的操作符,以允许更大的灵活性。可以是单个IP,NETWORK/MASK、HOSTNAME、宏变量
IP:表示某一个具体的地址
NETWORK/MASK中的掩码必须不能使用长度的格式,例如10.0.0.0/8是不正确的,必须是10.0.0.0/255.0.0.0
如果某个网段是标准的A,B,C类网段,可以这么写,以B类地址为例:172.16.
HOSTNAME:可以是符合FQDN格式的主机名,也可以是domain,域名前面要加'.',例如:.freeoa.net
<option>—可选操作或触发规则时执行的以冒号分隔的操作列表。选项字段支持扩展、启动shell命令、允许或拒绝访问以及更改日志记录行为。
options:该字段可以省略,其有如下几个选项:
1).allow:表示允许,如果这个选项出现在/etc/host.deny文件中也表示允许的意思;
2).deny:表示拒绝,如果这个选项出现在/etc/hosts.allow文件中,也表示是拒绝的意思;
3).spawn:表示立即执行其后的语句,通常用来记录某个客户端访问某服务的信息。
通配符
通配符允许TCP包装器更容易匹配守护进程或主机组。它们最常用于访问规则的客户端列表字段。以下通配符可用:
1).ALL - 匹配一切。它可以用于守护进程列表和客户端列表。
2).LOCAL - 匹配任何不包含句点(.)的主机,如localhost。与本机IP在同一个网段内的主机。
3).KNOWN - 匹配已知主机名和主机地址或已知用户的任何主机。
4).UNKNOWN -匹配主机名或主机地址未知或用户未知的任何主机。
5).PARANOID - 对源IP地址进行反向DNS查找以获得主机名。然后执行DNS解析来解析IP地址。如果两个IP地址不匹配,则断开连接并更新日志。表示主机名正向解析和反向解析无法匹配。
6).EXCEPT - 除了,不包含的意思。
模式
模式可以在访问规则的客户端字段中使用,以更精确地指定客户端主机组。以下是客户端字段中条目的常见模式列表:
1).以句点(.)开头的主机名—在主机名的开头放置句点将匹配共享该名称列出的组件的所有主机。以下示例适用于example.com域中的任何主机:
ALL : .example.com
2).以"."结尾的IP地址—在IP地址末尾加上".",将匹配共享该IP地址初始数字组的所有主机。下面的示例适用于192.168.x. x. 网络中的任何主机:
ALL : 192.168.
3).IP地址/netmask对,netmask表达式也可以作为一种模式来控制对一组特定IP地址的访问。下面的示例适用于地址范围为192.168.0.0 ~ 192.168.1.255的主机:
ALL : 192.168.0.0/255.255.254.0
4).[IPv6 address]/prefixlen pair - [net]/prefixlen pair也可以作为一种模式来控制对特定IPv6地址组的访问。下面的示例将适用于地址范围为3ffe:505:2:1::到3ffe:505:2:1:ffff:ffff:ffff:ffff的任何主机:
ALL : [3ffe:505:2:1::]/64
5).星号(*)-星号可以用来匹配整个主机名或IP地址组,只要它们不混合在包含其他类型模式的客户端列表中。下面的例子将适用于example.com域中的任何主机:
ALL : *.example.com
6).斜杠(/)-如果客户端列表以斜杠开头,则将其视为文件名。如果需要指定大量主机的规则,这很有用。下面的示例将TCP包装器引用到/etc/telnet。所有Telnet连接的hosts文件:
in.telnetd : /etc/telnet.hosts
3.测试
配置TCP Wrappers之后,必须测试配置以确保其按预期工作。这可以通过尝试从允许和拒绝的主机连接到服务并观察其行为和日志来实现。
匹配TCP报文的流程:

1).当客户端访问服务器端的某个服务时,TCP-Wrappers会将该请求报文与/etc/hosts.allow中定义的规则进行匹配;匹配成功,则允许访问服务器的某个服务;
2).如果匹配不成功,在与/etc/hosts.deny中定义的规则进行匹配;如果匹配成功,则拒绝访问某服务;
3).如果匹配没有成功,则执行默认策略,就是允许该客户端访问某服务。
TCP-Wrappers是一个工作在第四层(传输层)的安全工具,对有状态连接的特定服务进行安全检测并实现访问控制。它只能针对某些具体的应用或者服务起到一定的防护作用。比如说 ssh、telnet、ftp、sendmail、nfsauthd等服务的请求,都会先受到 TCP-Wrappers 的拦截。它是基于库调用实现的,包名为 libwrap.so(也有的叫做tcp_wrappers-lib)。在配置 TCP-Wrappers 之前要确定服务是否对其支持,可以使用ldd 命令来查看服务程序是否使用了 libwrap.so 这个动态链接库,如果包含那么表示该服务支持 TCP-Wrappers,否则不支持。因为它本质上是一个“库”,只有那些包含这个库的服务才能被其控制(比如静态编译程序时,把这个库编译进去了;或者动态能加载这个“库”;那么这样的应用就可以受到tcp-wraper控制)。
# ldd /usr/sbin/sshd |grep libwrap
libwrap.so.0 => /lib/libwrap.so.0 (0x002b1002)
如果输入ldd命令显示上面的结果,则代表服务使用了libwrap.so这个动态链接库,也就是说便可以配置tcpwrapper对该服务进行防护。另外可通过strings命令查询是否加载静态hosts.allow和host.deny文件,如果加载,则受tcpwraper控制,否则不受控制。
# strings `which portmap` | grep hosts_access
TCP-Wrappers控制机制由上文可知主要由/etc/hosts.allow和/etc/hosts.deny这两个文件进行控制。
匹配顺序:首先查询/etc/hosts.allow,再查询/etc/hosts.deny,最后默认规则是允许所有通过。文件格式:
服务列表: 客户端列表 [:选项]
服务列表有下几种类型写法:
sshd
vsftpd,sshd,in.telnetd #可以写多个服务
ALL
vsftpd@1.1.1.1
客户端列表有下几种类型写法:
IP
network/mask(如172.16.1.0/255.255.255.0)
172.16.1.
FQDN #完整合格域名,如mail.freeoa.net
.example.com #域名
ALL #所有主机
LOCAL,KNOWN,UNKNOWN,PARANOID
EXCEPT #意思是除了
选项有如下几种类型写法:
DENY #在host.allow文件中可以写DENY
ALLOW #在host.deny文件中可以写ALLOW
spawn #可以在后面执行一样命令
tcp_wraper宏定义:
%c:代表客户端信息(user@host)
%s:代表服务器信息(server@host)
%h:客户端主机名(hostname)
%p:服务ID(server PID)
更多宏定义查询方法:man 5 hosts_access
使用优势
1.增强的安全
通过提供细粒度的访问控制,TCP包装器显著地增强了系统的安全性。管理员可以限制对关键服务的访问,减少攻击面,降低未经授权访问的风险。
2.易用性
TCP包装器的配置和管理非常简单。通过使用简单的文本文件来定义访问规则,即使是经验有限的管理员也可以访问它。
3.灵活性
TCP包装器支持广泛的网络服务,使其成为任何安全策略中的通用工具。它可用于控制对各种服务的访问,包括SSH、Telnet、FTP等。
4.日志和审计
其日志记录功能提供了对网络活动的有价值的见解。管理员可以监视访问尝试,检测潜在的入侵,并维护详细的记录,以满足遵从性和审计目的。
常用用例
1.限制SSH访问
TCP Wrappers最常见的用例之一是限制SSH对特定IP地址或子网的访问。这有助于防止对SSH服务的未经授权的访问和暴力攻击。
2.控制FTP访问
TCP包装器可以用来控制对FTP服务的访问,只允许受信任的主机上传或下载文件。这在通过FTP传输敏感数据的环境中特别有用。
3.限制对Web服务器的访问
管理员可以使用TCP Wrappers根据IP地址限制对Httpd服务器的访问。这有助于防止未经授权的访问和潜在的基于web的攻击。
4.加强合规
通过提供详细的日志记录和访问控制,TCP Wrappers可以帮助组织满足数据安全和访问审计的遵从性需求。这在受监管的行业尤为重要。
高级特性
1.特定于守护进程的访问控制
TCP包装器允许特定于守护进程的访问控制,这意味着管理员可以对不同的服务应用不同的规则。此特性对于为各种网络服务提供量身定制的安全策略非常有用。
2.自定义日志记录
管理员可以使用tcpdmatch和tcpdchk工具自定义日志记录行为。这些工具有助于验证TCP Wrappers的配置并排除故障,确保正确应用访问规则并按预期生成日志。
3.与其他安全工具的集成
TCP包装器可以与其他安全工具和机制集成,以提供全面的安全解决方案。例如,它可以与防火墙和入侵检测系统一起工作,以增强整体安全状态。
相关轶事
Tcp-wrapper的诞生有个小小的故事,大约1990年,作者所在大学的服务器屡屡受到一个外来黑客侵入,因为受害主机的硬盘数据屡次被rm -rf/命令整个抹掉,所以找寻线索极为困难,直到有一天晚上作者在工作的过程中无意中发现这个黑客在不断的finger 受害主机、偷窥受害者的工作。于是一个想法诞生了:设计一个软件,使它可以截获发起finger请求的IP,用户名等资料。Venema很快投入了工作,而Tcp-wrapper也由此诞生!此后,它随着广泛的应用逐渐成为一种标准的安全工具。通过它,管理员实现了对inetd提供的各种服务进行监控和过滤。
与iptables的对比
iptables无论是在防火墙、还是端口转发的场景下,功能都异常强悍和灵活。但并不是每个人都有时间来潜心研修iptables。这就使得初级人员,书防火墙规则变得有些困难。因此为了满足普通人对防火墙的需求,tcp-wraper这种轻量级的iptables防火墙应用。
值得注意的是它虽然能起到防火墙的作用,但也是有局限性的。并不是所有的数据包都能被tcp_wraper管理(一般来说只有tcp协议的数据包能够被tcp_wraper这种轻量级防火墙控制。而且并不是所有的tcp协议数据包都能被其控制)。为什么说不是所有的tcp协议数据包都能被tcp-wraper控制呢,因为它本质上是一个“库”,只有那些包含这个库“”的服务才能被tcp-wraper控制(比如静态编译程序时,把这个库编译进去了;或者动态能加载这个“库”。那么这样的应用就可以受到其控制)。一般操作系统上进程分为:独立守护进程(单独运行监听在某端口上);非独立守护进程(由xinetd进程统一管理的进程)。
inetd与xinetd服务
extended internet daemon(守护进程,通常后面是d的都是守护进程):扩展的互联网守护程序,是一个运行于类unix操作系统的超级服务器,它的功能是管理网络相关的服务,由于其较高的安全性,xinetd主要为了取代inetd。xinetd监听来自网络的请求,从而启动相应的服务,它可以用来启动使用特权端口和非特权端口的服务。xinetd 执行与 inetd 相同的任务:它启动提供互联网服务的程序。
与在系统初始化时启动这些网络服务,让它们保持休眠,直到有连接请求到达才提供服务的做法不同,xinetd是唯一被启动的守护进程,它侦听各种服务在他们各自的配置文件中对应的端口,当一个请求到来时,xinetd启动合适的服务器。因此xinetd常被称为超级服务器。
守护进程分为独立守护进程和瞬时或短暂守护进程。而xinetd属于独立守护进程,但xinetd控制多个瞬时或短暂守护进程,所以叫做超级守护进程。
xinetd超级守护进程:有多个非独立守护进程,也是瞬时或短暂守护进程。主要配置文件:/etc/xinetd.conf,包含/etc/xinetd.d/*所有短暂守护进程配置文件。
配置文件分为两部分:全局和服务配置
它们都是最重要的网络服务进程,实际上大部分请求不太频繁的服务都是由它启动的。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是禁止某个地方来的连接。基本的语法如上:服务程序:客户地址(域名或主机名)。
配置文件格式:
service <服务名称>
(
属性 操作符 值
..............
)
访问控制
man xinetd.conf #查询此文件的配置参数方法;
匹配规则:only_from与no_access谁精确匹配用谁的条目。
格式如下:
only_from = #仅允许访问的客户端,取值有如下常见几种
IP #如1.1.1.100
NETWORK #如1.1.1.0/24或1.1.1.0/255.255.255.0
HOSTNAME #如mail.willow.com
DOMAIN #如.mail.willow
no_access = #拒绝访问的客户端,取值格式与only_from一样
时间访问控制:
格式: access_times = hh:mm-hh:mm
例如: access_times = 08:00-17:00 #仅允许在上午8点至下午5点允许访问
侦听的地址访问控制
格式: bind =
interface = #不常见
例如:本机有3个IP:172.16.1.6,172.16.2.6,192.168.1.6,只侦听172.16.2.6这个地址:
bind = 172.16.2.6
资源访问控制
cps = 每秒连接的最大并发数 如超过最大并发数的禁用时长
per_source = 每个IP地址最多连接个数
instances = 最大连接数(实例)
banner = 自定义文件路径 #登入提示信息
实验对rsync服务进行如下访问控制:
(1).侦听在1.1.1.19地址并提供服务
(2).仅允许1.1.1.0/24网络内的主机访问,拒绝1.1.1.144主机访问
(3).仅允许同时运行最多3个实例,并且每个IP只能发起2个请求
(4).仅允许在上午10点至下午15点允许访问
vim /etc/xinetd.d/rsync
service rsync
{
disable = no
bind = 1.1.1.19
only_from = 1.1.1.0/24
no_access = 1.1.1.144
instances = 3
per_source = 2
access_times = 10:00-15:00
}
xinetd超级守护进程也可以通过syslog和file进行记录日志,相关配置方式可查看/etc/xinetd.conf文件。
log_type = SYSLOG daemon info
log_type = FILE /var/log/xxx.log
Linux系统下的访问控制常见有3种实现方式:iptables,tcp-wraper,xinetd方式。不同于iptables防火墙网络访问控制,iptables可对于tcp/ip进行所有访问控制并且工作在内核中,而tcpwraper只对部分具有tcp协议的服务进行网络访问控制,方便那些对iptables不熟悉的人使用,且被配置的应用还要支持tcpwraper功能。从openssh-v6.7开始,ssh官方就移除了对tcp-wrappers的支持;但是centos v7默认的ssh版本是v7.4p1,是支持tcp-wrappers的。
最新版本:7.6
于1997年4月上旬发布。
官方主页:http://ftp.porcupine.org/pub/security/index.html
原始代码是1990年左右由荷兰人Wietse Venema编写的,目的是监视埃因霍温理工大学数学和计算机科学系的Unix工作站上的黑客行动,他一直维护这个程序到1995年;2001年6月1日,在其自己的BSD风格的许可证下发布。
TCP-Wrappers是一种安全工具,用于过滤对类Unix操作系统上基于internet的服务的网络访问。它提供了基于主机的访问控制和日志功能,以增强安全性。其中包含一个名为libwrap的库,它实现了实际的功能。最初只有为超级服务器(如inetd)的每个连接生成的服务才会使用tcpd程序进行包装。然而现在大多数常见的网络服务守护进程都可以直接链接到libwrap。它用于不从超级服务器派生的守护进程,或者当一个进程处理多个连接时。否则,只会根据其acl检查第一次连接尝试。是Unix和Linux系统安全体系结构中的关键组件。它允许管理员控制和监视服务对特定主机的访问,为未经授权的访问提供一层防御。通过对网络服务进行包装,可以基于IP地址强制执行访问策略,增强了系统的安全性。它作为对Unix系统上日益增长的安全问题的响应。它的主要功能是监视和控制到网络服务的连接,例如Telnet、FTP和其他基于Tcp的服务。该工具因其简单和有效而获得广泛采用,成为类Unix操作系统中的标准安全措施。
工作原理
1.访问控制
TCP-Wrappers通过在网络服务到达实际的服务守护进程之前拦截传入的请求来操作。该工具使用两个主要配置文件来控制访问:/etc/hosts.allow和/etc/hosts.deny,这些文件定义了基于客户端IP地址允许或拒绝连接的规则。
1.1)./etc/hosts.allow:该文件指定允许哪些主机连接到哪些服务。例如,sshd: 192.168.1.0/255.255.255.0允许192.168.1.0子网内的所有主机访问SSH服务。
1.2)./etc/hosts.deny:该文件指定拒绝访问哪些主机。例如,ALL: ALL默认拒绝所有连接,除非/etc/hosts.allow中明确允许。
2.日志记录
除了访问控制之外,其还提供了健壮的日志记录功能。无论何时尝试连接,它都可以记录该尝试,包括客户端的IP地址和正在访问的服务。这种日志记录对于跟踪可疑活动和审计对网络服务的访问是无价的。
相关实现
1.安装
大多数类unix系统都预装了TCP-Wrappers。如果没有,可以使用系统的包管理器安装它。例如,在基于debian的系统上,它可以通过以下方式安装:
apt-get install tcpd
2.配置
要配置TCP Wrappers,管理员需要编辑/etc/hosts. conf文件允许和/etc/hosts.deny文件。下面是一个配置示例:
/etc/hosts.allow
sshd: 192.168.1.0/24 httpd: .example.com
/etc/hosts.deny
ALL: ALL
在此配置中,允许从192.168.1.0子网进行SSH访问,并且允许从example.com域中的任何主机进行HTTP访问。所有其他访问尝试都被拒绝。其它示例:
in.telnetd: ALL EXCEPT 172.16. EXCEPT 172.16.10.20
##表示除了172.16.这个网段但不包含172.16.10.20这个ip的所有IP数据包都允许访问telnet服务。
格式化访问规则
/etc/hosts.allow和/etc/hosts.deny是相同的。每个规则必须有自己的行。空行或以散列(#)开头的行将被忽略。
每条规则使用以下基本格式来控制对网络服务的访问:
<daemon list>: <client list> [: <option>: <option>:…]
<daemon list>—以逗号分隔的进程名列表(不是服务名)或ALL通配符。守护进程列表还接受操作符的控制,以实现更大的灵活性。
<client list>—由主机名、主机IP地址、特殊模式或通配符组成的逗号分隔列表,用于标识受规则影响的主机。客户端列表也接受“操作符”中列出的操作符,以允许更大的灵活性。可以是单个IP,NETWORK/MASK、HOSTNAME、宏变量
IP:表示某一个具体的地址
NETWORK/MASK中的掩码必须不能使用长度的格式,例如10.0.0.0/8是不正确的,必须是10.0.0.0/255.0.0.0
如果某个网段是标准的A,B,C类网段,可以这么写,以B类地址为例:172.16.
HOSTNAME:可以是符合FQDN格式的主机名,也可以是domain,域名前面要加'.',例如:.freeoa.net
<option>—可选操作或触发规则时执行的以冒号分隔的操作列表。选项字段支持扩展、启动shell命令、允许或拒绝访问以及更改日志记录行为。
options:该字段可以省略,其有如下几个选项:
1).allow:表示允许,如果这个选项出现在/etc/host.deny文件中也表示允许的意思;
2).deny:表示拒绝,如果这个选项出现在/etc/hosts.allow文件中,也表示是拒绝的意思;
3).spawn:表示立即执行其后的语句,通常用来记录某个客户端访问某服务的信息。
通配符
通配符允许TCP包装器更容易匹配守护进程或主机组。它们最常用于访问规则的客户端列表字段。以下通配符可用:
1).ALL - 匹配一切。它可以用于守护进程列表和客户端列表。
2).LOCAL - 匹配任何不包含句点(.)的主机,如localhost。与本机IP在同一个网段内的主机。
3).KNOWN - 匹配已知主机名和主机地址或已知用户的任何主机。
4).UNKNOWN -匹配主机名或主机地址未知或用户未知的任何主机。
5).PARANOID - 对源IP地址进行反向DNS查找以获得主机名。然后执行DNS解析来解析IP地址。如果两个IP地址不匹配,则断开连接并更新日志。表示主机名正向解析和反向解析无法匹配。
6).EXCEPT - 除了,不包含的意思。
模式
模式可以在访问规则的客户端字段中使用,以更精确地指定客户端主机组。以下是客户端字段中条目的常见模式列表:
1).以句点(.)开头的主机名—在主机名的开头放置句点将匹配共享该名称列出的组件的所有主机。以下示例适用于example.com域中的任何主机:
ALL : .example.com
2).以"."结尾的IP地址—在IP地址末尾加上".",将匹配共享该IP地址初始数字组的所有主机。下面的示例适用于192.168.x. x. 网络中的任何主机:
ALL : 192.168.
3).IP地址/netmask对,netmask表达式也可以作为一种模式来控制对一组特定IP地址的访问。下面的示例适用于地址范围为192.168.0.0 ~ 192.168.1.255的主机:
ALL : 192.168.0.0/255.255.254.0
4).[IPv6 address]/prefixlen pair - [net]/prefixlen pair也可以作为一种模式来控制对特定IPv6地址组的访问。下面的示例将适用于地址范围为3ffe:505:2:1::到3ffe:505:2:1:ffff:ffff:ffff:ffff的任何主机:
ALL : [3ffe:505:2:1::]/64
5).星号(*)-星号可以用来匹配整个主机名或IP地址组,只要它们不混合在包含其他类型模式的客户端列表中。下面的例子将适用于example.com域中的任何主机:
ALL : *.example.com
6).斜杠(/)-如果客户端列表以斜杠开头,则将其视为文件名。如果需要指定大量主机的规则,这很有用。下面的示例将TCP包装器引用到/etc/telnet。所有Telnet连接的hosts文件:
in.telnetd : /etc/telnet.hosts
3.测试
配置TCP Wrappers之后,必须测试配置以确保其按预期工作。这可以通过尝试从允许和拒绝的主机连接到服务并观察其行为和日志来实现。
匹配TCP报文的流程:

1).当客户端访问服务器端的某个服务时,TCP-Wrappers会将该请求报文与/etc/hosts.allow中定义的规则进行匹配;匹配成功,则允许访问服务器的某个服务;
2).如果匹配不成功,在与/etc/hosts.deny中定义的规则进行匹配;如果匹配成功,则拒绝访问某服务;
3).如果匹配没有成功,则执行默认策略,就是允许该客户端访问某服务。
TCP-Wrappers是一个工作在第四层(传输层)的安全工具,对有状态连接的特定服务进行安全检测并实现访问控制。它只能针对某些具体的应用或者服务起到一定的防护作用。比如说 ssh、telnet、ftp、sendmail、nfsauthd等服务的请求,都会先受到 TCP-Wrappers 的拦截。它是基于库调用实现的,包名为 libwrap.so(也有的叫做tcp_wrappers-lib)。在配置 TCP-Wrappers 之前要确定服务是否对其支持,可以使用ldd 命令来查看服务程序是否使用了 libwrap.so 这个动态链接库,如果包含那么表示该服务支持 TCP-Wrappers,否则不支持。因为它本质上是一个“库”,只有那些包含这个库的服务才能被其控制(比如静态编译程序时,把这个库编译进去了;或者动态能加载这个“库”;那么这样的应用就可以受到tcp-wraper控制)。
# ldd /usr/sbin/sshd |grep libwrap
libwrap.so.0 => /lib/libwrap.so.0 (0x002b1002)
如果输入ldd命令显示上面的结果,则代表服务使用了libwrap.so这个动态链接库,也就是说便可以配置tcpwrapper对该服务进行防护。另外可通过strings命令查询是否加载静态hosts.allow和host.deny文件,如果加载,则受tcpwraper控制,否则不受控制。
# strings `which portmap` | grep hosts_access
TCP-Wrappers控制机制由上文可知主要由/etc/hosts.allow和/etc/hosts.deny这两个文件进行控制。
匹配顺序:首先查询/etc/hosts.allow,再查询/etc/hosts.deny,最后默认规则是允许所有通过。文件格式:
服务列表: 客户端列表 [:选项]
服务列表有下几种类型写法:
sshd
vsftpd,sshd,in.telnetd #可以写多个服务
ALL
vsftpd@1.1.1.1
客户端列表有下几种类型写法:
IP
network/mask(如172.16.1.0/255.255.255.0)
172.16.1.
FQDN #完整合格域名,如mail.freeoa.net
.example.com #域名
ALL #所有主机
LOCAL,KNOWN,UNKNOWN,PARANOID
EXCEPT #意思是除了
选项有如下几种类型写法:
DENY #在host.allow文件中可以写DENY
ALLOW #在host.deny文件中可以写ALLOW
spawn #可以在后面执行一样命令
tcp_wraper宏定义:
%c:代表客户端信息(user@host)
%s:代表服务器信息(server@host)
%h:客户端主机名(hostname)
%p:服务ID(server PID)
更多宏定义查询方法:man 5 hosts_access
使用优势
1.增强的安全
通过提供细粒度的访问控制,TCP包装器显著地增强了系统的安全性。管理员可以限制对关键服务的访问,减少攻击面,降低未经授权访问的风险。
2.易用性
TCP包装器的配置和管理非常简单。通过使用简单的文本文件来定义访问规则,即使是经验有限的管理员也可以访问它。
3.灵活性
TCP包装器支持广泛的网络服务,使其成为任何安全策略中的通用工具。它可用于控制对各种服务的访问,包括SSH、Telnet、FTP等。
4.日志和审计
其日志记录功能提供了对网络活动的有价值的见解。管理员可以监视访问尝试,检测潜在的入侵,并维护详细的记录,以满足遵从性和审计目的。
常用用例
1.限制SSH访问
TCP Wrappers最常见的用例之一是限制SSH对特定IP地址或子网的访问。这有助于防止对SSH服务的未经授权的访问和暴力攻击。
2.控制FTP访问
TCP包装器可以用来控制对FTP服务的访问,只允许受信任的主机上传或下载文件。这在通过FTP传输敏感数据的环境中特别有用。
3.限制对Web服务器的访问
管理员可以使用TCP Wrappers根据IP地址限制对Httpd服务器的访问。这有助于防止未经授权的访问和潜在的基于web的攻击。
4.加强合规
通过提供详细的日志记录和访问控制,TCP Wrappers可以帮助组织满足数据安全和访问审计的遵从性需求。这在受监管的行业尤为重要。
高级特性
1.特定于守护进程的访问控制
TCP包装器允许特定于守护进程的访问控制,这意味着管理员可以对不同的服务应用不同的规则。此特性对于为各种网络服务提供量身定制的安全策略非常有用。
2.自定义日志记录
管理员可以使用tcpdmatch和tcpdchk工具自定义日志记录行为。这些工具有助于验证TCP Wrappers的配置并排除故障,确保正确应用访问规则并按预期生成日志。
3.与其他安全工具的集成
TCP包装器可以与其他安全工具和机制集成,以提供全面的安全解决方案。例如,它可以与防火墙和入侵检测系统一起工作,以增强整体安全状态。
相关轶事
Tcp-wrapper的诞生有个小小的故事,大约1990年,作者所在大学的服务器屡屡受到一个外来黑客侵入,因为受害主机的硬盘数据屡次被rm -rf/命令整个抹掉,所以找寻线索极为困难,直到有一天晚上作者在工作的过程中无意中发现这个黑客在不断的finger 受害主机、偷窥受害者的工作。于是一个想法诞生了:设计一个软件,使它可以截获发起finger请求的IP,用户名等资料。Venema很快投入了工作,而Tcp-wrapper也由此诞生!此后,它随着广泛的应用逐渐成为一种标准的安全工具。通过它,管理员实现了对inetd提供的各种服务进行监控和过滤。
与iptables的对比
iptables无论是在防火墙、还是端口转发的场景下,功能都异常强悍和灵活。但并不是每个人都有时间来潜心研修iptables。这就使得初级人员,书防火墙规则变得有些困难。因此为了满足普通人对防火墙的需求,tcp-wraper这种轻量级的iptables防火墙应用。
值得注意的是它虽然能起到防火墙的作用,但也是有局限性的。并不是所有的数据包都能被tcp_wraper管理(一般来说只有tcp协议的数据包能够被tcp_wraper这种轻量级防火墙控制。而且并不是所有的tcp协议数据包都能被其控制)。为什么说不是所有的tcp协议数据包都能被tcp-wraper控制呢,因为它本质上是一个“库”,只有那些包含这个库“”的服务才能被tcp-wraper控制(比如静态编译程序时,把这个库编译进去了;或者动态能加载这个“库”。那么这样的应用就可以受到其控制)。一般操作系统上进程分为:独立守护进程(单独运行监听在某端口上);非独立守护进程(由xinetd进程统一管理的进程)。
inetd与xinetd服务
extended internet daemon(守护进程,通常后面是d的都是守护进程):扩展的互联网守护程序,是一个运行于类unix操作系统的超级服务器,它的功能是管理网络相关的服务,由于其较高的安全性,xinetd主要为了取代inetd。xinetd监听来自网络的请求,从而启动相应的服务,它可以用来启动使用特权端口和非特权端口的服务。xinetd 执行与 inetd 相同的任务:它启动提供互联网服务的程序。
与在系统初始化时启动这些网络服务,让它们保持休眠,直到有连接请求到达才提供服务的做法不同,xinetd是唯一被启动的守护进程,它侦听各种服务在他们各自的配置文件中对应的端口,当一个请求到来时,xinetd启动合适的服务器。因此xinetd常被称为超级服务器。
守护进程分为独立守护进程和瞬时或短暂守护进程。而xinetd属于独立守护进程,但xinetd控制多个瞬时或短暂守护进程,所以叫做超级守护进程。
xinetd超级守护进程:有多个非独立守护进程,也是瞬时或短暂守护进程。主要配置文件:/etc/xinetd.conf,包含/etc/xinetd.d/*所有短暂守护进程配置文件。
配置文件分为两部分:全局和服务配置
它们都是最重要的网络服务进程,实际上大部分请求不太频繁的服务都是由它启动的。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是禁止某个地方来的连接。基本的语法如上:服务程序:客户地址(域名或主机名)。
配置文件格式:
service <服务名称>
(
属性 操作符 值
..............
)
访问控制
man xinetd.conf #查询此文件的配置参数方法;
匹配规则:only_from与no_access谁精确匹配用谁的条目。
格式如下:
only_from = #仅允许访问的客户端,取值有如下常见几种
IP #如1.1.1.100
NETWORK #如1.1.1.0/24或1.1.1.0/255.255.255.0
HOSTNAME #如mail.willow.com
DOMAIN #如.mail.willow
no_access = #拒绝访问的客户端,取值格式与only_from一样
时间访问控制:
格式: access_times = hh:mm-hh:mm
例如: access_times = 08:00-17:00 #仅允许在上午8点至下午5点允许访问
侦听的地址访问控制
格式: bind =
interface = #不常见
例如:本机有3个IP:172.16.1.6,172.16.2.6,192.168.1.6,只侦听172.16.2.6这个地址:
bind = 172.16.2.6
资源访问控制
cps = 每秒连接的最大并发数 如超过最大并发数的禁用时长
per_source = 每个IP地址最多连接个数
instances = 最大连接数(实例)
banner = 自定义文件路径 #登入提示信息
实验对rsync服务进行如下访问控制:
(1).侦听在1.1.1.19地址并提供服务
(2).仅允许1.1.1.0/24网络内的主机访问,拒绝1.1.1.144主机访问
(3).仅允许同时运行最多3个实例,并且每个IP只能发起2个请求
(4).仅允许在上午10点至下午15点允许访问
vim /etc/xinetd.d/rsync
service rsync
{
disable = no
bind = 1.1.1.19
only_from = 1.1.1.0/24
no_access = 1.1.1.144
instances = 3
per_source = 2
access_times = 10:00-15:00
}
xinetd超级守护进程也可以通过syslog和file进行记录日志,相关配置方式可查看/etc/xinetd.conf文件。
log_type = SYSLOG daemon info
log_type = FILE /var/log/xxx.log
Linux系统下的访问控制常见有3种实现方式:iptables,tcp-wraper,xinetd方式。不同于iptables防火墙网络访问控制,iptables可对于tcp/ip进行所有访问控制并且工作在内核中,而tcpwraper只对部分具有tcp协议的服务进行网络访问控制,方便那些对iptables不熟悉的人使用,且被配置的应用还要支持tcpwraper功能。从openssh-v6.7开始,ssh官方就移除了对tcp-wrappers的支持;但是centos v7默认的ssh版本是v7.4p1,是支持tcp-wrappers的。
最新版本:7.6
于1997年4月上旬发布。
官方主页:http://ftp.porcupine.org/pub/security/index.html