tcp_wrappers(2)hosts.allow hosts.deny配置

在 Linux 的 TCP Wrappers 中,/etc/hosts.allow/etc/hosts.deny 文件的配置语法非常相似,用于定义访问控制规则。


1.基本语法

配置文件中的每条规则通常遵循以下格式:

服务名: 客户端列表 [: 选项]

1.1组成部分

  1. 服务名:

    • 指定受控的网络服务,通常是守护进程的名称(如 sshdvsftpdtelnetd)。
    • 可以使用 ALL 表示所有支持 TCP Wrappers 的服务。
    • 服务名通常是二进制文件的名称,而不是配置文件中的服务名。
  2. 客户端列表:

    • 定义允许或拒绝访问的客户端,可以是 IP 地址、主机名、网络段、通配符等。
    • 多个客户端可以用逗号分隔(如 192.168.1.10, 10.0.0.0/8)。
  3. 选项(可选):

    • 用于执行特定操作,例如记录日志、运行脚本等。以冒号 : 开头。

2.客户端列表的表示方法

客户端可以以多种形式指定,支持灵活的匹配方式:

  1. 单个 IP 地址:

    • 示例: 192.168.1.10
    • 匹配特定的客户端 IP。
  2. 网络段(CIDR 表示法):

    • 示例: 192.168.1.0/24
    • 匹配整个子网(这里是 192.168.1.0 到 192.168.1.255)。
  3. 主机名:

    • 示例: example.com
    • 匹配特定主机名(需要 DNS 解析支持)。
  4. 域名:

    • 示例: .example.com
    • 匹配以 .example.com 结尾的所有主机名(如 www.example.commail.example.com)。
  5. 通配符:

    • ALL: 匹配所有客户端。
    • LOCAL: 匹配没有.的主机名(通常是本地主机)。
    • EXCEPT: 用于排除某些客户端。例如 ALL EXCEPT 192.168.1.10 表示除了 192.168.1.10 外的所有客户端。
  6. IP 通配符:

    • 示例: 192.168.
    • 匹配以 192.168. 开头的所有 IP 地址(如 192.168.1.10192.168.2.20)。

3.可选选项

选项以冒号 : 分隔,可以添加在规则后面,用于增强功能。常用选项包括:

  1. 记录日志:

    • severity 级别: 将访问记录到指定级别的日志。
    • 示例: : severity info(记录到 info 级别的日志)。
  2. 拒绝消息:

    • deny: 明确拒绝连接(通常用于 /etc/hosts.deny)。
    • 示例: : deny
  3. 执行命令:

    • spawn 命令: 在匹配规则时执行指定命令。
    • 示例: : spawn /bin/echo "Access from %h" >> /var/log/access.log
      • %h 表示客户端主机名。
      • %c 表示客户端信息
      • %d 服务名
  4. 自定义返回消息:

    • twist 命令: 返回自定义响应并关闭连接。
    • 示例: : twist /bin/echo "Go away!"

4.配置示例

/etc/hosts.allow 示例

  1. 允许特定 IP 访问 SSH:
    sshd: 192.168.1.10
    只允许 192.168.1.10 访问 SSH。

  2. 允许本地网络访问所有服务,并记录日志:
    ALL: 192.168.1.0/24 : severity info

  3. 允许特定域名访问 FTP:
    vsftpd: .example.com

/etc/hosts.deny 示例

  1. 拒绝所有客户端访问 Telnet:
    telnetd: ALL

  2. 拒绝除特定 IP 外的所有访问:
    sshd: ALL EXCEPT 192.168.1.10

  3. 拒绝访问并记录尝试:
    ALL: ALL : spawn /bin/echo “Denied %c from %h” >> /var/log/denied.log

    • %c 表示客户端地址,%h 表示主机名。

组合使用

通常的策略是:

  • /etc/hosts.allow 中定义允许的访问。
  • /etc/hosts.deny 中拒绝所有其他访问。
    例如:
  • /etc/hosts.allow:
    sshd: 192.168.1.0/24, 10.0.0.5
  • /etc/hosts.deny:
    ALL: ALL
    这表示只允许 192.168.1.0/2410.0.0.5 访问 SSH,其他所有连接都被拒绝。

5.注意事项

  1. 规则顺序:

    • TCP Wrappers 先检查 /etc/hosts.allow,再检查 /etc/hosts.deny
    • 一旦匹配到规则,后续规则将被忽略。
  2. 大小写敏感:

    • 服务名和选项区分大小写,需与实际守护进程名称一致。
  3. 测试配置:

    • 修改配置后无需重启服务,规则即时生效。
    • 可用 tcpdchk(如果安装了)检查语法错误:
      1
      tcpdchk -v
  4. 局限性:

    • 只适用于支持 libwrap 的服务。
    • 不支持复杂的条件逻辑,建议结合防火墙使用。