我正在测试 NAT 穿透代码,需要一个对称 NAT。我已经使用 PF 配置了 FreeBSD,规则非常简单:
# rl0 in WAN on DHCP, sk0 is LAN with computers behind this NAT.
nat on rl0 from sk0:network to any -> (rl0)
这很有效,NAT 对 UDP 数据包来说是对称的,但不幸的是,每个数据包到不同目的地的传出端口号都是随机的。是否有一种配置 PF 的方法,使端口不是随机的,而是某种增量?例如,发送到主机 A 的 UDP 数据包将获得传出 UDP 端口号 50000,发送到主机 B 的 UDP 数据包将获得端口号 50001,发送到主机 C 的 UDP 数据包将获得端口号 50002 等等?
答案1
该static-port
选项应该可以实现您想要的效果。
使用 nat 规则,静态端口选项可防止 pf(4) 修改 TCP 和 UDP 数据包上的源端口。
从而给你一个规则。
nat on rl0 from sk0:network to any -> (rl0) static-port
不过我很好奇你为什么要这么做。端口随机化并不是一件坏事,而且可以在某种程度上保护易受攻击的协议。例如去年的 Kaminsky DNS 问题。
答案2
只是猜测,但你可以尝试
# sysctl net.inet.ip.portrange.randomized=0