iptables 的规则链详情

10 min read

iptables 的规则链如下:

  1. PREROUTING:对数据包进行修改,如DNAT。

  2. INPUT:对数据包进行目标地址的匹配,如果匹配成功进入后续动作。

  3. FORWARD:对转发的数据包进行处理,如果匹配成功进入后续动作。

  4. OUTPUT:对本机生成的数据包进行匹配,如果匹配成功进入后续动作。

  5. POSTROUTING:对数据包进行修改,如SNAT或MASQUERADE。

其中,PREROUTING、INPUT、FORWARD 都是针对进来的数据包进行处理的规则链,而 OUTPUT、POSTROUTING 都是针对出去的数据包进行处理的规则链。一般情况下,我们只需要掌握 PREROUTING、FORWARD、OUTPUT 三个规则链即可。

PREROUTING 规则链针对的是进入本机的数据包,可以在这个规则链中进行 DNAT 等操作,例如将所有进入本机的 TCP 端口 80 的数据包转发到 192.168.1.2 的 TCP 端口 8080,那么就需要在 PREROUTING 规则链中设置一个 DNAT 规则:

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

输入 iptables -t nat -L -n 命令可以查看 PREROUTING 规则链中的规则列表。

INPUT 规则链主要针对本机目标地址匹配的数据包进行处理,例如允许本机接收 ICMP 请求,就需要在 INPUT 规则链中添加规则:

iptables -A INPUT -p icmp -j ACCEPT

输入 iptables -L -n 命令可以查看 INPUT 规则链中的规则列表。

FORWARD 规则链主要针对转发的数据包进行处理,例如允许本机对外进行 NAT 转发操作,就需要在 FORWARD 规则链中添加规则:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

以上设置会将来自 eth1 网络的数据包通过 eth0 网络进行转发,同时执行 MASQUERADE 操作,将来自 eth1 网络的数据包的源地址进行 NAT 转换。输入 iptables -L -n 命令可以查看 FORWARD 规则链中的规则列表。

OUTPUT 规则链主要针对本机生成的数据包进行处理,例如允许本机向外发送 ICMP 请求,就需要在 OUTPUT 规则链中添加规则:

iptables -A OUTPUT -p icmp -j ACCEPT

输入 iptables -L -n 命令可以查看 OUTPUT 规则链中的规则列表。

POSTROUTING 规则链针对的是出去的数据包,可以在这个规则链中进行 SNAT 或 MASQUERADE 等操作,例如将所有出去的 TCP 端口 80 的数据包的源地址替换为 192.168.1.1,那么就需要在 POSTROUTING 规则链中设置一个 SNAT 规则:

iptables -t nat -A POSTROUTING -p tcp --sport 80 -j SNAT --to-source 192.168.1.1

输入 iptables -t nat -L -n 命令可以查看 POSTROUTING 规则链中的规则列表。