我 iptables 有这样一个命令。
sudo iptables -t nat -A OUTPUT -d 172.13.0.99 -p tcp --dport 8080 -j DNAT --to-destination 公网ip:80
这样当我请求 172.13.0.99 8080 端口的,时候就会将请求转发到 公网ip 对应的 80 端口上去。实际上这个 ip 172.13.0.99 是不存在的。
然后我找了很多资料,在 mac 下要用 pfctl。都是 rdr 实现。
rdr pass inet proto tcp from any to any port 8080 -> 公网ip port 80
这样实现后,访问本地 ip 或者 172.13.0.99 的 8080 都无法访问到 公网ip 对应的 80 端口。但是到将 公网ip 改成本机 ip,这条规则又是生效的。
在 v2ex 看到有人说 pfctl 只能 nat 本机。
想问问有类似经历的朋友吗,分享给我一下。
结论
经过几位大佬(还有 sf 社区外的)帮助和多次测试,最终得到结论是:pf 无法 nat 到非本机 IP 上。因此上面的 iptables 规则无法直接转化成 pf rdr 来使用。
最终使用了 Seven 大佬的建议。在本地将 lo 网卡的 ip 做别名,加一个 tcp 反向代理,通过别名 ip 来访问反向代理,间接实现了类似 iptables 所表达的功能。
DNAT
用于将目的地址重定向到另一个IP地址,就像Linux的iptables -t nat -A PREROUTING
。你的规则不生效,可能是因为系统不允许IP转发:添加DNAT规则:
在
/etc/pf.anchors/
目录下创建web
文件,输入这些内容:将其中的汉字换成你需要的接口和IP。并且在
/etc/pf.conf
中添加对anchor
的引用:加载配置并启用PF: