iptables 防火墙规则详解与实践
10 minute read

在Linux服务器管理中,iptables是一款强大且灵活的防火墙工具,它允许管理员定义和管理网络数据包的过滤、NAT(网络地址转换)以及其他数据包处理规则。掌握iptables的使用,对于保障服务器的网络安全至关重要。本文将详细介绍iptables的核心概念、常用命令以及一些实际应用场景。

核心概念

iptables的工作原理是基于“链”(Chains)和“表”(Tables)。

  • 表(Tables)iptables有几个主要的表,用于处理不同类型的数据包:

    • filter表:这是默认的表,用于过滤数据包(允许或拒绝)。它包含INPUTOUTPUTFORWARD三个链。
    • nat表:用于网络地址转换,例如将私有IP地址转换为公有IP地址(SNAT)或反之(DNAT)。
    • mangle表:用于修改数据包的IP头信息,例如TTL(Time To Live)、TOS(Type Of Service)等。
    • raw表:用于 exempt(豁免)数据包,使其不再被其他表处理。
  • 链(Chains):每个表都包含一些预定义的链,它们代表了数据包在经过防火墙时所遵循的处理路径:

    • INPUT链:处理进入本地服务器的数据包。
    • OUTPUT链:处理从本地服务器发出的数据包。
    • FORWARD链:处理在本地服务器上转发(即不属于本地服务器)的数据包。
    • PREROUTING链:在数据包进入路由判断之前进行处理(常用于DNAT)。
    • POSTROUTING链:在数据包经过路由判断之后,准备离开本地服务器之前进行处理(常用于SNAT)。
  • 规则(Rules):链中包含一系列的规则。当一个数据包进入某个链时,iptables会按照规则的顺序进行匹配。一旦找到匹配的规则,就会执行该规则指定的“目标”(Target)。

  • 目标(Targets):规则执行的目标决定了对数据包的处理方式:

    • ACCEPT:允许数据包通过。
    • DROP:静默丢弃数据包,不给发送方任何回应。
    • REJECT:丢弃数据包,并给发送方发送一个错误消息(如ICMP “port unreachable”)。
    • SNAT:源地址转换。
    • DNAT:目标地址转换。
    • MASQUERADE:一种特殊的SNAT,适用于IP地址动态分配的接口。

常用命令

iptables命令的基本格式是: iptables [-t table] -<command> <chain> [options] [-j target]

  • 查看规则

    • iptables -L:列出filter表中所有链的规则。
    • iptables -L -v:详细列出规则,包括匹配的数据包数量和字节数。
    • iptables -t nat -L:列出nat表中所有链的规则。
  • 添加规则

    • iptables -A <chain> -p <protocol> --dport <port> -j ACCEPT:在指定链的末尾添加规则,允许指定协议和端口的流量通过。
      • -A:Append(追加)。
      • -p:Protocol(协议),如tcp, udp, icmp。
      • --dport:Destination Port(目标端口)。
      • --sport:Source Port(源端口)。
      • -s:Source IP address(源IP地址)。
      • -d:Destination IP address(目标IP地址)。
  • 插入规则

    • iptables -I <chain> <rule_number> -p <protocol> --dport <port> -j ACCEPT:在指定链的指定位置插入规则。
      • -I:Insert(插入)。
      • <rule_number>:规则的序号,从1开始。
  • 删除规则

    • iptables -D <chain> <rule_number>:删除指定链中的指定序号的规则。
    • iptables -D <chain> -p <protocol> --dport <port> -j ACCEPT:删除匹配指定条件的规则。
  • 清空规则

    • iptables -F:清空filter表所有链中的所有规则。
    • iptables -t nat -F:清空nat表所有链中的所有规则。
  • 设置默认策略

    • iptables -P <chain> <target>:设置链的默认策略(如DROP或ACCEPT)。
      • iptables -P INPUT DROP:将INPUT链的默认策略设为DROP,即默认拒绝所有进入的流量。

实际应用场景

  1. 禁止Ping(ICMP)

    1iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
    
  2. 允许SSH访问(TCP 22端口)

    1iptables -A INPUT -p tcp --dport 22 -j ACCEPT
    
  3. 允许HTTP/HTTPS访问(TCP 80/443端口)

    1iptables -A INPUT -p tcp --dport 80 -j ACCEPT
    2iptables -A INPUT -p tcp --dport 443 -j ACCEPT
    
  4. 配置NAT(内网穿透): 假设服务器有一个公网IP(eth0)和一个内网IP(eth1),需要将内网IP(如192.168.1.100)的流量通过公网IP访问外部。

    1# 允许转发
    2echo 1 > /proc/sys/net/ipv4/ip_forward
    3# 配置SNAT
    4iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    5# 允许内网访问外网
    6iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
    7# 允许外网响应到内网
    8iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
    
  5. 限制访问频率(SYN Flood保护)

    1iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
    2iptables -A INPUT -p tcp --syn -j DROP
    

保存和加载规则

iptables规则在系统重启后会丢失。为了持久化规则,可以使用以下方法:

  • iptables-save和iptables-restore

    • iptables-save > /etc/sysconfig/iptables:保存当前规则到文件。
    • iptables-restore < /etc/sysconfig/iptables:加载规则。
    • 许多Linux发行版(如CentOS/RHEL)在安装iptables-services包后,会提供service iptables saveservice iptables restore命令,并在系统启动时自动加载。
  • firewalld:在较新的Linux发行版中,firewalld是更常用的动态防火墙管理工具。但了解iptables的底层机制依然很有价值。

总结

iptables是一个强大的网络安全工具,通过理解其链、表、规则和目标的概念,并熟练运用相关命令,可以有效地保护Linux服务器免受未经授权的访问和网络攻击。在配置防火墙规则时,务必谨慎操作,并充分测试,以免意外阻止合法流量。