公网 IP 的服务,只能从「非本机地址」访问,求解

2023-05-02 16:11:43 +08:00
 K8dcnPEZ6V8b8Z6
如题,手头有公网 v4 ,在 NUC 上开了 TCP 和 UDP 服务若干(群晖 portal ,DNS ,WEB 等),并通过主路由( TL-R5408PE )做好端口映射,对外皆为高端口。经测试,从外部 IP (两台 VPS 和手机热点)访问这些服务都正常,但从同一内网的机器走公网 IP 访问的话,全部失败。
个人猜测应当修改路由器的 NAT 或路由设置,但由于网络知识所限,不知应改哪个地方,程心求助!
2661 次点击
所在节点    宽带症候群
25 条回复
fat00119
2023-05-02 16:13:45 +08:00
端口回流
opengps
2023-05-02 16:23:33 +08:00
有的路由器确实会内部访问不到自己外部端口
crab
2023-05-02 16:49:33 +08:00
Archeb
2023-05-02 19:25:38 +08:00
需要做 Hairpin NAT ,也就是端口回流,可能是你的路由器固件没有自动实现这个功能。
opengps
2023-05-02 19:43:58 +08:00
对了,我当时变通解决,用 hosts 强制指定域名解析到内网指定的机器
K8dcnPEZ6V8b8Z6
2023-05-02 21:29:14 +08:00
@Archeb 事实上好像没这个功能……
K8dcnPEZ6V8b8Z6
2023-05-02 21:30:23 +08:00
@fat00119 多谢大佬快速回复,搜到了一些教程
@opengps 找来找去好像真的只能用自建 DNS 的方法解决了,遗憾
handshake
2023-05-04 15:32:34 +08:00
防火墙添加一条 nat 规则,转换源地址为内部网段即可
tkyb123
364 天前
小米路由器同样遇到了这样的问题。。。不知道如何解决,求大神指点
ziwen1943
364 天前
端口回源没配置吧,我以前也遇到过这种问题,一般是对应的防火墙或者负载均衡加 NAT 或者回源规则就好。
busier
363 天前
RouterOS 也遇到这个问题!网上找的解决脚本也是错误一堆!好在自己慢慢改搞定了!
jinqzzz
363 天前
tp 企业路由是在 NAPT 设置源地址,但是我用过的 tp 路由上这个功能没一个正常的
dont39
363 天前
如果有 ipv6 地址的话,可以在域名解析那边加上设备的 ipv6 地址,内网的机器通过域名访问的时候会优先走 ipv6 从而绕过这个问题。
raycheung
363 天前
@busier #11 老兄是如何配置实现的,能劳驾贴下脚本参考学习下吗?
K8dcnPEZ6V8b8Z6
363 天前
@jinqzzz 我后面解决了,是问客服要了另一个版本的固件,没想到更新后就可以了
busier
361 天前
@raycheung

Router OS 端口映射,支持回流

/ip firewall nat
add action=src-nat chain=srcnat comment=SNAT to-addresses=111.175.157.94
add action=dst-nat chain=dstnat comment=HairpinNAT dst-address=111.175.157.94 dst-port=21194 protocol=udp to-addresses=192.168.88.2 to-ports=21194
add action=dst-nat chain=dstnat comment=HairpinNAT dst-address=111.175.157.94 dst-port=8443 protocol=tcp to-addresses=192.168.88.201 to-ports=8443

说明:action=src-nat 规则行设置 NAT ,action=dst-nat 规则行设置支持回流的端口映射
其中 111.175.157.94 为公网 IP ,这里可以不手动修改,利用下面的脚本自动修改!
特别注意的是,注释:comment 指令不能省略,下面的脚本根据这个来更新规则的!

================================================
Router OS 自动更新上面规则中公网 IP 的脚本

:global ipaddr [/ip address get [/ip address find interface="pppoe-out1"] address];
:set ipaddr [:pick $ipaddr 0 ([len $ipaddr]-3)];

:global oldip [/ip firewall nat get [/ip firewall nat find chain=srcnat action=src-nat] to-addresses];

:if ($ipaddr != $oldip) do={
/ip firewall nat set [/ip firewall nat find chain=srcnat action=src-nat comment="SNAT"] to-addresses=$ipaddr;
/ip firewall nat set [/ip firewall nat find chain=dstnat action=dst-nat comment="HairpinNAT"] dst-address=$ipaddr;
}

将此脚本放到 RouterOS 中运行,其中 pppoe-out1 是 PPPoE 拨号接口的名字!
这个脚本从 pppoe-out1 接口获取公网 IP ,然后去 firewall nat 表更新 comment="SNAT" 和 comment="HairpinNAT" 规则中的公网 IP
设置这个脚本在 RouterOS 中每 10 分钟运行一下就可以了,完美解决 RouterOS 回流问题!

就是这么简单!
raycheung
361 天前
@busier #16 感谢老哥
fastcache
361 天前
@raycheung 不用脚本的配置

/ip firewall nat
add action=masquerade chain=srcnat comment="Hairpin NAT" connection-mark=Hairpin-NAT
/ip firewall mangle
add action=mark-connection chain=prerouting comment="Mark connections for hairpin NAT" dst-address-list=wan-ip new-connection-mark=Hairpin-NAT passthrough=yes src-address-list=LANs
raycheung
361 天前
@fastcache #18 多谢大佬提供不一样的思路,相对 op 的方案,个人感觉你这个会更优。
busier
360 天前
@fastcache 你的配置中 dst-address-list=wan-ip ,如果是 PPPoE 动态获得地址,你的 wan-ip 这个地址列表如何更新?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/936873

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX