我 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 所表达的功能。
可参考这篇文章
macOS 下做 DNAT
在 Mac 上没有 iptables,但你可以使用 Mac 自带的 pf(Packet Filter)来实现类似的端口转发功能。以下是具体步骤:
1.启用 IP 转发:
启用后注意这里如果只能本机可以看我下面的补充
2.创建 PF 配置文件: 创建一个新的 PF 配置文件,例如 /etc/pf.anchors/http,内容如下:
3.修改主 PF 配置文件: 编辑 /etc/pf.conf 文件,添加以下内容:
4.验证配置: 使用以下命令验证配置文件是否正确:
5.启用 PF 服务: 启用 PF 服务并加载配置:
这样,当你在本地访问 172.13.0.99:8080 时,流量会被重定向到指定的公网 IP 的 80 端口。
补充
iptables vs pf 的主要区别:
可以将上面步骤
1.启用 IP 转发:这一步之后为网络接口配置别名: 你可以将 172.13.0.99 配置为本地网络接口的别名。这样,pf 会将其视为本地地址,从而允许重定向。以下是具体步骤: