之前一直对端口转发搞不太明白,今天在做docker服务迁移的时候跟着gemini学习了一波。

背景:我的主路由是192.168.101.1,我的旁路由是192.168.101.10;我的服务器是192.168.101.23,我的域名是www.overstic.top,对应了我的公网ip地址172.xxx.xxx.xxx

情况1:
最早的服务配置在192.168.101.10的docker里面,端口是12345(假定)

如果我希望在外网通过端口54321访问,比如,我希望用www.overstic.top:54321 能够访问到内网的192.168.101.10:12345端口,那么就需要在主路由上配置端口转发,转发规则是外网端口54321,内网ip xxx.10,端口12345;
也就是说,这里我在主路由上配置了转发,任何发给我主路由的包,如果这个包是从54321端口发过来的,都会被主路由传递给ip xxx.10:12345 这个端口。这就是端口转发的基本逻辑,将某个端口收到的包,传递给别的IP的端口(当然也可以传递给自己IP的别的端口)

情况2:
我现在将服务从XXX.10迁移到了XXX.23;
那么我该怎么做呢?
也就是将主路由的端口转发,里面的内网ip xxx.10修改成xxx.23即可,这样包就会传递给xxx.23了。
正常这样做,就OK了,但是。。。我的服务没这么简单

情况3:
如果我的23服务器的网关不是配置的xxx.1(主路由的ip),而是xxx.10,这个时候就会导致外部方位出现问题:输入www.overstic.top:54321,结果页面报错。
这个根因是:我的网关配置成了XXX.10,表示所有的网络包会被传递给10(也就是我的旁路由,因为需要科学上网,我配置了旁路由),然后由xxx.10传递给xxx.1在出口。这样进口和出口没对齐,导致了问题。 非对称路由导致不能端口通信

所有,这里需要用到旁路由的端口转发功能。旁路由的端口转发和主路由的逻辑一样,某个端口收到了包,会传递给设置的IP对应的端口。为了解决这个问题,可以这样设置:
主路由上54321 -> xxx.10:33333, 旁路由上 33333 -> xxx.23:12345;相当于包先被传递给旁路由,旁路由再传递给23服务器的端口。这样,就能够正常访问了。

情况4:
使用情况3的应对方法,可以让我在外部访问服务,但是对某些特定服务产生了问题:我需要使用websocket,openwrt的转发貌似对ws的转发存在问题,直接导致外部访问服务会出错;
因此,建议将23服务器的发包,专门配置成对12345端口就直接发向xxx.1服务器,而不走xxx.10服务器;当前还没有尝试成功。

标签: none

添加新评论