跳转至

tcpwrapper

TCP Wrapper

介绍

TCP Wrapper 是一个为基于 tcp 协议开发并提供服务的应用程序提供的一层访问控制工具,也是一个为 Unix 服务器提供防火墙(firewall)服务的公共领域计算机程序。该程序是由 Wietse Venema 开发的。

TCP Wrapper 程序监视发送进来的包。若外部计算机试图连接,TCP Wrapper就会查看该机器是否具有连接的权限。如果有,那么访问允许。若没有,访问拒绝。该程序可以根据个人用户或网络的需求进行更改。

iptables 与 TCP Wrapper 的对比 这里说到 TCP Wrapper 是一个提供防火墙服务的程序,但它相对 iptables 来说还是有很大不同的:

iptables 可以基于 TCP/IP 协议栈中的请求报文进行很精细的控制; TCP Wrapper 是基于库调用实现功能,仅能对基于 tcp 协议开发并调用了相关库提供服务的应用程序提供访问控制;

使用

前面有说到 TCP Wrapper 仅能对调用了相关库并提供服务的应用程序提供访问控制,那么我们怎么判断一个服务程序是否调用了 TCP Wrapper 的相关库呢?

这里的相关库指的是 libwrap.so.0

所以对于动态编译的程序来说,我们可以直接通过 ldd 命令查看它链接的库文件,如果库文件中包含 libwrap.so.0,那么就说明这个程序是可以被 TCP Wrapper 控制的。

而对于静态编译的程序来说,我们需要使用 strings 命令查看其应用程序文件,如果其结果中出现了 hosts.allow 和 hosts.deny 文件,那么就说明这个程序是可以被 TCP Wrapper 进行访问控制的。

因静态编译的程序很少见不好演示,下面我们仅演示一下判断一个动态编译的程序是否可以被 TCP Wrapper 进行访问控制:

$ ldd $(which sshd) | grep libwrap
        libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f6ca4954000)

$ ldd $(which httpd) | grep libwrap

$ ldd $(which vsftpd) | grep libwrap
        libwrap.so.0 => /lib64/libwrap.so.0 (0x00007fd235ccf000)

$ ldd $(which xinetd) | grep libwrap
        libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f7822fc3000)

看如上示例,根据前文所述我们可以判断 sshd、sshd、xinetd 服务是可以被 TCP Wrapper 进行访问控制的,而 httpd 不可以。

配置文件

TCP Wrapper 可以在配置文件在为各服务分别定义访问控制规则实现访问控制,有如下两个配置文件:

/etc/hosts.allow:定义允许访问的服务;

/etc/hosts.deny:定义拒绝访问的服务;

这两个配置文件使用匹配顺序的,如下图:

tcpwrapper

即先匹配 /etc/hosts.allow 文件,如果匹配到就放行,如果没匹配到就继续匹配 /etc/hosts.deny 文件,如果匹配到就拒绝,如果没匹配到就放行,即如果两个文件的规则都没有匹配到,那么默认就是放行的。

配置文件可有多行,每行定义一条规则语法如下:

daemon_list: client_list [EXCEPT exclude_client_list]... [:option]
    daemon_list:
        可以是应用程序的文件名称,而非服务名,如 sshd;
        可以是应用程序文件名称列表,彼此间使用逗号分隔,如 sshd, sshd;
        ALL 表示所有服务;

    client_list:
        IP地址;
        主机名;
        网络地址:必须使用完整格式的掩码,不使用前缀格式掩码,所以类似于 10.0.1.0/24 不合法;
        简短格式的网络地址:例如 172.16. 表示 172.16.0.0/255.255.0.0;
        ALL:所有主机;
        KNOWN: 所有可以解析主机名的主机;
        UNKNOWN:所有无法解析主机名的主机;
        PARANOID:所有正反解后的主机名不匹配的主机;

    [EXCEPT exclude_client_list]        除了,匹配 client_list 中除 exclude_client_list 以外的主机,可有多个;

    [:options]
        deny:拒绝,用于= hosts.allow 文件,实现 deny 主机的功能;
        allow:允许,用于 hosts.deny 文件,实现 allow 的功能
        spawn command:匹配到访问主机时执行额外命令或启动额外应用程序:
            command 中允许使用宏,常用宏如下:
                %c: 客户端 ip;
                %s: 服务端 ip;
                %d: 应用程序文件名称;

示例

例 1:sshd 服务不允许 10.0.1.200 访问。

$ cat /etc/hosts.allow
$ cat /etc/hosts.deny 
sshd: 10.0.1.200
例 2:sshd 服务仅允许 10.0.1.0/24 网络中主机访问。
$ cat /etc/hosts.allow
sshd: 10.0.1.
$ cat /etc/hosts.deny 
sshd: ALL

例 3:sshd 服务允许除了 10.0.1.2 的 10.0.1.0/24 网络中所有主机访问。

$ cat /etc/hosts.allow
sshd: 10.0.1. EXCEPT 10.0.1.2
$ cat /etc/hosts.deny 
sshd: ALL
例 4:sshd 服务仅允许 10.0.1.200 访问。
$ cat /etc/hosts.allow
sshd: 10.0.1. EXCEPT 10.0.1.0/24 EXCEPT 10.0.1.200 
$ cat /etc/hosts.deny 
sshd: ALL

EXCEPT 后的 EXCEPT 会逻辑取反,如上本是不允许 10.0.1.0/24 网络的主机访问,但是后面的一个操作又是对前面范围“除了”的意思,所以 10.0.1.200 就允许访问了。

例 5:sshd 服务仅允许 10.0.1.0/24 网络中主机访问。

$ cat /etc/hosts.allow
$ cat /etc/hosts.deny 
sshd: ALL EXCEPT 10.0.1.
例 6:sshd 服务仅拒绝 10.0.1.200 访问:
$ cat /etc/hosts.allow
sshd: 10.0.1.200:deny
$ cat /etc/hosts.deny 
例 7:sshd 服务仅允许 10.0.1.200 访问:
$ cat /etc/hosts.allow
$ cat /etc/hosts.deny
sshd: 10.0.1.200:allow
sshd: ALL
例 8:sshd 服务拒绝所有主机访问,将试图访问的信息记录到 /var/log/sshd.deny.log。
$ cat /etc/hosts.allow
$ cat /etc/hosts.deny
sshd: ALL:spawn /bin/echo `date` login attempt from %c to %s, %d >> /var/log/sshd.deny.log

# 访问后查看
$ cat /var/log/sshd.deny.log
Mon Mar 2 22:49:46 CST 2020 login attempt from 10.0.1.1 to sshd@10.0.1.201, sshd

DenyHosts

DenyHosts 利用TCP Wrapper特性,分析日志文件,自动将尝试暴力破解ssh服务的IP加入到/etc/hosts.deny中,拒绝该IP对服务器的访问,以防止服务器被暴力破解。

项目地址:https:#denyhosts.sourceforge.net/

安装

$ tar xf denyhosts-3.0.tar.gz
$ cd denyhosts-3.0/
$ python setup.py install
$ cd /usr/share/denyhosts/   
$ cp denyhosts.cfg-dist denyhosts.cfg      #配置文件
$ cp daemon-control-dist daemon-control    #启动文件
$ chown root daemon-control    # 添加root 权限
$ chmod 700 daemon-control     # 修改为可执行文件
$ ln -s /usr/share/denyhosts/daemon-control /etc/init.d/denyhosts  # 对daemon-control进行软连接,方便管理

安装到这一步就完成了。
$ /etc/init.d/denyhosts start        # 启动denyhosts
$ chkconfig --add denyhosts
$ chkconfig denyhosts on             # 将denghosts设成开机启动

配置文件

/usr/share/denyhosts/denyhosts.cfg
       ############ THESE SETTINGS ARE REQUIRED ############

SECURE_LOG = /var/log/secure                  #ssh 日志文件 #redhat系列根据/var/log/secure文件来判断;#Mandrake、FreeBSD根据 /var/log/auth.log来判断;SUSE则是用/var/log/messages来判断,这些在配置文件里面都有很详细的解释。
HOSTS_DENY = /etc/hosts.deny                  #控制用户登录的文件
PURGE_DENY = 30m                              #过多久后清除已经禁止的,设置为30分钟;
# ‘m’ = minutes
# ‘h’ = hours
# ‘d’ = days
# ‘w’ = weeks
# ‘y’ = years
BLOCK_SERVICE = sshd                         #禁止的服务名,当然DenyHost不仅仅用于SSH服务
DENY_THRESHOLD_INVALID = 1                   #允许无效用户失败的次数
DENY_THRESHOLD_VALID = 3                     #允许普通用户登陆失败的次数
DENY_THRESHOLD_ROOT = 3                      #允许root登陆失败的次数

DENY_THRESHOLD_RESTRICTED = 1                #设定 deny host 写入到该资料夹  
WORK_DIR = /usr/share/denyhosts/data         #将deny的host或ip记录到work_dir中  
SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS=YES  
HOSTNAME_LOOKUP=YES                          #是否做域名反解  
LOCK_FILE = /var/lock/subsys/denyhosts       #将DenyHost启动的pid记录到LOCK_FILE中,已确保服务正确启动,防止同时启动多个服务

       ############ THESE SETTINGS ARE OPTIONAL ############
ADMIN_EMAIL =                           #管理员邮箱
SMTP_HOST = 
SMTP_PORT = 
SMTP_FROM = 
SMTP_SUBJECT = DenyHosts Report         #邮件主题
AGE_RESET_VALID=5m                      #有效用户登录失败计数归零的时间
AGE_RESET_ROOT=10m                      #root用户登录失败计数归零的时间
AGE_RESET_RESTRICTED=10m                #用户的失败登录计数重置为0的时间(/usr/share/denyhosts/data/restricted-usernames)
AGE_RESET_INVALID=5m                    #无效用户登录失败计数归零的时间


   ######### THESE SETTINGS ARE SPECIFIC TO DAEMON MODE  ##########


DAEMON_LOG = /var/log/denyhosts              #DenyHosts日志文件存放的路径,默认
DAEMON_SLEEP = 30s                           #当以后台方式运行时,每读一次日志文件的时间间隔。
DAEMON_PURGE = 10m                           #当以后台方式运行时,清除机制在 HOSTS_DENY 中终止旧条目的时间间隔,这个会影响PURGE_DENY的间隔。
RESET_ON_SUCCESS = yes                      #如果一个ip登陆成功后,失败的登陆计数是否重置为0
配置完之后重启服务 /etc/init.d/denyhosts restart

解禁IP

删除一个已经禁止的主机IP,并加入到允许主机例表,只在 /etc/hosts.deny 删除是没用的。需要进入工作 目录(WORK_DIR),进入以下操作:

1、停止DenyHosts服务:service denyhosts stop

2、在 /etc/hosts.deny 中删除你想取消的主机IP 3、编辑 DenyHosts 工作目录的所有文件,通过

$ pwd
/usr/share/denyhosts/data

$ grep 117.78.49.95  *
hosts:117.78.49.95:12:Tue Jan  2 23:25:32 2018
hosts-restricted:117.78.49.95:0:Tue Jan  2 22:48:20 2018
hosts-root:117.78.49.95:1:Tue Jan  2 23:25:02 2018
hosts-valid:117.78.49.95:0:Tue Jan  2 22:54:30 2018
users-hosts:qq - 117.78.49.95:3:Tue Jan  2 22:54:30 2018
users-hosts:root - 117.78.49.95:11:Tue Jan  2 23:25:02 2018
4、 添加你想允许的主机IP地址到 allowed-hosts(如果有)

5、启动DenyHosts服务:/etc/init.d/denyhosts start

或者简单粗暴的直接允许访问

$ cat /etc/hosts.allow
sshd: 117.78.49.95
本文阅读量  次
本站总访问量  次