Akemi

Linux软件防火墙-iptables(新)

2026/02/11

iptables防火墙语法


用以对功能进行分组,最常用的有:

  • filter表 默认表,负责过滤数据包(常用
  • nat表 负责网络地址转换
  • mangle表 用以修改数据包头(不常用
  • raw表 决定是否对数据包进行状态跟踪(不常用
  • security表 最不常用的表,与selinux相关,用于MAC(强制访问控制)网络规则

这几张表的处理顺序是:
raw→mangle→nat→filter→security

规则的有序集合,数据包在经过netfilter时,会进入对应的链进行检查

  • input 处理入栈请求的包
  • output 处理出栈包
  • forward 处理转发数据包,实现不同网段间通信
  • preorouting 在包做路由选择之前应用的规则
  • postrouting 在包做路由选择之后应用的规则

iptables语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
iptables [-t 表名] 命令选项 [链名] [匹配条件] [-j 动作]
1.表名-t
指定要操作的表filter nat mangle raw,默认为filter

2.命令选项
对链或规则如何操作添加、删除、查看

3.链名
指定要操作的链,如INPUT、OUTPUT、FORWARD

4.匹配条件
定义数据包特征,如IP 端口 协议等

5.动作-j
匹配后对数据包的处理,如允许 拒绝 记录日志

# 链命令参数
-N 链名 创建自定义链,用于复杂组织的规则(不常用
-X 链名 删除自定义链(需要先清空链中规则)(不常用
-L 链名 列出链中所有规则
-F 链名 清空链中的所有规则
-Z 链名 重置链的计数器

-A 链名 向链的末尾添加一条规则
-I 链名 [序号] 向链的开头或指定序号插入一条规则(序号默认为1
-D 链名 [序号] 从链中删除一条规则(按序号或完整规则内容
-P 链名 [动作] 设置链的默认策略(ACCEPT/DROP),对未匹配规则的数据包生效

1.链管理
(1)查看规则
iptables -L [chain]
iptables -L -n --line-numbers -vx # 详细规则,--line-numbers展示序号,-vx显示统计信息

(2)清空规则
iptables -F [chain] # 清空链的所有规则
iptables -F -t nat # 清空指定的表

(3)链操作
iptables -N custom_chain
iptables -X custom_chain
iptables -E old_name new_name

(4)默认策略设置
iptables -P INPUT DROP

(5)清空计数器
iptables -Z [chain]

2.规则管理
(1)添加规则
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
ipbtales -I INPUT 1 -p tcp --dport 80 -j ACCEPT # 插入到指定位置
iptables -I INPUT -p tcp --dport 443 -j ACCEPT # 插入到开头

(2)删除规则
iptables -D INPUT 2 # 按照编号删除
iptables -D INPUT -p tcp --dport 80 -j ACCEPT # 完整内容删除

(3)替换规则(不常用
iptables -R INPUT 2 -p tcp --dport 443 -j ACCEPT

# 规则匹配条件参数
-p 协议-p tcp -p udp -p icmp -p all
-s 源地址 -s 10.0.0.1 -s 192.168.1.0/24
-d 目标地址 -d 8.8.8.8 -d 192.168.10.0/24
-i 入栈接口 -i eth0
-o 出栈接口 -o eth1
--dport 目标端口(范围) --dport 22
--sport 源端口(范围) --sport 1024:65535

# 扩展匹配-m, -m参数可以加载对于的模块
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --sport 1024:65535 -j ACCEPT
iptables -A INPUT -p tcp --tcp-flags SYN,ACK SYN -j DROP # 丢弃SYN的tcp包
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP # 丢弃非SYN的新连接

iptables -A INPUT -p udp --dport 53 -j ACCEPT # DNS
iptables -A INPUT -p udp --dport 67:68 -j ACCEPT # DHCP

iptables -A INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --sports 22,23,25 -j ACCEPT

3.状态匹配(最常用
# 如果有已经建立连接或相关的连接,就允许
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 丢弃所有状态为 INVALID(无效)的入站数据包
iptables -A INPUT -m state --state INVALID -j DROP

4.限制匹配
(1)限制连接速率
iptables -A INPUT -p tcp --dport 80 -m limit 25/minute --limit-brust 100 -j ACCEPT # 一分钟只允许连接25次,单个IP限制并发100
iptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT # 限制ICMP的入站流量,平均每秒不超过1个包,并发最多允许10个包

(2)限制连接数
iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP # 禁止单个IP对本机22端口并发连接数超过3个
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j DROP # 禁止同一网段/24内所有IP对本机80端口总并发连接数超越20个

(3)限制同一IP新建连接数
iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT

6.IP范围和时间匹配
(1)IP范围
iptables -A INPUT -m iprange --src-range 192.168.10.1-192.168.10.128 -j DROP
iptables -A INPUT -m iprange --dst-range 10.0.0.1-10.0.0.10 -j DROP

(2)时间控制
iptables -A INPUT -p tcp --dport 22 -m time --timestart 09:00 --timestop 18:00 --weekdays Mon,Tue,Web,Thu,Fri -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -m time --timestart 08:00 --timestop 20:00 -j ACCEPT

7.字符串和长度匹配
(1)字符串匹配
iptables -A FORWARD -m string --string "malware.com" --algo bm -j DROP
ipatbles -A FORWARD -m string --string "cmd.exe" --algo bm -j DROP

(2)包长度匹配
iptables -A INPUT -p tcp --dport 80 -m length --length 0:100 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -m length --length 1000: -j LOG

8.MAC地址匹配
(1)MAC地址过滤
iptables -A INPUT -m mac --mac-source 00:1A:2B:3C:4D:5E -j ACCEPT
iptables -A INPUT -m mac --mac-source 00:1A:2B:3C:4D:5E -j DROP

动作类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
1.终止类动作(终止规则匹配,立即决定数据包
ACCEPT: 允许数据包通过,继续后续处理
DROP: 丢弃数据包,不返回任何响应
REJECT: 拒绝数据包

2.跳转类动作(跳转到其他链继续处理,常用于自定义链
RETURN: 当数据包进入自定义链后,若匹配到某条RETURN的规则,会停止匹配,回到调用它的默认链,比如INPUT、OUPUT

3.记录类动作(记录日志,继续匹配后续规则
LOG 记录数据包到内核日志,比如调试或监控被拒绝的流量(--log-prefix "DROP:"

4.网络地址转换
SNAT: 修改数据包的源IP地址,使数据包从内网发送到公网时,源地址被替换为网关的公网IP,从而实现内网设备通过共享IP访问外部网络
DNAT: 修改数据包的目标IP地址,使外部发送到公网IP的流量被转发到内网的指定设备(端口映射)
MASQUERADE: 动态源地址转换啊啊
REDIRECT: 数据包重定向到本地端口

5.标记类动作
MARK: 数据包标记,用于后续操作
CONNMARK: 连接标记,使用mangle表操作
TOS: 服务类型标记,使用mangle表操作

6.特殊处理动作
NOTRACK: 连接跟踪豁免
TTL: 生存时间修改

iptables日志参数

1
2
3
4
--log-prefix <前缀> 日志前缀,用以在日志中识别
--log-level <级别> 日志级别0~7 7为debug 4为warning
--log-ip-options 记录IP头部的选项
--log-tcp-flags 记录TCP的标志位

iptables持久化

在linux中,iptables规则默认会在重启后丢失

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# ubuntu
iptables -A INPUT -p tcp --dport 80 -j REJECT
apt -y install iptables-persistent
netfilter-persistent save # 保存规则到/etc/iptables/rules.v4
systemctl enable netfilter-persistent --now

# rhel
iptables -A INPUT -p tcp --dport 80 -j REJECT
iptables-save > /etc/sysconfig/iptables
yum -y install iptables-services
systemctl disable firewalld --now
systemctl enable iptables --now

# 手动保存文件
iptables-save > /etc/iptables/rules.v4
# 手动恢复文件
iptables-restore < /etc/iptables/rules.v4

iptables最佳实践-filter表

filter表-INPUT链操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 基础配置
默认策略设为,对INPUT和FORWARD链默认拒绝所有流量,仅开放明确需要的服务
1.入栈和转发默认策略
iptables -P INPUT DROP
iptables -p FORWARD DROP

2.出栈策略
iptables -P OUTPUT ACCEPT

先具体后通用,filter表按照规则顺序匹配,优先放置具体规则,再放置通用规则

# 核心规则配置
1.允许回环接口
iptables -A INPUT -i lo -j ACCEPT

2.允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
比如,当从本机访问一个网站时,发起了一个请求,那网站返回的数据包就是established状态,如果没有这条规则,对方返回的数据包就会被防火墙默认阻止,导致通信失败

# 允许关键服务的入栈访问
1.允许访问http和https
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

2.允许192.168.10.0/24内网访问ssh
iptables -A INPUT -p tcp -s 192.168.10.0/24 --dport 22 -j ACCEPT

3.允许特定IP访问数据库端口
iptables -A INPUT -p tcp -s 10.0.0.10 --dport 3306 -j ACCEPT

4.限制ICMP流量
默认禁止外部ping主机,或限制频率防止ICMP洪水攻击
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 10/min -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

echo "net.ipv4.icmp_echo_ignore_add = 1" >> /etc/sysctl.d/99-icmp.conf

filter表-OUTPUT链操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 核心配置规则
建议从"默认允许"逐步收紧为"默认拒绝 + 明确允许"

1.基础场景,默认允许
(1)允许dns解析
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

(2)允许https(更新软件、api调用
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT

(3)允许对已建立的连接的响应
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

(4)收紧策略
iptables -P OUTPUT DROP

2.严格场景,默认拒绝
iptables -P OUTPUT DROP
(1)允许回环接口
iptables -A OUTPUT -o lo -j ACCEPT

(2)允许已建立的连接
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

(3)允许访问特定外部服务(ntp
iptables -A OUTPUT -p udp --dport 123 -j ACCEPT

(4)允许ssh其他机器
iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT

filter表-FORWARD链操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
仅当本机作为路由器/网关时(3层设备)需要配置,控制不同网络间的流量转发

linux内核默认不允许流量转发,如果要开启流量转发功能,需要配置对应的内核参数:
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.d/99-forward.conf
echo "net.ipv6.conf.all.forward = 1" >> /etc/sysctl.d/99-forward.conf
sysctl -p

示例: 允许内网192.168.1.0/24通过本机转发到公网
1.默认拒绝所有转发流量
iptables -P FORWARD DROP

2.允许内网到公网的转发
iptables -A FORWARD -i eth1 -o eth0 -s 192.168.1.0/24 -j ACCEPT

3.允许公网对上述连接的响应转发回内网
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

4.允许外网IP 203.0.113.10 访问内网服务器192.168.1.10
iptables -A FORWARD -s 203.0.113.10 -d 192.168.1.10 -p tcp --dport 22 -j ACCEPT

iptables NAT表最佳实践

nat表包含四条链:PREROUTING、INPUT、OUTPUT、POSTROUTING

POSTROUTING链操作-SNAT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
POSTROUTING链
1.基本SNAT用法
# 固定公网IP
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.1
# 多个公网IP
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.1-203.0.113.30
# 端口范围
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.1-203.0.113.30:10000-30000

2.MASQUERADE(动态公网IP)
# 动态IP或DHCP环境
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
# 限制端口范围
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE --to-ports 1024-65535

PREROUTING链操作-DNAT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 将外部访问公网IP的流量转发到后端的服务器
iptables -t nat -A PREROUTING -d 203.0.133.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80

iptables -t nat -A PREROUTING -d 203.0.133.1 -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.10:80

# 范围端口转发
iptables -t nat -A PREROUTING -d 203.0.133.1 -p tcp --dport 8080-8090 -j DNAT --to-destination 192.168.1.10:8000-8010

# udp转发
iptables -t nat -A PREROUTING -d 203.0.133.1 -p udp --dport 53 -j DNAT --to-destination 192.168.1.53:53

# 多个后端服务器负载均衡(50%概率生效,分摊到10和11
iptables -t nat -A PREROUTING -d 203.0.133.1 -p tcp --dport 80 -m statistic --mode random --probability 0.5 -j DNAT --to-destination 192.168.1.10:80
iptables -t nat -A PREROUTING -d 203.0.133.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.11:80

OUTPUT链操作

用以处理本地产生的数据包

本地进程→OUTPUT链→路由决策→POSTROUTING链→网卡

1
2
3
4
5
6
7
8
9
10
# 传统会在POSTROUTING链中操作
处理所有流经与产生的流量
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.50

# OUTPUT链使用SNAT
(1)不同服务使用不同出口IP(不常用
iptables -t nat -A OUTPUT -m owner --uid-owner nginx -o eth0 -j SNAT --to-source 203.0.113.1
iptables -t nat -A OUTPUT -m owner --uid-owner mysql -o eth0 -j SNAT --to-source 203.0.113.2
iptables -t nat -A OUTPUT -m owner --uid-owner redis -o eth0 -j SNAT --to-source 203.0.113.3

raw、mangle、security表介绍

这三个表都是很少用的表

raw表介绍

raw表是一个特殊表,主要用于连接跟踪conntrack的控制。它的主要特点是与conntrack紧密相关

在数据包进入conntrack之前,对数据包进行的处理,在整个iptables处理流程中,处于最优先的位置,其核心特性是绕过内核的链接跟踪机制,因此在需要高性能、低延迟的场景中被广泛使用

注:一旦设置了NOTRACK,就无法使用-m state或-m conntrack来匹配包,只能使用基于端口和ip的过滤规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 假设有一台高流量的dns服务器,为了避免conntrack成为瓶颈,可以忽略对udp 53端口的跟踪
iptables -t raw -A PREROUTING -p -udp --dport 53 -j NOTRACK
iptables -t raw -A OUTPUT -p udp --sport 53 -j NETRACK

(1)性能优化
conntrack需要消耗CPU和内存来维护连接状态表
对于非常高流量的服务器,大量连接可能会导致conntrack表被填满,引发性能问题甚至丢包
(2)避免干扰
某些特殊协议或应用可能不希望被NAT或状态检测干扰,跳过跟踪可以确保这些数据包被原样转发
(3)处理异常
在复杂网络环境下,conntrack可能会错误标记连接状态,导致数据包被错误丢弃

# 忽略来自特定IP的流量
iptables -t raw -A PREROUTING -s 192.168.1.100 -j NOTRACK

# 查看raw规则
iptables -t raw -L -n -vx

mangle表介绍

mangle的核心作用是修改数据包的IP头和数据包的一些标志位

可以利用这种标志位对数据包进行过滤或策略路由

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
mangle拥有五个内置链,覆盖了数据包处理的所有阶段(可以在任何阶段改数据包
一般会在PREROUTING改

数据包标记(MARK/CONNMARK)是mangle表最常用的功能,给数据包或连接打标签,然后在其他表中基于这个标签进行不同处理

用法:
MARK: 标记单个数据包 -j MARK --set-mark <value>
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 1

1.策略路由
基于标记,使用ip rule命令将数据包路由到不同的路由表
(1)mangle标记数据包
iptables -t mangle -A PREROUTING -s 192.168.1.100 -j MARK --set-mark 100
(2)对标记100的数据包使用路由表100
ip rule add fwmark 100 table 100
在路由表100中添加默认路由
ip route add default via 192.168.100.100 table 100

2.修改服务类型 TOS
(1)修改ip头重的TOS字段,影响数据包在网络中被处理的优先级
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j TOS --set-tos 0x10

(2)使用tc工具根据标记来分配带宽
iptables -t mangle -A PREROUTING -p udp --dport 5060 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 2

3.使用CONNMARK标记整个FTP连接
(1)标记FTP控制连接
iptables -t mangle -A PREROUTING -p tcp --dport 21 -j CONNMARK --set-mark 1
iptables -t mangle -A PREROUTING -p connmark --mark 1 -j CONNMARK --restore-mark

4.修改TTL来隐藏系统
(1)将所有发出包的TTL统一设置为64
iptables -t mangle -A OUTPUT -j TTL --ttl-set 64

security表

Security表是selinux与网络过滤框架的一部分,用于事实基于安全上下文的强制访问控制

selinux不仅控制文件访问,也可以控制网络访问,比如可以规定httpd_t进程只能连接到http_port_t端口

security表就是selinux在网络数据包过滤层面实现其安全策略的钩子点,其核心作用就是:在数据包经过网络栈时,根据相关的安全上下文来允许或拒绝数据包,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
应用场景:
1.精细化进程网络控制
场景:即使一个进程以root运行,selinux也可以阻止它绑定到任意端口,比如默认情况下apache httpd_t只能绑定到被标记为http_port_t的端口80 443 8080

当apache尝试发送一个数据包OUTPUT,security表会检查进程安全上下文,是否被允许连接到目标端口上下文

2.保护系统服务
阻止非特权用户连接到mysql数据库端口
即使攻击者绕过了filter表的防火墙规则,仍然需要通过selinux在security表上实施的上下文检查

# 使用场景
很少需要手动调整selinux安全上下文的规则,通常由selinux自动管理
iptables对手动修改security表的规则支持不佳,推荐使用nftables
1.selinux网络控制规则
(1)为ssh连接设置安全上下文
iptables -t security -A INPUT -p tcp --dport 22 -j SECMARK --selctx system_u:object_r:ssh_server_packet_t:s0
(2)为http连接设置安全上下文
iptables -t security -A INPUT -p tcp --dport 80 -j SECMARK --selctx system_u:object_r:http_server_packet_t:s0
(3)为https连接设置安全上下文
iptables -t security -A INPUT -p tcp --dport 443 -j SECMARK --selctx system_u:object_r:https_server_packet_t:s0

2.查看selinux审计日志
cat /var/log/audit/audit.log
# 网络相关拒绝信息
ausearch -m avc -ts recent
CATALOG
  1. 1. iptables防火墙语法
    1. 1.1. iptables语法
    2. 1.2. iptables持久化
  2. 2. iptables最佳实践-filter表
    1. 2.1. filter表-INPUT链操作
    2. 2.2. filter表-OUTPUT链操作
    3. 2.3. filter表-FORWARD链操作
  3. 3. iptables NAT表最佳实践
    1. 3.1. POSTROUTING链操作-SNAT
    2. 3.2. PREROUTING链操作-DNAT
    3. 3.3. OUTPUT链操作
  4. 4. raw、mangle、security表介绍
    1. 4.1. raw表介绍
    2. 4.2. mangle表介绍
    3. 4.3. security表