iptables
netfilter:hook 回调框架.
iptables:防火墙配置软件, 底层使用 netfilter。
- PRE_ROUTING 路由查找之前
- LOCAL_IN 目标地址是本机
- FORWARD 目的地是其他网络节点
- LOCAL_OUT
- POST_ROUTING
nftables, eBPF
INPUT
OUTPUT
FORWARD
tables
Filter table (默认)
- input 进入防火墙
- output 出防火墙
- forward 转发到其他网络(通过本机路由的数据包)
NAT table
- PREROUTING 在路由前修改数据包。(进入系统之后,路由之前) DNAT(目标网络地址转换)
- POSTROUTING 在路由之后修改数据包。(数据包离开系统时)SNAT(源网络地址转换)
- OUTPUT 防火墙本地生成数据包的 NAT 转换
Manage table
修改 tcp 报文的头部
- PREROUTING
- OUTPUT
- FORWARD
- INPUT
- POSTROUTING
不常用的 tables
- raw table
- security table
高级 NAT 配置
伪装源IP (SNAT)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
对网卡 eth0 出去的流量的 源 IP 进行伪装。
Masquerading 是 SNAT 的更智能的形式。(会将源 ip 改为出口网卡的有效IP)
端口转发
将访 问本机 8080 端口的请求转发到 192.168.1.100:80
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
-t nat 指定 nat 表
-A PREROUTING 指定 PREROUTING 链
-p tcp --dport 8080 触发条件
-j DNAT 要执行的动作
--to-destination 192.168.1.100:80 将目标地址改为 192.168.1.100:80
图解

这个图片中有三条线路
- network -> prerouting(nat) -> routing -> input -> host(app)
- host(app) -> output(filter,nat) -> postrouting(nat) -> network
- network -> routing -> forward -> postrouting -> network
从 routing 处会分叉
- 目标地址是本机上的应用,会转到 INPUT
- 目标地址非本机,会转到 FORWARD。 (本机作为中转)