Linux iptables 防火墙使用指南
11 minute read

在 Linux 系统中,iptables 是一个功能强大且灵活的防火墙管理工具,它允许管理员通过定义规则来控制网络流量的进出。掌握 iptables 的使用,对于保障服务器安全、优化网络性能至关重要,尤其对于承载高并发访问的世界杯投注平台而言,精细化的网络控制是必不可少的。本文将详细介绍 iptables 的基本概念、常用命令以及一些实际应用场景。

iptables 的基本概念

iptables 主要由以下几个核心概念组成:

  1. 表(Tables): iptables 包含多个表,每个表负责处理不同类型的网络包。最常用的表有:

    • filter 表: 这是默认的表,用于进行数据包过滤(允许或拒绝)。它包含 INPUTOUTPUTFORWARD 三个链。
    • nat 表: 用于网络地址转换(NAT),允许修改数据包的源 IP 或目标 IP,常用于端口转发或隐藏内部网络地址。它包含 PREROUTINGPOSTROUTINGOUTPUT 三个链。
    • mangle 表: 用于修改数据包的特定选项(如 TTL),通常用于更高级的网络控制。
    • raw 表: 主要用于配置连接跟踪(Connection Tracking)的例外情况。
  2. 链(Chains): 链是数据包在表中流经的规则序列。每个链都与特定的网络流量方向相关联:

    • INPUT: 处理入站数据包,即目标地址是本机的数据包。
    • OUTPUT: 处理出站数据包,即源地址是本机的数据包。
    • FORWARD: 处理转发数据包,即数据包的目的地不是本机,而是通过本机转发到其他主机。
    • PREROUTING: 在进行路由选择之前处理数据包,适用于 natmangle 表,主要用于修改目标 IP 地址。
    • POSTROUTING: 在进行路由选择之后处理数据包,适用于 natmangle 表,主要用于修改源 IP 地址。
  3. 规则(Rules): 规则是链中的核心元素,它定义了当数据包符合特定条件时应该采取的动作。每条规则通常包含:

    • 匹配条件(Matches): 用于检查数据包的各种属性,如源 IP 地址、目标 IP 地址、源端口、目标端口、协议类型(TCP/UDP/ICMP)等。
    • 目标(Target/Action): 当数据包匹配规则时,要执行的操作。常见的目标有:
      • ACCEPT: 允许数据包通过。
      • DROP: 静默丢弃数据包,不给发送方任何响应。
      • REJECT: 拒绝数据包通过,并给发送方一个 ICMP 错误消息。
      • SNAT (Source NAT): 修改数据包的源 IP 地址。
      • DNAT (Destination NAT): 修改数据包的目标 IP 地址。
      • MASQUERADE: 动态的 SNAT,适用于 IP 地址会变化的场景。
      • LOG: 记录数据包信息,用于审计和调试。

常用 iptables 命令

以下是一些常用的 iptables 命令,用于管理防火墙规则:

  • 查看所有规则:

    1sudo iptables -L -n -v
    
    • -L: 列出所有规则。
    • -n: 以数字格式显示 IP 地址和端口,不进行 DNS 反向解析。
    • -v: 显示更详细的信息,如数据包和字节计数。
  • 清空所有规则:

    1sudo iptables -F
    

    这将删除所有表中所有的规则。

  • 删除指定链的规则:

    1sudo iptables -F INPUT
    

    这将清空 INPUT 链中的所有规则。

  • 删除指定编号的规则: 首先使用 -L --line-numbers 查看规则及编号,然后使用 -D 命令删除。

    1sudo iptables -L INPUT --line-numbers
    2sudo iptables -D INPUT 2 # 删除 INPUT 链中的第二条规则
    
  • 设置链的默认策略:

    1sudo iptables -P INPUT DROP # 默认拒绝所有入站流量
    2sudo iptables -P FORWARD DROP # 默认拒绝所有转发流量
    3sudo iptables -P OUTPUT ACCEPT # 默认允许所有出站流量
    

    警告: 设置默认策略为 DROP 后,如果未配置允许必要流量的规则,可能会导致服务器无法访问。

  • 添加规则: iptables 命令的格式通常是 iptables -t <table> -A <chain> <match options> -j <target>

    • -t <table>: 指定要操作的表,默认为 filter
    • -A <chain>: 将规则添加到链的末尾。
    • -I <chain> [rule_num]: 将规则插入到链的开头或指定位置。

实例:配置防火墙规则

1. 允许 SSH 访问 (TCP 端口 22)

为了能够远程管理服务器,必须允许 SSH 流量。

1sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

这条规则允许所有 TCP 协议,目标端口为 22 的流量进入。

2. 允许 HTTP 和 HTTPS 访问 (TCP 端口 80 和 443)

对于 Web 服务器,需要开放 HTTP 和 HTTPS 端口。

1sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
2sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

3. 允许 Ping (ICMP)

如果需要服务器能够响应 ping 命令,需要允许 ICMP 流量。

1sudo iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT

--icmp-type 8 代表 ICMP Echo Request (ping 请求)。

4. 限制特定 IP 地址访问

例如,只允许来自特定 IP 地址 192.168.1.100 的 SSH 访问。

1sudo iptables -A INPUT -p tcp -s 192.168.1.100 --dport 22 -j ACCEPT

注意: 如果已经有允许所有 IP 访问 SSH 的规则,这条规则需要插入到允许规则之前,或者删除之前的通用允许规则。

5. 阻止特定 IP 地址访问

例如,阻止来自 IP 地址 1.2.3.4 的所有访问。

1sudo iptables -A INPUT -s 1.2.3.4 -j DROP

6. 配置端口转发 (DNAT)

假设服务器有一个内部 Web 服务器 IP 地址为 192.168.1.10,需要将外部访问服务器的 8080 端口流量转发到内部服务器的 80 端口。 首先,需要启用 IP 转发功能。编辑 /etc/sysctl.conf 文件,将 net.ipv4.ip_forward 设置为 1,然后执行 sudo sysctl -p 使配置生效。

1# 在 nat 表的 PREROUTING 链中添加 DNAT 规则
2sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.10:80
3# 在 filter 表的 FORWARD 链中允许转发的流量
4sudo iptables -A FORWARD -p tcp -d 192.168.1.10 --dport 80 -j ACCEPT

注意: 转发规则需要与 filter 表中的 FORWARD 链规则配合使用。

7. 配置 SNAT/MASQUERADE

当内部网络的主机需要访问外部网络时,需要将它们的私有 IP 地址转换为服务器的公有 IP 地址。 如果服务器的公网 IP 是固定的,可以使用 SNAT:

1# 假设服务器的公网 IP 是 203.0.113.1
2sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.1

如果服务器的公网 IP 是动态的(通过 DHCP 获取),可以使用 MASQUERADE:

1sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

其中 eth0 是服务器连接外部网络的网络接口。

8. 状态跟踪 (Stateful Firewall)

iptables 支持状态跟踪,可以根据连接状态来判断是否允许流量。这比简单的端口过滤更安全。

1# 允许与已建立或相关的连接相关的流量
2sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
3# 默认拒绝所有 NEW 的连接(除了之前允许的)
4sudo iptables -P INPUT DROP # 假设默认策略是 DROP

这意味着,对于已经建立的连接(例如,你发起了 SSH 连接,服务器返回的回复),iptables 会自动允许。而对于新的、未知的连接,则会根据规则进行判断。

保存和加载 iptables 规则

iptables 的规则在系统重启后会丢失。为了使规则持久化,需要将它们保存到文件中,并在系统启动时加载。

  • 保存规则:

    1sudo service iptables save # Debian/Ubuntu
    2sudo /sbin/iptables-save > /etc/sysconfig/iptables # CentOS/RHEL
    
  • 加载规则:

    1sudo service iptables restart # Debian/Ubuntu
    2sudo /sbin/iptables-restore < /etc/sysconfig/iptables # CentOS/RHEL
    

    在许多现代 Linux 发行版中,可以通过 iptables-persistent 包(Debian/Ubuntu)或 firewalld 服务(CentOS/RHEL 7+)来管理规则的持久化。

总结

iptables 是 Linux 系统中强大的网络安全工具。通过理解表、链和规则的概念,并熟练运用各种匹配条件和目标,可以实现精细化的网络流量控制。对于需要高可用性和安全性的世界杯投注平台,合理配置 iptables 防火墙,能够有效抵御网络攻击,保障业务的稳定运行。在实际操作中,务必谨慎修改规则,并在测试环境中进行验证,以免造成不必要的网络中断。