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:定义拒绝访问的服务;
这两个配置文件使用匹配顺序的,如下图:
即先匹配 /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
$ 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
$ 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.
$ cat /etc/hosts.allow
sshd: 10.0.1.200:deny
$ cat /etc/hosts.deny
$ cat /etc/hosts.allow
$ cat /etc/hosts.deny
sshd: 10.0.1.200:allow
sshd: ALL
$ 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设成开机启动
配置文件¶
############ 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
5、启动DenyHosts服务:/etc/init.d/denyhosts start
或者简单粗暴的直接允许访问
$ cat /etc/hosts.allow
sshd: 117.78.49.95
本站总访问量 次