问题背景
最近在好几个群看到咨询指定网关+UnifiOS 端口转发无法正常访问的情况。
在某些场景下,需要将局域网部分设备的网关设置为非UnifiOS的网关IP(10.10.10.1),例如我的内网中的一台Ubuntu设备(10.10.10.26),需要将网关设置为Surge的增强模式网关IP(10.10.10.24),以实现流量过滤和分发。
在这种情况下,如果在UnifiOS中设置端口转发,将Ubuntu的8080端口转发到公网,直接访问会发现并不能正常访问。
问题原因
该问题与路由器的端口转发的实现方式有关:
- 若路由在转发时,将数据包的 SRC IP 修改为了路由的 IP 地址,则回向包将直接发给路由,可以正常工作。
- 若路由在转发时,未修改数据包的 SRC IP,则回向时该数据包将会交给 Surge 处理,但 Surge 没有对应的端口转发信息,只能抛弃该数据包。
解决方案
其他路由器解决方案
通常情况下:
在OpenWRT或类似路由中,可以直接通过SSH添加防火墙规则实现正常转发:
iptables -t nat -A POSTROUTING -d 端口映射IP -j SNAT --to-source 路由IP
在iKuai中,可以通过NAT规则很简单的添加:
UnifiOS 解决方案
最初我通过iKuai的思路,在UnifiOS的设置 - Policy Engine - NAT 中,按照iKuai的方式添加了Src. NAT,但还是不能访问。
在SSH中使用上文命令可以正常工作,但是UnifiOS只要一重启,SSH中做的配置便会清空,所以还是研究UI界面如何操作。
仔细看了下,发现,原来在UnifiOS中,需要指定转换位置为局域网,而非iKuai中会自动指定。
具体设置方法可参考下图: