Linux的iptables是Linux内核中集成的防火墙工具,它通过Netfilter框架实现数据包的过滤、网络地址转换(NAT)和端口转发等功能,作为命令行工具,iptables通过规则表(table)和链(chain)的组合来管理网络流量,其灵活性和强大的功能使其成为Linux系统安全管理的核心组件之一。

iptables的基本结构
iptables由四个表(tables)和五个链(chains)组成,每个表负责不同的功能,而链则定义了规则应用的位置。
表(Tables)
- filter表:默认表,用于数据包的过滤,是最常用的表,包含三个链:INPUT(进入本机的数据包)、OUTPUT(从本机发出的数据包)和FORWARD(转发数据包)。
- nat表:用于网络地址转换,处理数据包的源地址和目标地址修改,包含三个链:PREROUTING(路由前修改目标地址)、POSTROUTING(路由后修改源地址)和OUTPUT(修改本机发出的数据包的目标地址)。
- mangle表:用于修改数据包的QoS(服务质量)标记,如TOS(服务类型)字段,包含PREROUTING、INPUT、FORWARD、OUTPUT和POSTROUTING五个链。
- raw表:用于跟踪数据包,通常用于禁用连接跟踪,包含PREROUTING和OUTPUT两个链。
链(Chains)
链是规则的容器,数据包经过链时会按顺序匹配规则,常见的链包括:
- INPUT:处理目标为本地地址的数据包。
- OUTPUT:处理由本地进程产生的数据包。
- FORWARD:处理经过本机但不进入本机的数据包。
- PREROUTING:在路由决策前修改数据包。
- POSTROUTING:在路由决策后修改数据包。
iptables命令的基本语法
iptables命令的基本语法如下:
iptables [-t table] [command] [chain] [rule-specification] [options]
-t table:指定表名,默认为filter。command:操作命令,如-A(追加规则)、-D(删除规则)、-I(插入规则)、-L(列出规则)、-F(清空规则)等。chain:指定链名。rule-specification:规则匹配条件和动作。options:其他选项,如-p(协议)、-s(源地址)、-d(目标地址)、–sport(源端口)、–dport(目标端口)等。
常用命令和示例
查看规则
iptables -L -n -v
-L:列出所有规则。-n:以数字形式显示地址和端口,避免DNS解析。-v:显示详细信息,如数据包和字节数。
添加规则
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
-A INPUT:在INPUT链末尾添加规则。-p tcp:匹配TCP协议。--dport 22:匹配目标端口为22(SSH)。-j ACCEPT:动作是允许数据包通过。
插入规则
iptables -I INPUT 1 -p tcp --dport 80 -j DROP
-I INPUT 1:在INPUT链的开头插入规则。
删除规则
iptables -D INPUT -p tcp --dport 22 -j ACCEPT
-D:删除匹配的规则。
设置默认策略
iptables -P INPUT DROP
-P:设置默认策略,DROP表示拒绝所有数据包。
端口转发(NAT示例)
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80
- 将8080端口的流量转发到80端口。
规则匹配条件
iptables支持丰富的匹配条件,以下是常见条件的说明:

| 匹配条件 | 说明 | 示例 |
|---|---|---|
-p | 匹配协议 | -p tcp |
-s | 匹配源地址 | -s 192.168.1.0/24 |
-d | 匹配目标地址 | -d 10.0.0.1 |
--sport | 匹配源端口 | --sport 1024:65535 |
--dport | 匹配目标端口 | --dport 22 |
-i | 匹配入站接口 | -i eth0 |
-o | 匹配出站接口 | -o eth1 |
-m | 扩展匹配模块 | -m state --state ESTABLISHED |
动作(Target)
规则匹配后的动作,常见动作包括:
- ACCEPT:允许数据包通过。
- DROP:丢弃数据包,不返回任何响应。
- REJECT:丢弃数据包并返回错误信息。
- LOG:记录日志。
- MASQUERADE:源地址伪装(NAT)。
- REDIRECT:端口重定向。
高级功能
连接状态匹配
使用state模块可以匹配连接状态:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
ESTABLISHED:已建立的连接。RELATED:相关联的连接(如FTP数据连接)。
限制连接频率
iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 5 -j DROP
- 限制SSH连接数超过5个时拒绝。
时间匹配
iptables -A INPUT -p tcp --dport 80 -m time --timestart 09:00 --timestop 18:00 -j ACCEPT
- 仅允许工作日的9:00-18:00访问80端口。
规则保存与恢复
不同Linux发行版的保存方式不同:
- CentOS/RHEL:
service iptables save
- Ubuntu/Debian:
iptables-save > /etc/iptables/rules.v4 iptables-restore < /etc/iptables/rules.v4
相关问答FAQs
问题1:如何允许特定IP访问本机的SSH端口?
解答:可以使用以下命令允许特定IP(如192.168.1.100)访问SSH端口(22),并拒绝其他IP:

iptables -A INPUT -p tcp -s 192.168.1.100 --dport 22 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j DROP
问题2:如何配置iptables实现端口转发,将本机的8080端口映射到80端口?
解答:使用nat表和PREROUTING链实现端口转发:
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80
需要确保内核开启了IP转发:
echo 1 > /proc/sys/net/ipv4/ip_forward
文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/459627.html<
