Information Security 10 min read

Mastering iptables: How Tables, Chains, and NAT Shape Linux Firewall Rules

This article explains the fundamentals of iptables, detailing how rules, tables, and chains work together to filter packets, the role of NAT, and provides practical command examples for configuring Linux firewalls effectively.

Efficient Ops
Efficient Ops
Efficient Ops
Mastering iptables: How Tables, Chains, and NAT Shape Linux Firewall Rules

iptables规则

下图展示了数据包到达 Linux 主机网卡后,内核处理数据包的大致流程。

什么是规则?

规则是管理员对数据包制定的触发机制,当数据包满足特定条件时执行指定动作。

条件:可以是数据包源地址、目的地址、协议等。

动作:可以是接受、拒绝、丢弃等。

使用 iptables 命令写入规则示例:

<code>iptables -t filter -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 -m multiport --dports 443,80 -j ACCEPT</code>

整条命令解释:允许经过本机网卡 eth0,使用 TCP 协议,源地址为 192.168.1.0/24 的数据包访问本地 80 和 443 端口。

什么是表?

表用于存放具体的防火墙规则,不同功能的规则放在不同的表中。

raw 表:决定数据包是否被状态跟踪机制处理。

mangle 表:拆解报文并修改 IP 头信息。

nat 表:修改数据包的源/目的地址和端口,实现 SNAT、DNAT、MASQUERADE、REDIRECT 等。

filter 表:过滤进出数据包,根据规则决定是否放行。

security 表:用于 SELinux 的强制访问控制(MAC)规则,最少使用。

什么是链?

链是表中的规则集合,决定规则的执行时机。

PREROUTING:在路由判断之前执行的规则。

INPUT:路由判断后,数据包流入本机时执行的规则。

FORWARD:路由判断后,数据包转发给其他主机时执行的规则。

OUTPUT:本机向外发送数据包时执行的规则。

POSTROUTING:数据包离开防火墙后,路由判断之后执行的规则。

在每条链中,规则按从上到下的顺序匹配,匹配成功后执行对应动作,后续规则不再考虑。

表、链、规则三者的关系是什么?

表决定相同链的优先级,规则在链中按插入顺序执行。不同表的优先级顺序为 raw > mangle > nat > filter > security。

数据报文进/出节点经过哪些规则?

客户端发送报文:先进入 OUTPUT 链(依次匹配 raw、mangle、nat、filter、security 表的 PREROUTING 规则),若未拦截则路由选择出网口,再进入 POSTROUTING 链(匹配 mangle、nat 表的 POSTROUTING 规则),最后从网卡发送。

服务端发送报文:先进入 PREROUTING 链(匹配 raw、mangle、nat 表的 PREROUTING 规则),路由判断后若报文发给本机,则进入 INPUT 链(匹配 mangle、nat、filter、security 表的 INPUT 规则),若未拦截则交给应用程序处理。

转发场景:先进入 PREROUTING 链,若报文不是发给本机,则进入 FORWARD 链(匹配 mangle、filter、security 表的 FORWARD 规则),随后进入 POSTROUTING 链(匹配 mangle、nat 表的 POSTROUTING 规则),最后从网卡发送。

补充:转发场景需要开启 Linux 转发功能,否则数据报文进入 FORWARD 链会直接丢弃;临时开启可执行 sysctl net.ipv4.ip_forward=1 或 echo 1 &gt; /proc/sys/net/ipv4/ip_forward 。 永久生效需修改 /etc/sysctl.conf ,添加 net.ipv4.ip_forward = 1 并执行 sysctl -p 。

NAT(网络地址转换)介绍

NAT 最常用于解决局域网设备访问互联网的问题。

SNAT(源地址转换)

在 nat 表的 POSTROUTING 链中增加规则,将局域网设备的源 IP 和端口改为公网 IP 和随机端口,并记录转换关系,以便返回流量能够正确转发回局域网设备。

<code>iptables -t nat -A POSTROUTING -d 192.168.1.11 -p tcp --dport 88 -j SNAT --to-source 122.9.3.47:88</code>

整条命令解释:将发往 192.168.1.11:88 的数据包,其源地址改为 122.9.3.47。

DNAT(目的地址转换)

在 nat 表的 PREROUTING 链中增加规则,将外部访问的公网 IP 和端口转换为内部服务器的 IP 和端口。

<code>iptables -t nat -A PREROUTING -d 202.12.10.100 -p tcp --dport 20022 -j DNAT --to-destination 192.168.10.11:22</code>

整条命令解释:将发往 202.12.10.100:20022 的数据包,其目的地址改为 192.168.10.11:22。

注意:Linux 内核使用 CONNTRACK 表记录 NAT 转换关系,首次经过 iptables 链时计算 NAT,后续的来回数据包均依据 conntrack 表进行地址改写,不会重复执行 DNAT/SNAT 规则。

来源: https://www.cnblogs.com/huaweiyun/p/18021766

NATnetwork securitySystem Administrationiptablespacket filteringLinux firewall
Efficient Ops
Written by

Efficient Ops

This public account is maintained by Xiaotianguo and friends, regularly publishing widely-read original technical articles. We focus on operations transformation and accompany you throughout your operations career, growing together happily.

0 followers
Reader feedback

How this landed with the community

login Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.