Linux防火墙
Linux防火墙
一、iptables
1.1 概述
使用man命令查看帮助:

这些工具在 Red Hat Enterprise Linux 中已被弃用。它们仅处于维护状态,不会接收新功能。新的配置应使用 nft(8) 工具。现有配置应尽可能迁移到 nft(8)。详情请参阅:https://red.ht/nft_your_tables。此外,还有 iptables-translate(8) 和 ip6tables-translate(8) 工具可协助完成迁移。
iptables 和 ip6tables 被用于设置、维护和检查 Linux 内核中 IPv4 和 IPv6 数据包过滤规则的表。可以定义多个不同的表。每个表包含许多内置链,也可以包含用户定义的链。
每条链是一组可以匹配一组数据包的规则。每条规则指定如何处理匹配的数据包。这称为“目标”(target),目标可以是跳转到同一表中的用户定义链。
TARGETS(动作):

防火墙规则指定了数据包的匹配条件和目标。如果数据包不符合条件,则会检查链中的下一条规则;如果符合条件,则根据目标的值决定下一步处理。目标可以是用户定义链的名称,也可以是 iptables-extensions(8) 中描述的目标之一,或者是特殊值 ACCEPT、DROP 或 RETURN。
- ACCEPT:允许数据包通过。
- DROP:丢弃数据包。
- RETURN:停止遍历当前链,并恢复到上一个(调用)链中的下一条规则。
如果到达内置链的末尾,或者在内置链中匹配了目标为 RETURN 的规则,链策略指定的目标将决定数据包的命运。
TABLES(表):

目前有五个独立的表(任何时候存在哪些表取决于内核配置选项和当前加载的模块)。
-t, --table 表 此选项指定命令应操作的数据包匹配表。如果内核配置了自动模块加载功能,将尝试为该表加载适当的模块(如果尚未加载)。
这些表包括:
filter 表 这是默认表(如果未传递 -t 选项)。它包含以下内置链:
- INPUT:用于处理发往本地套接字的数据包。
- FORWARD:用于处理通过设备路由的数据包。
- OUTPUT:用于处理本地生成的数据包。
nat 表 当遇到创建新连接的数据包时,将查询此表。它包含四个内置链:
- PREROUTING:用于在数据包进入时立即进行修改。
- INPUT:用于修改发往本地套接字的数据包。
- OUTPUT:用于在路由前修改本地生成的数据包。
- POSTROUTING:用于在数据包即将发送时修改。 自内核 3.7 起支持 IPv6 NAT。
mangle 表 用于特殊的数据包修改操作。
- 在内核 2.4.17 之前,它有两个内置链:PREROUTING 和 OUTPUT,分别在路由前对进入的数据包或本地生成的数据包进行修改。
- 自内核 2.4.18 起,还支持 INPUT(进入设备的数据包)、FORWARD(通过设备路由的数据包)和 POSTROUTING(即将发送的数据包)。
raw 表 主要用于配置不进行连接跟踪的规则(结合 NOTRACK 目标)。
- 它在 netfilter 钩子的高优先级处注册,因此优先于 ip_conntrack 或其他 IP 表。
- 提供以下内置链:PREROUTING(适用于任何网络接口到达的数据包)和 OUTPUT(适用于本地进程生成的数据包)。
security 表 用于强制访问控制(MAC)网络规则,例如由 SECMARK 和 CONNSECMARK 目标启用的规则。
- 强制访问控制由 Linux 安全模块(如 SELinux)实现。
- 它在 filter 表 之后调用,因此允许过滤表中的自由访问控制(DAC)规则优先生效。
- 提供以下内置链:INPUT(进入设备的数据包)、OUTPUT(路由前本地生成的数据包)和 FORWARD(通过设备路由的数据包)。
1.2 使用方法
iptables [-t 表名] 命令 [链名] [规则] [-j 动作]
命令概述:
| 参数/命令 | 描述 |
|---|---|
| -A, --append | 将规则追加到选定链的末尾。当源或目标解析为多个地址时,会为每种地址组合添加规则。 |
| -C, --check | 检查选定链中是否存在与规则匹配的条目。不修改配置,仅通过退出代码指示结果。 |
| -D, --delete | 删除选定链中的规则,可以指定规则编号或规则匹配。 |
| -I, --insert | 将规则插入到选定链中指定位置,默认插入到链头部。 |
| -R, --replace | 替换选定链中的规则,规则编号从1开始。源或目标解析为多个地址时命令会失败。 |
| -L, --list | 列出选定链中的所有规则,如果未指定链,则列出所有链。可结合 -Z 原子列出和清零规则。 |
| -S, --list-rules | 打印选定链中的所有规则,如果未指定链,则打印所有链规则。 |
| -F, --flush | 清空选定链中的所有规则,如果未指定链,则清空表中的所有链。 |
| -Z, --zero | 清零链或规则中的计数器,可与 -L 选项结合以清零前查看计数器。 |
| -N, --new-chain | 创建一个新的用户定义链,名称不能与现有目标冲突。 |
| -X, --delete-chain | 删除指定的链,需确保链无引用且为空。未指定链时,会删除表中所有空链。 |
| -P, --policy | 为内置链设置默认策略,目标必须为 ACCEPT 或 DROP。 |
| -E, --rename-chain | 重命名用户定义链,对表结构无影响。 |
| -h | 显示简要命令语法说明。 |
| -4, --ipv4 | 允许在一个规则文件中使用 IPv4 和 IPv6 规则;在 ip6tables-restore 中插入时会被忽略,其他情况下会报错。 |
| -6, --ipv6 | 允许在一个规则文件中使用 IPv4 和 IPv6 规则;在 iptables-restore 中插入时会被忽略,其他情况下会报错。 |
| [!] -p, --protocol | 指定规则或数据包的协议。支持 tcp, udp, icmp, esp 等协议,也可使用数字值或 /etc/protocols 中的协议名称。"!" 可反转匹配条件。 |
| [!] -s, --source | 指定源地址,可是网络名、主机名、IP 地址或 IP 地址/掩码。多个地址会展开为多条规则。"!" 反转匹配条件。 |
| [!] -d, --destination | 指定目标地址,与 -s 参数的语法类似。"!" 反转匹配条件。 |
| -m, --match | 指定匹配条件模块,用于测试特定属性,模块按命令行中给出的顺序逐个评估,短路机制加速处理。 |
| -j, --jump | 指定规则的目标动作,可以是用户定义链、内置目标(如 ACCEPT, DROP),或扩展模块的目标。 |
| -g, --goto | 指定继续处理用户定义链,RETURN 将跳回调用它的链,而非当前链继续处理。 |
| [!] -i, --in-interface | 指定入站接口名,"!" 可反转匹配条件,接口名以 "+" 结尾时匹配所有以此为前缀的接口。 |
| [!] -o, --out-interface | 指定出站接口名,其他行为与 -i 参数类似。 |
| [!] -f, --fragment | 匹配 IPv4 的非首片数据包。"!" 可匹配首片或未分片的数据包,仅支持 IPv4。 |
| -c, --set-counters | 初始化规则的计数器,适用于 INSERT, APPEND, REPLACE 操作。 |
| -v, --verbose | 输出详细信息。列出命令会显示接口名、规则选项和 TOS 掩码,计数器会显示精确或带单位的值。可以指定多次来获得更详细的调试信息。 |
| -V, --version | 显示程序版本和使用的内核 API。 |
| -w, --wait [seconds] | 等待 xtables 锁以防止程序并发运行。可以无限等待或指定秒数来获得锁。 |
| -n, --numeric | 以数字格式显示 IP 地址和端口号,而非主机名或服务名。 |
| -x, --exact | 展开计数器,显示数据包和字节的确切值,而非四舍五入的单位值(如 K, M, G)。此选项仅对 -L 命令有效。 |
| --line-numbers | 列出规则时,在每条规则前添加对应的行号,方便定位规则位置。 |
| --modprobe=command | 在添加或插入规则时,用指定命令加载必要模块(如目标模块或扩展模块)。 |
禁用自带的firewalld,改用iptables
[root@localhost ~]# systemctl disable firewalld --now #禁用firewalld
[root@localhost ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT #放行22号端口,避免远程连不上
[root@localhost ~]# iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #运行自己访问自己
[root@localhost ~]# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #允许已建立和相关的连接继续访问(不加上curl等程序不能正常访问外网)
[root@localhost ~]# iptables -A INPUT -p udp --sport 53 -j ACCEPT #放开DNS服务 否则ping等很多命令用不了
[root@localhost ~]# iptables -A INPUT -p udp --dport 53 -j ACCEPT #放开DNS服务 否则ping等很多命令用不了
[root@localhost ~]# iptables -P INPUT DROP #设置默认拒绝其它所有进站流量
[root@localhost ~]# iptables -P FORWARD DROP #禁止转发
[root@localhost ~]# iptables -P OUTPUT ACCEPT #允许它访问外网
规则保存:
默认重启之后规则会自动被清空,所以需要先保存之后开机再从文件当中加载。
[root@localhost ~]# iptables-save > /etc/iptables.rules #保存规则到文件
[root@localhost ~]# iptables-restore < /etc/iptables.rules #从文件中加载规则
1.3 链(Chain)
在 文档中未对链做好的总结,以下做总结方便理解:
五链是数据包处理的核心机制,分别对应不同的网络流量阶段。以下是每条链的用途、典型场景及配置示例:
1.3.1. INPUT 链
-
作用:处理进入本机的数据包(目标地址是本机 IP)。
-
典型场景:开放本地服务端口(如 SSH、HTTP)。
-
示例
# 允许所有本地回环流量 iptables -A INPUT -i lo -j ACCEPT # 允许已建立的连接和相关的流量 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 开放 SSH(22 端口) iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 默认拒绝其他所有入站流量(需放在最后) iptables -P INPUT DROP
1.3.2. OUTPUT 链
-
作用:处理从本机发出的数据包(源地址是本机 IP)。
-
典型场景:限制本机对外访问(如禁止访问某些网站)。
-
示例
# 允许所有本地回环流量 iptables -A OUTPUT -i lo -j ACCEPT # 允许已建立的连接和相关的流量 iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允许访问外部 HTTP/HTTPS iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT # 默认拒绝其他所有出站流量(需放在最后) iptables -P OUTPUT DROP
3. FORWARD 链
作用:处理经过本机转发的数据包(本机作为路由器)。
-
典型场景:配置 NAT 或防火墙规则控制内网与外网的通信。
-
示例
# 启用 IP 转发(内核参数) echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf sysctl -p # 允许内网到外网的转发(假设 eth0 是wan接口,eth1 是lan接口) iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT # 默认拒绝所有转发流量(需放在最后) iptables -P FORWARD DROP
4. PREROUTING 链
-
作用:在路由决策之前处理数据包(修改目标地址或端口)。
-
典型场景:DNAT(端口转发)、透明代理。
-
示例
# 将外部访问宿主机的 8080 端口转发到内网虚拟机的 80 端口 iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80 # 修改数据包的目标地址(DNAT) iptables -t nat -A PREROUTING -d 192.168.1.1 -j DNAT --to-destination 10.0.0.1
5. POSTROUTING 链
-
作用:在路由决策之后处理数据包(修改源地址或端口)。
-
典型场景:SNAT(源地址转换,如 NAT 上网)。
-
示例
# 启用 NAT(假设 eth0 是外网接口) iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # 对特定内网网段进行 SNAT iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 202.202.202.202
规则链的协作流程
- 数据包进入本机:
PREROUTING→INPUT→ 本机进程处理。 - 数据包从本机发出:
本机进程生成 →OUTPUT→POSTROUTING→ 外部网络。 - 数据包经过本机转发:
PREROUTING→FORWARD→POSTROUTING→ 目标网络。
1.4 常见案例
1.4.1 查看规则
iptables <-t 表名> -vnL:不加表名就默认是filter表。

# 查看那nat表规则
iptables -t nat -vnL
# 查看FORWARD链规则
iptables -L FORWARD -n -v
1.4.2 添加规则
1.4.2.1 开放端口
[root@localhost ~]# iptables -A INPUT -p tcp --dport 3306 -j ACCEPT #开放3306端口
[root@localhost ~]# iptables -A INPUT -s 10.1.1.2 -p tcp --dport 56 -j ACCEPT #开放10.1.1.2进站访问56端口

1.4.2.2 删除策略
iptables [-t 表名] -D [链] [Index]
Index是规则从上往下数,是第几条它的Index就是对应的序号。
比如我们删除1.3.2.1上添加的两条规则。

[root@localhost ~]# iptables -t filter -D INPUT 7
[root@localhost ~]# iptables -t filter -D INPUT 6

1.4.3 端口转发

如图,需求为让PC:172.173.10.71访问172.173.10.71上的222端口转跳到内部192.168.122.10上的22号端口。
在转跳服务器上即中间的服务器操作:
[root@kvm ~]# iptables -t nat -A PREROUTING -d 172.173.10.71 -p tcp --dport 222 -j DNAT --to-destination 192.168.122.2:22
[root@kvm ~]# iptables -t nat -A POSTROUTING -p tcp -d 192.168.122.2 --dport 22 -j SNAT --to-source 172.173.10.71
查看:

在PC上测试:


浙公网安备 33010602011771号