nftables map实现多端口到多容器分发,通过定义inet表、创建port_to_container映射、在prerouting链中DNAT查表,结合转发放行和IP转发启用,高效替代链式规则。

用 nftables 的 map 实现多入站端口到多容器的分发,核心在于把“目标端口 → 容器IP+端口”这个映射关系固化为高效查找结构,避免链式规则逐条匹配。它比传统 DNAT + 多条 FORWARD 规则更轻量、更可扩展,尤其适合动态增删后端容器的场景。
一、定义支持端口映射的 inet 地址簇表与基链
先建一个统一处理 IPv4/IPv6 入站流量的表,再挂上 PREROUTING 链做 DNAT 前置处理:
- nft add table inet nat
- nft add chain inet nat prerouting { type nat hook prerouting priority -100 \; }
这里用 priority -100 确保该链在连接跟踪(conntrack)之后、路由决策之前执行,是做 DNAT 的安全时机。
二、创建端口→容器地址的映射(map)
声明一个 key 为端口号(inet_service)、value 为容器 IPv4 地址和端口组合(ipv4_addr . inet_service)的映射:
- nft add map inet nat port_to_container { type inet_service : ipv4_addr . inet_service \; }
- nft add element inet nat port_to_container { 8080 : 10.88.0.5 . 80 , 9000 : 10.88.0.6 . 9000 , 3001 : 10.88.0.7 . 3001 }
注意:容器 IP 必须是宿主机能直接路由到的地址(如 CNI 分配的 PodIP 或 Docker bridge 网段),不能是 localhost 或未启用转发的私有网段。
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
三、在 PREROUTING 链中调用 map 实现一键 DNAT
写一条规则,提取入站 TCP/UDP 目标端口,查 map,命中即重写目的地址和端口:
- nft add rule inet nat prerouting meta l4proto { tcp, udp } th dport @port_to_container dnat to @port_to_container
这条规则等效于:对所有 TCP/UDP 流量,若目的端口在 map 中存在对应项,就执行 DNAT 到 map 中绑定的容器 IP 和端口。无需为每个端口单独写规则,也不依赖 ipset。
四、放行转发并启用内核转发
DNAT 后流量会进入 FORWARD 链,需允许其通过,并确保内核开启转发:
- echo 1 > /proc/sys/net/ipv4/ip_forward
- nft add chain inet filter forward { type filter hook forward priority 0 \; policy drop \; }
- nft add rule inet filter forward ct state established,related accept
- nft add rule inet filter forward ip daddr 10.88.0.0/16 tcp dport { 80, 9000, 3001 } accept
最后一行可按需改为更通用的写法,例如用 @port_to_container 的 value 提取端口范围,或配合 set 动态管理允许的目标端口。

















