OPNSense端口转发场景下的地址伪装配置求助
OPNSense端口转发场景下的地址伪装配置求助
我现在遇到一个OPNSense的配置问题,想请各位技术大佬帮忙支个招:
我需要把公网IP的流量转发到通过ZeroTier连接的内部服务器,已经给5432端口做了端口转发,设置好目标IP和端口后,外部请求完全没响应。我在目标机器上用tcpdump抓包分析,发现进来的数据包源IP是请求者的公网IP,完全没做地址伪装。现在的问题是,目标机器的 outbound 流量会走它自己的默认网关,而不是OPNSense,导致整个请求链路断了。
所以我想请教:怎么给这个端口转发的入站流量配置地址伪装呢?
补充说明:我在OPNSense的诊断工具里,是能正常连接到目标IP和对应5432端口的。
解决思路与具体操作步骤
这个问题的核心是要给端口转发的流量加上SNAT(源地址转换/地址伪装)规则,让目标服务器的回包能通过OPNSense返回,而不是走自身默认网关。具体配置步骤如下:
- 登录OPNSense后台,进入防火墙 > NAT > 出站页面
- 点击右上角的「添加」按钮,新建一条出站NAT规则:
- 接口:选择和ZeroTier通信的对应接口(比如你给ZeroTier分配的
ztXXXXXX格式接口名称) - 协议:根据服务实际需求选「TCP」或「TCP/UDP」(你的场景选TCP即可)
- 源地址:可以填
*(允许所有公网地址请求),也可以设置更精准的公网IP段 - 源端口:填
*(任意端口) - 目标地址:填写内部服务器的ZeroTier IP(也就是你端口转发规则里的目标IP)
- 目标端口:填写
5432(对应你要转发的服务端口) - 转换目标:选择「伪装地址」,然后在下方「伪装地址」选项里,选中OPNSense在ZeroTier网络中的本地IP
- 描述:可以加个备注方便识别,比如「给5432端口转发流量做SNAT,确保回包路径正确」
- 接口:选择和ZeroTier通信的对应接口(比如你给ZeroTier分配的
- 调整这条规则的优先级,把它移到默认出站规则的前面,保证请求流量先匹配到这条规则
- 点击「保存」,再点击页面顶部的「应用更改」使规则生效
原理补充
现在的问题是目标服务器收到的是公网请求者的真实IP,它的回包会直接发向这个公网IP,走自身默认网关,完全不经过OPNSense,所以外部请求收不到响应。而配置SNAT后,目标服务器收到的源IP会被替换成OPNSense的ZeroTier IP,回包就会发给OPNSense,再由OPNSense转发给公网请求者,这样整个请求链路就打通了。
你能从OPNSense诊断工具连通目标服务器,是因为诊断请求的源IP就是OPNSense本身,目标服务器的回包自然能正常返回,这和外部公网请求的场景本质不同。
备注:内容来源于stack exchange,提问作者Antoner.me




