Tcp_Wrapper_简单的基于主机的访问控制工具

来源:互联网 发布:淘宝推广自己买领佣金 编辑:程序博客网 时间:2024/05/23 23:55

目录

    • 目录
      • 简介
      • 特性
        • Tcp_Wrapper的实现
        • 基本语法
      • 范例
        • 范例1
        • 范例2
        • 范例3
        • 范例4
        • 范例5
        • 范例6

简介

tcp wrapperWietse Venema开发的一个开源软件。它是一个用来分析TCP/IP封包的软件,类似的IP封包软件还有iptablesLinux默认安装了tcp_wrapper。作为一个安全的系统,Linux本身有两层安全防火墙,通过IP过滤机制的iptables实现第一层防护。iptables防火墙通过直观的监视系统的运行状况,阻挡网络中的一些恶意攻击,保护整个系统正常运行免遭攻击和破坏。如果通过了第一层防护,那么下一层防护就是tcp_wrapper了。通过tcp_wrapper可以实现对系统中提供的某些服务的开放和关闭、允许及禁止,从而更有效的保证系统安全运行。使用tcp_wrapper的功能仅需要两个配置文件:/etc/hosts.allow/etc/hosts.deny

特性

  • 工作在第四层(传输层)的TCP协议
  • 对有状态连接的特定服务进行安全检测并实现访问控制
  • 以库文件形式实现
  • 某进程是否接受libwrap的控制取决于发起此进程的程序在编译时是否针对libwrap进行编译的
  • 判断sshd服务是否支持tcp_wrapper
方法1:[root@centos6 ~]# ldd `which sshd` | grep libwrap.so   # sshd服务支持tcp_wrapper    libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f01bb457000)方法2:[root@centos6 ~]# strings `which sshd` | grep libwrap.so # 通过strings命令也可以查看,sshd服务程序是否调用libwrap.so库。strings命令列出sshd程序中所有的ASCII文本。libwrap.so.0

Tcp_Wrapper的实现

如果要使用Tcp_Wrapper的功能,只需两个配置文件:/etc/hosts.allow/etc/hosts.deny。检查顺序为: /etc/hosts.allow –>/etc/hosts.deny(默认允许)。注:一旦前面规则匹配,直接生效 ,将不再继续检查。下图为/etc/hosts.allow/etc/hosts.deny工作示意图:

基本语法

daemon_list@host: [except client_list1]client_list2 [ :options :option… ]

daemon_list@host格式

  • 单个应用程序的二进制文件名,而非服务名, 例如vsftpd
  • 以逗号或空格分隔的应用程序文件名列表,如:sshd,vsftpd
  • ALL表示所有接受tcp_wrapper控制的服务程序

@host格式

  • 主机有多个IP,可用@hostIP来实现控制,如:in.telnetd@192.168.0.254

client_list格式

  • 以逗号或空格分隔的客户端列表
  • 基于IP地址: 192.168.10.1 192.168.1.
  • 基于主机名: www.magedu.com .magedu.com 较少用
  • 基于网络/掩码: 192.168.0.0/255.255.255.0
  • 基于net/prefixlen: 192.168.1.0/24(CentOS7支持)
  • 基于网络组(NIS 域): @mynetwork
  • 内置ACLALL(所有来源主机), LOCAL(主机名中不带.的), KNOWN(所有能解析到的主机), UNKNOWN(所有未能解析到的主机),PARANOID (正反解析不匹配的地址)

[:options]选项:

  • deny 主要用在/etc/hosts.allow定义“拒绝”规则,如: vsftpd: 172.16. :deny

  • allow 主要用在/etc/hosts.deny定义“允许” 规则,如: vsftpd:172.16. :allow

  • spawn 启动一个外部程序完成执行的操作

  • twist 实际动作是拒绝访问,使用指定的操作替换当前服务,标准I/OERROR发送到客户端,默认至/dev/null

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

except client_list1:代表除了client_list1剩余的都匹配

范例:

范例1

拒绝192.168.8.129访问192.168.8.128的sshd服务

[root@centos6 ~]# vim /etc/hosts.deny  #编辑/etc/hosts.deny文件,拒绝192.168.8.129访问sshdsshd@192.168.8.128: 192.168.8.129[root@centos7 ~]# ssh 192.168.8.128        #在192.168.8.129访问192.168.8.128已经被拒绝,注此文家修改完,立刻生效ssh_exchange_identification: read: Connection reset by peer[root@centos6 ~]# tail -2 /var/log/secure  #在192.168.8.128上查看日志,已经把192.168.8.129拒绝Sep 15 09:39:37 centos6 sshd[3197]: pam_unix(sshd:session): session closed for user rootSep 15 09:40:51 centos6 sshd[3222]: refused connect from 192.168.8.129 (192.168.8.129)

范例2

拒绝192.168.8.0/24网段访问192.168.8.128的ftp服务,但允许192.168.8.129访问

[root@A ~]# vi  /etc/hosts.deny            #编辑/etc/hosts.deny文件,拒绝192.168.8.0/24网段访问192.168.8.128的ftp服务,但允许192.168.8.129访问vsftpd: 192.168.8.128 192.168.8. EXCEPT 192.168.8.129[root@B ~]# ifconfig ens34     # 在B上查看你ens34的IPens34: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500        inet 192.168.8.129  netmask 255.255.255.0  broadcast 192.168.8.255        inet6 fe80::b609:4db6:c15e:2d01  prefixlen 64  scopeid 0x20<link>        ether 00:0c:29:57:4a:72  txqueuelen 1000  (Ethernet)        RX packets 2094  bytes 202054 (197.3 KiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 1630  bytes 464373 (453.4 KiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0[root@B ~]# ftp 192.168.8.128  # 访问ftp是可以的,因为我们允许192.168.8.129IP访问Connected to 192.168.8.128 (192.168.8.128).220 (vsFTPd 2.2.2)Name (192.168.8.128:root): ftp331 Please specify the password.Password:230 Login successful.Remote system type is UNIX.Using binary mode to transfer files.ftp> [root@C ~]# ifconfig eth0  # 在C上查看你eth0的IPeth0      Link encap:Ethernet  HWaddr 00:50:56:20:B8:83            inet addr:192.168.8.141  Bcast:192.168.8.255  Mask:255.255.255.0          inet6 addr: fe80::250:56ff:fe20:b883/64 Scope:Link          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1          RX packets:1280 errors:0 dropped:0 overruns:0 frame:0          TX packets:1194 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:1000           RX bytes:108463 (105.9 KiB)  TX bytes:705977 (689.4 KiB)[root@C ~]# ftp 192.168.8.128      # 访问192.168.8.128,被拒绝Connected to 192.168.8.128 (192.168.8.128).421 Service not available.ftp> [root@C ~]# 

范例3

拒绝192.168.0..0/24网段访问192.168.8.128的ftp服务,但拒绝192.168.8.129访问

[root@A ~]# vim /etc/hosts.allow           #编辑/etc/hosts.deny文件,逻辑关系为:先把192.168.0.0这个网段允许,然后又将192.168.8.0网段排除了,最后把192.168.8.129给拒绝了。vsftpd: 192.168. EXCEPT 192.168.8. EXCEPT 192.168.8.129:deny[root@B ~]# ifconfig ens34             # B的IP为192.168.8.129ens34: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500        inet 192.168.8.129  netmask 255.255.255.0  broadcast 192.168.8.255        inet6 fe80::b609:4db6:c15e:2d01  prefixlen 64  scopeid 0x20<link>        ether 00:0c:29:57:4a:72  txqueuelen 1000  (Ethernet)        RX packets 2546  bytes 239131 (233.5 KiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 2017  bytes 500395 (488.6 KiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0[root@B ~]# ftp 192.168.8.128  # 在192.168.8.129是无法访问192.168.8.128的Connected to 192.168.8.128 (192.168.8.128).421 Service not available.ftp>    [root@C ~]# ifconfig eth0      # C的IP为192.168.8.141eth0      Link encap:Ethernet  HWaddr 00:50:56:20:B8:83            inet addr:192.168.8.141  Bcast:192.168.8.255  Mask:255.255.255.0          inet6 addr: fe80::250:56ff:fe20:b883/64 Scope:Link          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1          RX packets:1620 errors:0 dropped:0 overruns:0 frame:0          TX packets:1476 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:1000           RX bytes:138308 (135.0 KiB)  TX bytes:735219 (717.9 KiB)[root@C ~]# ftp 192.168.8.128      # 在C上面是可以访问192.168.8.128的Connected to 192.168.8.128 (192.168.8.128).220 (vsFTPd 2.2.2)Name (192.168.8.128:root): ftp331 Please specify the password.Password:230 Login successful.Remote system type is UNIX.Using binary mode to transfer files.ftp> 

范例4

允许所有人ssh到192.168.8.128,但登陆时记录日志

[root@A ~]# vim /etc/hosts.allow       #编辑/etc/hosts.allow文件sshd:ALL:spawn echo "$(date '+%%F %%T') Login from client\:%a %c to %s %p" >>     /var/log/sshd.log        # %c 客户端信息    # %s 服务器端信息    # %d 服务名    # %p 守护进程的PID    # 注:使用%时需要转义,输入%%代表%,:也需要转义/:代表:[root@B ~]# ssh 192.168.8.128      # 在B上连接192.168.8.128Last login: Fri Sep 15 11:03:17 2017 from 192.168.8.129[root@A ~]# cat /var/log/sshd.log  # 在192.168.8.128上查看日志已经记录2017-09-15 12:03:20 Login from client:192.168.8.129 192.168.8.129 to sshd@192.168.8.128 4532

范例5

拒绝所有人访问192.168.8.128的ftp服务,当有用户连接时提示Don't allow access ftp

[root@A ~]# vi /etc/hosts.allow        # 编辑/etc/hosts.allow文件vsftpd:ALL:twist echo "Don't allow access ftp"[root@B ~]# ftp 192.168.8.128      # 使用B连接192.168.8.128Connected to 192.168.8.128 (192.168.8.128). # 已经看到我们定义的提示信息。Don't allow access ftpftp> 

范例6

拒绝所有人访问192.168.8.128的sshd服务,当有用户连接时提示Don't allow access ftp

[root@A ~]# vi /etc/hosts.allow        # 编辑/etc/hosts.allow文件sshd:ALL:twist echo "Don't allow access sshd"[root@B ~]# ssh 192.168.8.128      # 使用B连接192.168.8.128,已经被拒绝但没有看到提示ssh_exchange_identification: read: Connection reset by peer[root@B ~]# ssh -v 192.168.8.128   # 打开调试模式就可以看到了OpenSSH_6.6.1, OpenSSL 1.0.1e-fips 11 Feb 2013debug1: Reading configuration data /etc/ssh/ssh_configdebug1: /etc/ssh/ssh_config line 56: Applying options for *debug1: Connecting to 192.168.8.128 [192.168.8.128] port 22.debug1: Connection established.debug1: permanently_set_uid: 0/0debug1: identity file /root/.ssh/id_rsa type 1debug1: identity file /root/.ssh/id_rsa-cert type -1debug1: identity file /root/.ssh/id_dsa type -1debug1: identity file /root/.ssh/id_dsa-cert type -1debug1: identity file /root/.ssh/id_ecdsa type -1debug1: identity file /root/.ssh/id_ecdsa-cert type -1debug1: identity file /root/.ssh/id_ed25519 type -1debug1: identity file /root/.ssh/id_ed25519-cert type -1debug1: Enabling compatibility mode for protocol 2.0debug1: Local version string SSH-2.0-OpenSSH_6.6.1debug1: ssh_exchange_identification: Don't allow access sshd <==已经看到我们定义的提示信息ssh_exchange_identification: read: Connection reset by peer
原创粉丝点击