解决方案:UnifiOS 下非默认网关设备端口转发无法访问

技术分享 · 前天

问题背景

最近在好几个群看到咨询指定网关+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规则很简单的添加:

ikuai NAT示例

UnifiOS 解决方案

最初我通过iKuai的思路,在UnifiOS的设置 - Policy Engine - NAT 中,按照iKuai的方式添加了Src. NAT,但还是不能访问。

在SSH中使用上文命令可以正常工作,但是UnifiOS只要一重启,SSH中做的配置便会清空,所以还是研究UI界面如何操作。

仔细看了下,发现,原来在UnifiOS中,需要指定转换位置为局域网,而非iKuai中会自动指定。

具体设置方法可参考下图:

image-20250621123607126