跳到主要内容

iptables

Linux 内核中的 netfilter 框架提供了各种网络流量处理功能,如数据包过滤、网络地址转换等,而 iptables 则是用于配置和管理相关功能的用户空间工具。iptables 整体由五张表(tables)组成,每张表包含多条链(chains),每条链又由一系列有序规则(rules)构成:

PREROUTINGINPUTFORWARDOUTPUTPOSTROUTING
raw
mangle
nat (DNAT)
filter
security
nat (SNAT)

根据 Stack Exchange 回答中提到的 commit,nat 表中的 INPUT 链最早是在 2010 年的 Linux 2.6.36 版本引入的,目的是为了简化某些网络地址转换操作,在一些旧的文章或者流程图中可能没有体现。

大多数情况下使用 nat 和 filter 表即可实现功能,较少用到 raw、mangle 和 security 表,常见的数据包流向为:

iptables-flowchart

参考来源:

docker 相关规则示例

测试环境:

  • 操作系统:Arch Linux
  • 内核版本:6.18.6-arch1-1
  • iptables 版本:v1.8.11
  • docker 版本:29.1.4
  • containerd 版本:v2.2.1
  • runc 版本:1.4.0

在 dockerd 及测试容器启动前后执行 iptables-save 命令,对比输出内容:

刚启动系统后,未运行 dockerd 服务,iptables 规则为空,仅包含默认链:

# Generated by iptables-save v1.8.11 on Sun Jan 25 02:25:31 2026
*mangle
:PREROUTING ACCEPT [192:1358695]
:INPUT ACCEPT [192:1358695]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [186:10883]
:POSTROUTING ACCEPT [187:11268]
COMMIT
# Completed on Sun Jan 25 02:25:31 2026
# Generated by iptables-save v1.8.11 on Sun Jan 25 02:25:31 2026
*raw
:PREROUTING ACCEPT [303:2205142]
:OUTPUT ACCEPT [292:16459]
COMMIT
# Completed on Sun Jan 25 02:25:31 2026
# Generated by iptables-save v1.8.11 on Sun Jan 25 02:25:31 2026
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
# Completed on Sun Jan 25 02:25:31 2026
# Generated by iptables-save v1.8.11 on Sun Jan 25 02:25:31 2026
*filter
:INPUT ACCEPT [603:3919054]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [592:38152]
COMMIT
# Completed on Sun Jan 25 02:25:31 2026
提示

在 dockerd 服务启动前,iptables 未配置额外规则,所有默认链均为 ACCEPT 策略,允许所有流量通过。

参考来源:

禁止外部 icmp 请求入站

在默认的 filter 表的 INPUT 链中添加规则,丢弃类型为 echo-request 的 icmp 请求数据包:

iptables -I INPUT -p icmp --icmp-type echo-request -j DROP

参考来源:Stack Exchange: How can I block ping requests with IPTables?

将指定目标地址的流量重定向到本地端口

在 nat 表的 PREROUTING 链中添加规则重定向外部经过本机的流量:

iptables -t nat -I PREROUTING --src 0/0 --dst A.B.C.D -p tcp --dport 80 -j REDIRECT --to-ports 8080

在 nat 表的 OUTPUT 链中添加规则重定向本机生成的流量:

iptables -t nat -I OUTPUT --src 0/0 --dst A.B.C.D -p tcp --dport 80 -j REDIRECT --to-ports 8080

参考来源:Debian Wiki: Firewalls-local-port-redirection