Debian防火墙入门:保护你的服务器安全

Debian 防火墙入门:保护你的服务器安全

在当今互联网环境中,服务器安全至关重要。防火墙作为第一道防线,可以有效阻止未经授权的访问,降低被攻击的风险。Debian 系统默认使用 iptables 作为其防火墙工具,但 iptables 配置较为复杂。为了简化配置,许多 Debian 用户选择使用 ufw (Uncomplicated Firewall) 或 nftables。本文将详细介绍这三种工具的基本配置和使用,帮助你入门 Debian 服务器防火墙的配置。

一、iptables 基础 (了解即可,初学者建议跳过)

iptables 是 Linux 内核内置的 Netfilter 防火墙框架的用户空间工具。它直接与内核交互,提供强大且灵活的防火墙功能。iptables 基于表 (table)、链 (chain) 和规则 (rule) 的概念进行工作。

  • 表 (table): iptables 有几个内置的表,每个表负责不同的功能:

    • filter: 默认表,用于过滤数据包,是最常用的表。
    • nat: 用于网络地址转换 (NAT)。
    • mangle: 用于修改数据包的头部信息。
    • raw: 用于处理原始数据包,通常用于配置连接跟踪的例外情况。
    • security: 用于强制访问控制 (MAC) 网络规则 (例如 SELinux)。
  • 链 (chain): 每个表包含多个链,链是规则的集合,数据包按照链中的规则顺序进行匹配:

    • INPUT: 处理进入服务器的数据包。
    • OUTPUT: 处理从服务器发出的数据包。
    • FORWARD: 处理经过服务器转发的数据包 (例如,服务器作为路由器时)。
    • PREROUTING (仅在 natmangle 表中): 在路由决策之前处理数据包。
    • POSTROUTING (仅在 natmangle 表中): 在路由决策之后处理数据包。
  • 规则 (rule): 规则定义了如何处理符合特定条件的数据包。 规则通常包含:

    • 匹配条件 (例如,源 IP 地址、目标端口、协议)。
    • 动作 (target) (例如,ACCEPT 允许、DROP 丢弃、REJECT 拒绝并返回错误信息)。

iptables 常用命令 (了解即可):

  • iptables -L: 列出当前 filter 表的所有规则。
  • iptables -L -v: 列出当前 filter 表的所有规则,并显示详细信息。
  • iptables -L -n: 列出当前 filter 表的所有规则,以数字形式显示 IP 地址和端口号。
  • iptables -A INPUT -p tcp --dport 22 -j ACCEPT: 在 INPUT 链中追加一条规则,允许 TCP 协议、目标端口为 22 (SSH) 的数据包通过。
  • iptables -A INPUT -j DROP: 在 INPUT 链中追加一条规则,丢弃所有其他数据包 (实现默认拒绝策略)。
  • iptables -D INPUT 1: 删除 INPUT 链中的第一条规则。
  • iptables -F: 清空 filter 表的所有规则。
  • iptables -X: 删除所有用户自定义的链。
  • iptables -P INPUT DROP: 设置 INPUT 链的默认策略为 DROP
  • iptables-save > /etc/iptables/rules.v4 (保存 IPv4 规则)。
  • iptables-restore < /etc/iptables/rules.v4 (恢复 IPv4 规则)。
  • ip6tables 系列命令与 iptables 对应,用于配置 IPv6 规则。

强烈建议初学者不要直接使用 iptables,除非你已经非常熟悉网络和防火墙概念。 错误的配置可能导致服务器无法访问。

二、UFW (Uncomplicated Firewall) - 推荐初学者使用

ufw 是一个用户友好的前端,用于简化 iptables 的配置。它提供了一组简单的命令来管理防火墙规则,非常适合初学者和日常使用。

  1. 安装 UFW:

    bash
    sudo apt update
    sudo apt install ufw

  2. 启用 UFW:

    bash
    sudo ufw enable

    启用 ufw 时,它会设置一个默认的拒绝传入连接、允许传出连接的策略。

  3. 查看 UFW 状态:

    bash
    sudo ufw status verbose

  4. 允许常用服务:

    bash
    sudo ufw allow ssh # 允许 SSH (端口 22)
    sudo ufw allow http # 允许 HTTP (端口 80)
    sudo ufw allow https # 允许 HTTPS (端口 443)
    sudo ufw allow 8080/tcp # 允许 TCP 端口 8080
    sudo ufw allow 8080/udp # 允许 UDP 端口 8080
    sudo ufw allow from 192.168.1.100 # 允许来自特定 IP 地址的所有连接
    sudo ufw allow from 192.168.1.0/24 #允许来自指定子网的连接
    sudo ufw allow to any port 22 proto tcp from 192.168.1.100 # 允许来自192.168.1.100访问22端口tcp协议

  5. 拒绝特定服务或端口:

    bash
    sudo ufw deny 21/tcp # 拒绝 FTP (端口 21)
    sudo ufw deny from 192.168.1.200 # 拒绝来自特定 IP 地址的所有连接

  6. 删除规则:

    bash
    sudo ufw delete allow ssh # 删除允许 SSH 的规则
    sudo ufw delete 5 # 删除编号为5的规则(使用 ufw status numbered 查看)

    可以使用 ufw status numbered 查看规则及其编号,然后使用编号删除规则更安全。

  7. 禁用 UFW:

    bash
    sudo ufw disable

  8. 重置 UFW(谨慎使用):
    bash
    sudo ufw reset

    这将删除所有规则,并将 UFW 重置为默认配置。

三、nftables - 进阶配置

nftablesiptables 的继任者,它提供了一个更现代化、更灵活的防火墙框架。nftables 使用一种新的语法,更易于理解和维护。

  1. 安装 nftables:

    bash
    sudo apt update
    sudo apt install nftables

  2. 查看当前规则 (通常为空):

    bash
    sudo nft list ruleset

  3. 创建一个基本的 nftables 配置文件 (例如 /etc/nftables.conf):

    ```nftables

    !/usr/sbin/nft -f

    flush ruleset

    table inet filter {
    chain input {
    type filter hook input priority 0; policy drop;

                # 允许本地回环流量
                iifname lo accept
    
                # 允许已建立和相关的连接
                ct state established,related accept
    
                # 允许 SSH 连接
                tcp dport 22 accept
    
                # 允许 ICMP (ping)
                ip protocol icmp accept
    
                # 允许 HTTP 和 HTTPS
                tcp dport { 80, 443 } accept
        }
    
        chain forward {
                type filter hook forward priority 0; policy drop;
        }
    
        chain output {
                type filter hook output priority 0; policy accept;
        }
    

    }
    ```

    • #!/usr/sbin/nft -f: 指定该文件由 nft 命令解释。
    • flush ruleset: 清除所有现有规则。
    • table inet filter: 创建一个名为 filter 的表,用于 IPv4 和 IPv6 (inet)。
    • chain input/forward/output: 定义输入、转发和输出链。
    • type filter hook ... priority 0;: 指定链的类型、挂载点和优先级。
    • policy drop;: 设置默认策略为 drop (丢弃)。
    • iifname lo accept: 允许本地回环接口 (lo) 的所有流量。
    • ct state established,related accept: 允许已建立和相关的连接。
    • tcp dport 22 accept: 允许 TCP 端口 22 (SSH) 的连接。
    • ip protocol icmp accept:允许ICMP协议,用于ping等。
    • tcp dport { 80, 443 } accept: 用花括号列出多个端口。
  4. 加载配置文件:

    bash
    sudo nft -f /etc/nftables.conf

  5. 启用 nftables 服务 (并设置开机启动):

    bash
    sudo systemctl enable nftables
    sudo systemctl start nftables

  6. 其他常用 nftables 命令:

    • nft add rule inet filter input tcp dport 8080 accept: 添加一条规则到 inet filter input 链,允许 TCP 端口 8080。
    • nft insert rule inet filter input position 2 tcp dport 25 accept: 在 inet filter input 链的第 2 个位置插入一条规则。
    • nft delete rule inet filter input handle 1: 删除 inet filter input 链中句柄 (handle) 为 1 的规则 (使用 nft list ruleset 查看句柄)。
    • nft add table inet mytable: 创建一个新的表。
    • nft add chain inet mytable mychain { type filter hook input priority 0 \; }: 创建一个新的链。

四、总结与建议

  • 初学者: 强烈建议使用 ufw,因为它简单易用,可以满足大多数基本需求。
  • 进阶用户: 如果需要更精细的控制或更复杂的规则,可以考虑使用 nftables
  • 不推荐初学者直接使用 iptables,除非你有深厚的网络知识。
  • 默认拒绝策略: 始终建议采用默认拒绝策略,只允许必要的服务和端口通过。
  • 测试: 在进行任何防火墙配置更改后,务必进行测试,确保服务器仍然可以正常访问,并且阻止了不必要的连接。
  • 定期审查: 定期审查防火墙规则,确保它们仍然符合安全需求。
  • 备份: 在修改前,务必备份防火墙规则。 iptables-saveufw 的状态信息、nft list ruleset 的输出都可以作为备份。
  • 日志: 开启防火墙日志记录,可以帮助你了解防火墙的活动情况,并及时发现潜在的安全威胁。 (例如 ufw logging on)

通过合理配置防火墙,你可以显著提高 Debian 服务器的安全性,保护你的数据和服务免受未经授权的访问。 请务必谨慎操作,并在生产环境中进行充分测试。

THE END