Linux iptables 防火墙基础与实战
10 minute read

在Linux系统中,iptables是最为常见和强大的防火墙工具之一。它允许系统管理员配置内核级别的IP包过滤规则,从而控制网络流量的进出。本文将深入浅出地介绍iptables的基础概念、核心组件以及一些常见的实战应用,帮助您构建更安全的网络环境。

iptables 的核心概念

iptables的工作模型是基于“链”(Chain)和“表”(Table)的。

  • 表(Table): iptables支持多种表,每种表处理不同类型的网络包。最常用的有:

    • filter 表:这是默认的表,用于对网络包进行过滤(允许或拒绝)。它包含了三个内置链:INPUTOUTPUTFORWARD
    • nat 表:用于网络地址转换(NAT),例如将私有IP地址转换为公有IP地址,或者实现端口转发。
    • mangle 表:用于修改网络包的TOS(Type Of Service)、TTL(Time To Live)等IP头部信息。
    • raw 表:用于处理一些特殊的连接追踪(conntrack)选项。
  • 链(Chain): 链是网络包在流经某个表时所遵循的规则序列。当一个网络包到达一个链时,iptables会按照链中规则的顺序进行匹配。

    • INPUT 链:处理进入本机的数据包。
    • OUTPUT 链:处理本机发出的数据包。
    • FORWARD 链:处理经过本机(但不源于或目的于本机)的数据包,常用于路由器。
    • PREROUTING 链(nat表和mangle表):在进行任何路由判断之前处理到达的数据包。
    • POSTROUTING 链(nat表和mangle表):在进行路由判断后,在数据包离开本机之前处理。
  • 规则(Rule): 每条规则定义了匹配条件(如源IP、目的IP、协议、端口等)和一个目标动作(Target)。

  • 目标动作(Target): 当一个数据包匹配了某条规则时,iptables会执行该规则指定的目标动作。常见的目标动作包括:

    • ACCEPT:允许数据包通过。
    • DROP:静默丢弃数据包,对方不会收到任何反馈。
    • REJECT:丢弃数据包,并向发送方发送一个错误消息(如ICMP port-unreachable)。
    • SNAT (Source NAT):修改数据包的源IP地址。
    • DNAT (Destination NAT):修改数据包的目的IP地址。
    • MASQUERADE:一种特殊的SNAT,适用于动态IP地址。

iptables 命令详解

iptables命令的基本语法是: iptables [-t table] -<command> <chain> <rule_specification> -j <target>

常用命令选项:

  • -A (Append):在链的末尾添加一条新规则。
  • -I (Insert):在链的开头(或指定位置)插入一条新规则。
  • -D (Delete):删除链中的一条规则(可以通过规则号或完整规则内容删除)。
  • -R (Replace):替换链中的一条规则。
  • -L (List):列出链中的所有规则。
  • -F (Flush):清空链中的所有规则。
  • -N (New-Chain):创建一条新的自定义链。
  • -X (Delete-Chain):删除一条自定义链。
  • -P (Policy):设置链的默认策略(Policy)。

常用规则匹配条件:

  • -s--source:匹配源IP地址或IP范围。
  • -d--destination:匹配目的IP地址或IP范围。
  • -p--protocol:匹配协议(如tcp, udp, icmp)。
  • --dport:匹配TCP/UDP的目标端口。
  • --sport:匹配TCP/UDP的源端口。
  • -i--in-interface:匹配入站网络接口。
  • -o--out-interface:匹配出站网络接口。
  • -m state --state <state>:根据连接追踪状态匹配(如NEW, ESTABLISHED, RELATED, INVALID)。

实战应用示例

  1. 查看所有规则:

    1iptables -L -v -n
    

    -v 显示详细信息(如字节数、包数),-n 以数字形式显示IP和端口,避免DNS解析。

  2. 清空所有规则并设置默认策略:

    1iptables -F  # 清空filter表的所有规则
    2iptables -X  # 删除所有自定义链
    3iptables -t nat -F # 清空nat表的所有规则
    4iptables -t nat -X # 删除nat表的所有自定义链
    5iptables -P INPUT DROP # 默认丢弃所有进入的数据包
    6iptables -P FORWARD DROP # 默认丢弃所有转发的数据包
    7iptables -P OUTPUT ACCEPT # 默认允许所有发出的数据包
    

    重要提示: 在远程服务器上执行iptables -P INPUT DROP时,务必先允许SSH端口(通常是22),否则您将无法远程登录。

  3. 允许SSH连接:

    1iptables -A INPUT -p tcp --dport 22 -j ACCEPT
    
  4. 允许HTTP和HTTPS访问:

    1iptables -A INPUT -p tcp --dport 80 -j ACCEPT
    2iptables -A INPUT -p tcp --dport 443 -j ACCEPT
    
  5. 允许所有已建立和相关的连接: 这通常放在规则的靠前位置,以提高效率,确保响应式通信不受影响。

    1iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    
  6. 端口转发(DNAT): 将外部8080端口的流量转发到内部服务器的80端口。

    1# 确保nat表配置正确
    2iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
    3# 允许转发的流量通过
    4iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 80 -j ACCEPT
    
  7. IP伪装(MASQUERADE): 允许局域网内的机器通过服务器访问互联网。

    1# 假设内网IP段是192.168.1.0/24,外网接口是eth0
    2iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
    3# 允许转发
    4echo 1 > /proc/sys/net/ipv4/ip_forward # 开启IP转发
    5iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT # 允许从内网接口进入的流量转发到外网接口
    6iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT # 允许外网返回的流量进入内网
    
  8. 阻止特定IP访问:

    1iptables -A INPUT -s 1.2.3.4 -j DROP
    

保存和恢复iptables规则

iptables规则在系统重启后会丢失。您可以使用iptables-saveiptables-restore命令来保存和加载规则。

  • 保存规则:iptables-save > /etc/sysconfig/iptables
  • 加载规则:iptables-restore < /etc/sysconfig/iptables

许多Linux发行版提供了iptables-services包,可以配置服务在系统启动时自动加载规则。

iptables是一个功能强大但同时也相对复杂的工具。掌握其核心概念和常用命令,对于保障Linux服务器的网络安全至关重要。世界杯买球网中文站持续为您带来实用技术内容,助您在技术道路上不断前行。