在Linux系统中,iptables是最为常见和强大的防火墙工具之一。它允许系统管理员配置内核级别的IP包过滤规则,从而控制网络流量的进出。本文将深入浅出地介绍iptables的基础概念、核心组件以及一些常见的实战应用,帮助您构建更安全的网络环境。
iptables 的核心概念
iptables的工作模型是基于“链”(Chain)和“表”(Table)的。
表(Table):
iptables支持多种表,每种表处理不同类型的网络包。最常用的有:filter表:这是默认的表,用于对网络包进行过滤(允许或拒绝)。它包含了三个内置链:INPUT、OUTPUT、FORWARD。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)。
实战应用示例
查看所有规则:
1iptables -L -v -n-v显示详细信息(如字节数、包数),-n以数字形式显示IP和端口,避免DNS解析。清空所有规则并设置默认策略:
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),否则您将无法远程登录。允许SSH连接:
1iptables -A INPUT -p tcp --dport 22 -j ACCEPT允许HTTP和HTTPS访问:
1iptables -A INPUT -p tcp --dport 80 -j ACCEPT 2iptables -A INPUT -p tcp --dport 443 -j ACCEPT允许所有已建立和相关的连接: 这通常放在规则的靠前位置,以提高效率,确保响应式通信不受影响。
1iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT端口转发(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 ACCEPTIP伪装(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 # 允许外网返回的流量进入内网阻止特定IP访问:
1iptables -A INPUT -s 1.2.3.4 -j DROP
保存和恢复iptables规则
iptables规则在系统重启后会丢失。您可以使用iptables-save和iptables-restore命令来保存和加载规则。
- 保存规则:
iptables-save > /etc/sysconfig/iptables - 加载规则:
iptables-restore < /etc/sysconfig/iptables
许多Linux发行版提供了iptables-services包,可以配置服务在系统启动时自动加载规则。
iptables是一个功能强大但同时也相对复杂的工具。掌握其核心概念和常用命令,对于保障Linux服务器的网络安全至关重要。世界杯买球网中文站持续为您带来实用技术内容,助您在技术道路上不断前行。