昨晚搞到凌晨三点,差点把路由器砸了。起因很简单,给客户搭了个内网穿透服务,外网访问一切正常,结果客户在局域网里输入域名,死活打不开。这问题听着挺基础,但真到了实操层面,坑多得让人怀疑人生。今天不整那些虚头巴脑的理论,就聊聊我最近遇到的这个“做映射后 内网无法通过域名访问网站”的烂摊子,希望能帮兄弟们省点头发。
首先得搞清楚一个概念,很多人以为做了端口映射或者内网穿透,内网外网就打通了,随便怎么访问都行。大错特错。当你从内网访问自己的服务器,流量通常走的是“NAT回环”或者叫Hairpin NAT。如果你的路由器或者防火墙不支持这个特性,或者配置没跟上,数据包就会像没头苍蝇一样乱撞,最后直接超时。我那个客户的路由器是几年前的老款TP-Link,默认就没开这个功能。
我当时的第一反应是检查DNS解析。毕竟域名解析错了,神仙也救不了。但ping一下域名,IP地址指向的是公网IP,没错。那问题出在哪?出在流量路径上。当内网主机访问公网IP时,数据包到了路由器,路由器发现目标IP是自己,它得知道把这个包转回内网。很多家用路由默认是不处理这种“自己访问自己”的包的,直接丢弃。这就是典型的“做映射后 内网无法通过域名访问网站”的核心原因之一。
解决办法其实不复杂,但步骤得对。第一种方案,改Hosts文件。这是最粗暴也最有效的临时方案。在内网每台需要访问的机器上,把域名解析指向内网IP,而不是公网IP。这样流量根本不出路由器,直接在局域网内流转。虽然麻烦点,每台机器都要改,但对于测试环境或者小团队来说,这是最稳的。
第二种方案,升级路由器固件或者开启NAT回环功能。有些企业级路由器或者刷了OpenWrt的路由器,在NAT设置里有个选项叫“NAT Hairpinning”或者“回环支持”。打开它,路由器就会自动处理这种流量。但我那个客户的设备太老,固件都停更了,只能硬着头皮去改DNS。
说到DNS,这里有个坑。如果你用了内网穿透的DNS服务,比如花生壳或者某些云服务的专属DNS,它们在解析时可能会根据客户端IP智能判断。如果识别到你是内网IP,它可能故意返回公网IP,导致你陷入刚才说的死循环。这时候,你需要配置Split DNS,也就是智能DNS。内网解析走内网IP,外网解析走公网IP。这需要你的DNS服务器支持,或者在路由器层面做DNS重定向。
我还遇到过一个奇葩情况,是防火墙拦截。客户的服务器装了Windows防火墙,虽然开了端口,但默认配置文件可能禁止了来自“专用网络”的某些协议访问,或者是因为内网访问时,数据包源IP和目的IP在同一网段,被安全策略误判。这时候,去防火墙里加一条规则,允许内网段访问该端口,瞬间就通了。
其实,解决“做映射后 内网无法通过域名访问网站”这个问题,核心就在于理清流量的走向。是DNS解析错了?是路由器不支持回环?还是防火墙拦路?一步步排查,别一上来就重装系统。
另外,提醒一下,现在搞内网穿透,别只盯着端口映射。Socks5代理或者ZeroTier这类虚拟组网工具,有时候比传统的NAT映射更稳定,尤其是在内网访问场景下,它们能直接建立点对点连接,绕过很多NAT的坑。当然,这需要一定的网络基础,但比在那死磕路由器配置要省心得多。
最后说句实在话,网络问题没有银弹。遇到这种问题,保持冷静,用ping和traceroute去追踪路径,看数据包死在哪一步。别瞎猜,数据不会骗人。希望这篇帖子能帮到正在抓狂的你,毕竟,头发只有一根,且用且珍惜。