Linux进阶_TCPWrappers介绍

TCP_Wrappers介绍

作者:Wieste Venema,IBM,Google
工作在第四层(传输层)的TCP协议
对有状态连接的特定服务进行安全检测并实现访问控制
以库文件形式实现

  • 某进程是否接受libwrap的控制取决于发起此进程的程序在编译时是否针对libwrap进行编译的
  • 判断服务程序是否能够由tcp_wrapper进行访问控制的方法:
    ldd /PATH/TO/PROGRAM|grep libwrap.so

TCP_Wrappers的使用

  • 配置文件:
    /etc/hosts.allow中添加,允许登录,并记录日志
    /etc/hosts.deny中添加,拒绝登录,并记录日志
  • 帮助参考:man 5 hosts_accessman 5 hosts_options
  • 检查顺序:hosts.allowhosts.deny(默认允许)
    注意:一旦前面规则匹配,直接生效,将不再继续

基本语法:

Daemon_list@Host: Client_list [ :Options :Option… ]

  1. 先来看看一些简单的示例(注意修改的哪个文件):
#允许192.168.1.0/24的主机访问sshd
[root]$ vim /etc/hosts.allow
    sshd: 192.168.1.

#拒绝所有访问
[root]$ vim /etc/hosts.deny
    sshd: ALL

#仅仅仅仅允许192.168.1.0/24的主机访问sshd
[root]$ vim /etc/hosts.allow
    sshd: 192.168.1.
[root]$ vim /etc/hosts.deny
    sshd: ALL

#禁止192.168.1.0/24的主机访问telnet和vsftpd服务
[root]$ vim /etc/hosts.allow
    vsftpd,in.telnetd: 192.168.1.

Daemon_list@Host: Client_list [ :Options :Option… ]

  1. Daemon_list@Host格式

    1. 单个应用程序的二进制文件名,而非服务名,例如vsftpd
    2. 以逗号或空格分隔的应用程序文件名列表,如:sshd,vsftpd
    3. ALL表示所有接受tcp_wrapper控制的服务程序
      主机有多个IP,可用@hostIP来实现控制
      如:[email protected]
  2. Client_list格式(以逗号或空格分隔的客户端列表)

    1. 基于IP地址:192.168.10.1
    2. 网络地址:192.168.1.  #相当于192.168.1.0/24(CentOS7)
    3. 基于网络/掩码:192.168.0.0/255.255.255.0
    4. 基于主机名:www.magedu.com .magedu.com 较少用
    5. 基于网络组(NIS域):@mynetwork
    6. 内置变量:ALL,LOCAL,KNOWN,UNKNOWN,PARANOID
  3. [:options]选项:

    • 帮助:man 5 hosts_options
    • deny 主要用在/etc/hosts.allow定义“拒绝”规则
      如:vsftpd: 172.16. :deny
    • allow 主要用在/etc/hosts.deny定义“允许”规则
      如:vsftpd:172.16. :allow
    • spawn 启动一个外部程序完成执行的操作
    • twist 实际动作是拒绝访问,使用指定操作替换当前服务,标准输出和ERROR发送到客户端,默认至/dev/null
    • EXCEPT用法示例:排除某些内容
#禁止172.16.0.0/16网络访问我,排除172.16.100.0/24和172.16.100.1之外
vsftpd: 172.16. EXCEPT 172.16.100.0/24 EXCEPT 172.16.100.1

测试工具:

  • tcpdmatch [-d] daemon[@host] client
    -d 测试当前目录下的hosts.allow和hosts.deny

  • 示例
    sshd: ALL :spawn echo "$(date +%%F) login attempt from %c to %s,%d" >>/var/log/sshd.log

  • 说明:
    %c 客户端信息
    %s 服务器端信息
    %d 服务名
    %p 守护进程的PID
    %% 表示%

vsftpd: 172.16. :twist /bin/echo “connection prohibited”

实战一下

lastb | awk '!/^btmp|^$/{ip[$3]++}END{for(i in ip){if(ip[i]>=4){system("echo sshd:"i">> /etc/hosts.deny")}}}'

实验:

  1. 实验环境
    主机|IP
    -|-
    host A| 172.16.10.10
    host B| 172.16.10.20

  2. 实验之前我们还验证下sshd服务是否依赖libwrap库

ldd /usr/sbin/sshd | grep libwrap

在这里插入图片描述

host A

  1. 先来试试host A 能不能连接host B
ssh 172.16.10.20
#连接成功

host B

  1. 编辑配置文件/etc/hosts.deny
[root]$ vim /etc/hosts.deny
sshd:172.16.10.10

host A

  1. 然后hostA再连接hostB,就会被拒绝了,2个IP都不行
ssh 172.16.10.20
#或
ssh 182.168.88.77

在这里插入图片描述

host B

  1. 来给host B添加一个ip,再修改下配置文件/etc/hosts.deny,实现对某个地址的访问控制
ip a a 172.16.10.200 dev eth1

vim /etc/hosts.deny
    [email protected]:172.16.10.10

在这里插入图片描述

  1. 还可以控制多个服务,用逗号隔开
vim /etc/hosts.deny
    sshd,in.telnetd:172.16.10.10
  1. EXPECT的用法,排除内容
sshd:172.16.10. EXCEPT 172.16.10.10

  1. 还有更多的用法
# 禁止172.20.1.开头的所有ip地址
sshd:172.20.1.
#禁止172.20.1.0/24 网段内的所有主机(cnetos7支持此种写法)
ssh:172.20.1.0/24
#禁止172.20.1.0/255.255.255.0网段内的所有地址
ssh:172.20.1.0/255.255.255.0
#禁止所有ip地址
ssh:ALL
#禁止不包含.号的主机名的主机访问
ssh:LOCAL
#禁止所有主机名可以解析的地址
ssh:KNOW
#禁止不能解析的域名主机
ssh:UNKNOW
#禁止域名解析和反解析不匹配的主机
ssh:PARANOID

猜你喜欢

转载自blog.csdn.net/weixin_42758707/article/details/94738605