我家里有一个 NAS,它有双 LAN 电缆连接两个不同的子网。
- lan1: 192.168.31.185 on subnet 192.168.31.0/24
- lan2: 192.168.10.42 on subnet 192.168.10.0/24
在此 NAS 服务器上,有一个公开端口 5001 的 Web 服务。我想从我的办公室访问它。
由于 192.168.10.0/24 子网网关路由器可以访问互联网。我在其上设置了 DDNS 和端口转发规则。
- port-forwarding rule: ddns-domain.com:5001 -> 192.168.10.42:5001
但测试表明它不起作用......调试开始
在同一个 192.168.10.0/24 子网上,有一台地址为 192.168.10.38 的 PC。
尝试从 PC 和网关路由器访问 192.168.10.42:5001,效果很好
在PC:5001上设置一个演示Web服务,更改端口转发规则:ddns-domain.com:5001->PC:5001,从我的移动4G网络访问,效果很好
这让我很困惑,因为我以前以为端口转发是一种特殊的反向代理。如果满足以下条件,它应该可以工作:
- resource provider can be accessed from the proxy
- proxy can be accessed from its own network address
之前调试过程中确认了这两个都正常。那么我应该检查什么来找出问题所在呢?
答案1
当您使用端口转发时,您需要让会话的返回路径与转发路径相同。
考虑以下网络:
+-----+a c+-------+e ( )
| |----------|router1|----------( INTERNET )
| | +-------+ ( ) g+-------+ +------+
| NAS | ( )-------|firewal|--|server|
| |b d+-------+f ( ) +-------+ +------+
| |----------|router2|---------( )
+-----+ +-------+ ( )
(我喜欢 ascii-arts)
在这幅图中,
a first NAS interface 192.168.31.185
b second NAS interface 192.168.10.42
c router1 internal 192.168.31.1
d router2 internal 192.168.10.1
e router1 external xx.xx.xx.xx
f router2 external yy.yy.yy.yy
g An ip address on Inet zz.zz.zz.zz
因此,G 尝试访问您的 NAS。您设置
port-forwarding rule: ddns-domain.com:5001 -> 192.168.10.42:5001
因此,G 将尝试创建一个会话 (tcp,zz.zz.zz.zz:12345->yy.yy.yy.yy:5001)。Router2 执行端口转发并将其转换为 (tcp,zz.zz.zz.zz:12345->192.168.10.42)。您的 NAS 会礼貌地回复。对于 NAS,zz.zz.zz.zz 不在路由表中,因此它会将回复发送到默认网关,即 c。Router1 完全不知道 router2 已完成的 NAT,因此它将执行自己的 NAT 并将回复发送为 (tcp,xx.xx.xx.xx:5001->zz.zz.zz.zz:12345)。G 会想:嗯?我从未向 xx.xx.xx.xx 发送过任何东西,并会丢弃数据包。但它仍会等待(tcp,yy.yy.yy.yy::5001->zz.zz.zz.zz:12345)。
所以这就是它不起作用的原因。
解决方案:将 NAS 的默认网关设置为 192.168.10.1。