1. 先把概念捋直:内网IP、公网IP到底谁是谁
“IP地址在哪里查看、怎样查询自己电脑IP、怎么判断有没有公网IP、内网IP又怎么让外网访问”,这四件事看着像四个独立问题,实际上是一条线上的四个环节:查地址、认地址、验地址、用地址。我这些年帮人处理远程访问、设备联调、家庭服务器发布,十次里有八次卡住不是技术难,而是从第一步就把地址认错了,把内网地址当成公网地址在用,后面所有配置都是白费功夫。
这一节先把概念钉死,不然后面所有操作都没有判断依据。IP地址本质上是网络里的门牌号,但门牌号分“楼内房号”和“小区大门牌”两种。路由器给你电脑发的那个192.168.x.x,是楼内房号,出了这栋楼没人认识;而互联网上真正能被人从外部找到的地址,才是小区大门牌。绝大多数家庭宽带,手里的都是房号,不是门牌。
这里最容易混淆的是三组地址,我把它们摊开讲:私有地址、公网地址、特殊保留地址。私有地址就是内网IP,可以在自己家里随便用,但不会被互联网路由,任何人从外部都无法直接访问到它;公网地址是全球唯一的,理论上任何联网设备都能直接连过来;特殊保留地址包括回环地址127.0.0.1和链路本地地址169.254.x.x,前者代表“本机自己”,后者代表“没拿到地址时的自分配地址”,看到这两个基本说明你查错了对象。
私有地址的范围是固定的三段,记不住也没关系,看开头两位数字就够判断:
| 地址段 | 范围 | 常见出现位置 | 容量 |
|---|---|---|---|
| 10.0.0.0/8 | 10.0.0.0 - 10.255.255.255 | 公司内网、云主机内网 | 约1677万个 |
| 172.16.0.0/12 | 172.16.0.0 - 172.31.255.255 | 部分路由器默认段、容器网络 | 约104万个 |
| 192.168.0.0/16 | 192.168.0.0 - 192.168.255.255 | 家用路由器最常见 | 约6.5万个 |
| 100.64.0.0/10 | 100.64.0.0 - 100.127.255.255 | 共享地址转换场景 | 约419万个 |
第四行那个100.64.x.x段要单独说,它是最容易被误判成公网地址的一段。这个段是给“多个用户共享一个公网出口”的场景预留的,很多宽带服务商在IPv4地址不够分的时候,会给你分一个这个段的地址。它看起来不像192.168那么“家味儿”,很多人一看不是192开头就以为自己是公网IP,结果配了半天映射怎么都不通。判断口诀:只要开头落在上面这四行里,就是内网地址,没有例外。
至于为什么你在电脑上查到的地址,和在网上查到的地址不一样,原因就是中间的地址转换。路由器拿一个公网地址对外,对内给每台设备发私有地址,设备发出的每个数据包经过路由器时,源地址会被替换成路由器的公网地址,回包再按端口号映射回具体设备。这个过程叫 NAT,它解决了地址不够用的问题,代价就是外网无法主动找到你内部的设备——这也正是“内网IP怎么给外网访问”这个问题的根源所在。
注意:不要用“能不能上网”来判断有没有公网IP。内网地址一样能正常上网、看视频、打游戏,只是不能被外部主动连接。这两个能力是分开的。
理解到这一层,后面查地址的时候你心里就有数了:查到的每一个地址,先问自己它在哪个段,再问它在哪台设备上,答案基本就出来了。
2. 各系统查本机IP的实操路径
查本机IP这件事,不同系统的入口完全不一样,但原则只有一条:优先用命令行,图形界面的信息经常被裁剪,看不到网关、掩码、DNS这些关键项。下面按系统分别说,每种给两到三种路径,挑顺手的用。
2.1 Windows 下四种查法与各自适用场景
最通用的肯定是命令行。按下Win + R,输入cmd回车,然后敲:
ipconfig输出里会列出所有网络适配器,重点看“无线局域网适配器 WLAN”或“以太网适配器”下面的 IPv4 地址,那个就是你的内网IP。如果你还接了虚拟机、装了虚拟网卡,输出里会有一堆VMnet、vEthernet之类的条目,别被带偏,认准名字里带 WLAN 或以太网的那一段。
想要更完整的信息,加/all:
ipconfig /all这个会多出物理地址、DHCP 是否启用、租约获取时间、默认网关、DNS 服务器。默认网关那一行极其重要,它通常就是路由器的内网地址,后面要进路由器后台配置端口映射,靠的就是这个地址。很多人不知道路由器管理页地址是多少,其实网关地址加个http://直接浏览器打开就行。
第二个路径是设置界面:设置 > 网络和 Internet > WLAN(或以太网)> 点击当前连接的网络,下面会显示 IPv4 地址、DNS、网关等。这个路径的好处是直观,适合完全不想碰命令行的朋友,缺点是有时候信息刷新不及时,切换网络后需要退出重进一次。
第三个路径是任务栏。点右下角网络图标,选中当前连接,部分系统版本会直接显示 IP。这个最快,但信息最少。
第四个是 PowerShell,适合需要批量处理或写脚本的场景:
Get-NetIPAddress -AddressFamily IPv4 | Format-Table InterfaceAlias, IPAddress, PrefixLength输出比ipconfig干净,只有适配器名、地址、掩码长度三列,一眼扫完。我平时做批量设备排查时更爱用这个,因为它的输出可以直接管道给其他命令做过滤。
2.2 macOS 与 Linux 的查法
macOS 图形界面路径是系统设置 > 网络 > 选中当前连接 > 详细信息,IP 地址在“TCP/IP”标签页里。快捷方式是按住Option键再点菜单栏的 Wi-Fi 图标,会直接展开当前网络的 IP、路由器地址、信号强度等一堆信息,这个技巧知道的人不多但非常好用。
命令行的话:
ifconfig | grep "inet "会列出所有 IPv4 地址,127.0.0.1忽略,剩下那个就是。或者用networksetup -getinfo "Wi-Fi",输出更结构化,直接给出 IP、子网掩码、路由器三项。
Linux 这边命令更多,按新旧分:
ip -4 addr show hostname -I nmcli device showip addr是现代发行版的标准命令,ifconfig在不少新系统里默认已经不带,需要额外装包。hostname -I最快,一行输出所有地址,适合放进脚本。nmcli是 NetworkManager 的客户端,输出信息最全,连 DHCP 租期和 DNS 都有。
提示:在 Linux 上如果你的机器有多个网卡(比如一台既接内网又接外网网关的服务器),
hostname -I会输出多个地址,顺序不保证。要确认哪个是主用地址,用ip route看 default 那行对应的出口网卡。
2.3 移动端怎么查
iOS:设置 > 无线局域网 > 点当前网络右侧的 i 图标,IP 地址在“IP 地址”栏,同时能看到路由器地址和子网掩码。
安卓:设置 > WLAN > 点当前连接,不同厂商定制系统位置略有差异,通常在“网络详情”或“IP 设置”里。部分系统默认显示的是“IP 设置:DHCP”,需要展开才能看到实际地址。
手机查地址有个常见误区:很多人看到手机上是192.168.43.x就以为自己家网段是43,其实那是手机开热点时自己当网关的固定段,和家里路由器网段完全是两回事。判断依据还是网关地址,网关是多少,网段就是多少。
2.4 一眼分辨查出来的是内网还是公网
拿到地址之后,判断只需要三步,我把它整理成一张对照表,遇到任何地址对着扫一遍就行:
| 地址特征 | 判定 | 处理方式 |
|---|---|---|
| 10.x.x.x | 私有地址 | 内网,需映射或转发才能外部访问 |
| 172.16.x.x - 172.31.x.x | 私有地址 | 同上 |
| 192.168.x.x | 私有地址 | 同上,家用最常见 |
| 100.64.x.x - 100.127.x.x | 共享地址 | 大概率无公网IPv4,走隧道或IPv6 |
| 127.x.x.x | 回环地址 | 代表本机自己,不是网络地址 |
| 169.254.x.x | 链路本地 | 没拿到DHCP地址,检查网线或路由 |
| 其它(如 203.0.113.x) | 公网地址 | 理论上可被外部访问,需确认中间有无NAT |
举个具体例子:查出来是192.168.1.23,网关是192.168.1.1,那这台机器在内网第二十三号位;查出来是100.66.12.87,那基本可以判定处在共享地址转换后面,公网IPv4这条路的希望很渺茫;查出来是203.0.113.45且网关也是同段公网地址,那这台机器是直接挂在公网上的,防火墙就是唯一屏障,这时候反而要小心。
注意:
203.0.113.x、198.51.100.x、192.0.2.x这三段是文档专用保留段,我在文章里用来举例,你自己网络里不会出现。看到别人文章里用这几个段举例,不要以为是真实地址。
到这里,查地址这一环就算彻底通了。剩下两件事:验证你手上这个地址到底能不能被外部访问,以及如果不能,怎么绕过去。
3. 判断自家宽带有没有公网IP的四个递进验证法
“我到底有没有公网IP”是整个流程里最关键的一个岔路口,判断错了后面全白干。有公网IPv4,路由器端口映射十分钟搞定;没有,就得换IPv6或者中继转发。这一节给四个层层递进的验证方法,前一个不确定就往后走一个,四个都做完结论就非常扎实了。
3.1 对比法:本机出口地址 versus 路由器WAN口地址
这是最快的一步,不需要任何工具。做法是:先用第2节的方法拿到本机内网地址,再用浏览器搜索“我的IP”或者打开任意一个查询访问者地址的页面,记下页面上显示的那个地址——这是你整个网络对外的出口地址。然后登录路由器管理后台,找到“外网设置”“WAN口状态”“上网状态”之类的页面,看 WAN 口拿到的地址。
把这两个地址放在一起比:
- 两者一致:说明路由器直接持有公网地址,出口没有被上层再做一次转换,大概率有公网IPv4。
- 两者不一致:说明路由器 WAN 口拿到的还是私有地址或共享地址,上面还有一层设备在做转换,公网IPv4基本没戏。
这个对比法的原理很直白:如果路由器拿的就是公网地址,那它对外呈现的地址和它自己持有的地址应该是同一个;如果中间还夹了一层,那对外看到的是最外层那个地址,路由器自己手里的只是内层房号。
我见过最常见的误判就是只看浏览器显示的公网地址,一看“哎不是192开头,我有公网IP”,然后兴冲冲去配映射,配完发现从外面根本连不上。浏览器显示的那个地址永远是最外层出口的地址,它不能证明你有公网IP,只能证明你的网络能出去。
3.2 查WAN口地址落在哪个段
拿到 WAN 口地址之后,直接套用第2节那张判断表:
如果 WAN 口是192.168.x.x或10.x.x.x,说明路由器上面还有一层设备在做转换,典型场景是“光猫拨号 + 路由器二次拨号”或者“光猫拨号 + 路由器当二级路由”。这种情况下你需要在光猫那一层做映射,或者把光猫改成桥接、让路由器拨号,才能拿到真正的公网地址。
如果 WAN 口是100.64.x.x到100.127.x.x这个段,那就是共享地址转换,说明宽带服务商给你分的是共享地址,不是独占公网地址。这个段的特点是多个用户共用外层地址,靠端口号区分,你自己做映射没有意义,因为外层那一层不归你管。
如果 WAN 口是真正的公网地址(比如203.0.113.x),那恭喜,这条路走得通,直接跳到第4节看端口映射。
3.3 路径追踪:看路上有几层转换
前两步是静态看地址,这一步是动态看路径。Windows 上:
tracert -d 203.0.113.1macOS 和 Linux:
traceroute -n 203.0.113.1-d或-n的作用是不做域名反解,输出更快更干净。看输出前几跳的地址:
- 第一跳通常是你的网关(
192.168.1.1或类似),正常。 - 第二跳如果还是私有地址或共享地址段,说明光猫或上层设备又做了一次转换,这就是“双重NAT”。
- 第二跳直接是公网地址,说明路径上只有一层转换,比较健康。
双重NAT是端口映射失败的头号原因,没有之一。数据包要穿过两层转换,你只在第二层配了映射,第一层没配,外部请求到第一层就被丢了。这种情况要么在第一层也加一条映射,要么直接把第一层设备改成桥接模式,让第二层设备直接拨号,从根上消除一层。
提示:有些网络环境会屏蔽 ICMP,
tracert输出全是星号。这时候可以试试用ping配合 TTL 递增的方式绕一下,或者直接看路由器后台的 WAN 连接类型,是 PPPoE 还是 DHCP,PPPoE 拨号的那一层通常就是最外层。
3.4 反向验证:从外部主动连进来
前面三步都是“看”,这一步是“试”,也是唯一能给出确定结论的方法。做法分两种情况:
第一种,如果你已经有了一台在外网的机器(比如云上的主机),从那台机器上直接对你家的公网地址发起连接测试。Linux 下用nc -vz 你的地址 端口或者curl -v telnet://地址:端口,Windows 下用Test-NetConnection -ComputerName 地址 -Port 端口。能连上说明端口是通的,连不上说明要么地址不是公网,要么映射没生效,要么防火墙拦了。
第二种,如果没有外网机器,用手机流量。把手机 Wi-Fi 关掉,只用移动数据,然后访问你家服务的地址。这是最贴近真实场景的验证——手机走的是完全不同的网络路径,能连上就说明外部真的可达。
这里有个细节容易被忽略:不要在同一网络内测试自己的公网地址。很多路由器不支持 NAT 回流(也就是内网设备访问自己的公网地址),你在家里用电脑访问自己的公网IP,很可能失败,但外部其实是通的。这个现象迷惑性极强,我见过不少人因此误判自己没公网IP,白白折腾了好几天。测试一定要用外部网络,手机流量是最方便的选择。
3.5 四种验证结果对照
把上面四步的结论汇总一下,对应关系大致是这样:
| 验证组合 | 判定结论 | 推荐路线 |
|---|---|---|
| WAN口公网 + 路径一跳 + 外部可连 | 有独立公网IPv4 | 端口映射,最省事 |
| WAN口公网 + 外部不可连 | 有公网但映射/防火墙有问题 | 查映射规则和本机防火墙 |
| WAN口私有 + 路径两跳 | 双重NAT | 光猫改桥接或在光猫加映射 |
| WAN口共享段(100.64/10) | 共享地址转换,无公网IPv4 | IPv6 优先,其次中继转发 |
| 全部失败但IPv6可用 | 无公网IPv4但有公网IPv6 | 走IPv6直连,见4.2 |
这张表我建议直接截图存手机里,下次帮朋友排查的时候照着走,比凭记忆靠谱得多。判断清楚之后再动手,能省掉大量无效尝试。
需要强调的是,现在很多家庭宽带默认不下发公网IPv4,这是普遍现象,不是你的问题,也不用去纠结。真正值得关注的是 IPv6 这条被严重低估的路,下一节详细说。
4. 内网服务给外网访问的四条路线
确认了手上有什么牌,接下来就是怎么打。让内网服务被外网访问,本质上是解决“外部请求怎么找到你内部某台设备的某个端口”这个问题。四条主流路线,按实现成本和适用范围从低到高排,我把每条的原理、适用条件和坑都讲透。
4.1 路线一:路由器端口映射,有公网IPv4时的首选
端口映射的原理是把“公网地址的某个端口”和“内网某台设备的某个端口”绑定起来。外部请求打到公网地址的这个端口,路由器查表之后原样转给内网设备。这是最直接、延迟最低的方案,中间不经过任何第三方服务器。
配置入口在路由器的“端口转发”“虚拟服务器”“NAT映射”这类菜单里,不同厂商叫法不一样但功能相同。需要填的通常是四项:
- 外部端口:外网访问时用的端口,建议选 20000 以上的高位端口
- 内部地址:目标设备的内网IP,必须固定
- 内部端口:服务实际监听的端口
- 协议:TCP 还是 UDP,或者两者都选
这里有个参数选择需要解释一下。很多人图省事,外部端口和内部端口填成一样,比如服务跑在 8080,外部也映射 8080。这样能用,但没必要。外部端口和内部端口完全可以不一样,比如外部用 38080,内部还是 8080,路由器负责转。这样做的好处是外部端口更难被扫到,安全性稍好一些,同时也避开了某些宽带服务商对常见端口(80、443、8080)的封锁。
端口号的取值范围是 0 到 65535,其中 0 到 1023 是系统保留端口,需要特权才能监听,配置映射时不要往这个区间选。1024 到 49151 是注册端口,很多常见服务占用,扫描器也重点扫这一段。49152 以上是动态端口,相对冷门,我一般推荐在 20000 到 60000 之间随手挑一个不冲突的,既避开常见端口又不至于太怪。
注意:部分宽带服务商在接入层就封了 80 和 443 的入站,你映射了也不通,还以为是配置错了。遇到映射其他端口正常、只有 80/443 不通的,基本就是这个原因,换个高位端口立刻就好。
还有两个与之相关的功能,一个是 UPnP,一个是 DMZ。UPnP 允许内网程序自动向路由器申请开映射,方便但风险不小,因为你不知道哪个程序偷偷开了什么端口,建议在路由器里关掉。DMZ 是把某台内网设备完全暴露到公网,所有端口全开,等于把设备直接扔到外面,除非你非常清楚自己在做什么,否则不要用。
4.2 路线二:IPv6 直连,被低估的免费方案
这几年家庭宽带普遍下发了 IPv6 地址,而且和 IPv4 不一样,IPv6 不玩 NAT 那一套,每台设备拿到的都是可以直接被外部访问的全局地址。换句话说,如果你的网络有 IPv6,你天生就有公网可达性,不需要任何映射。
验证方式很简单:在电脑上查 IPv6 地址,看是不是以2408、2409、240e这类开头(国内常见的地址前缀),或者直接访问任意一个显示访问者 IPv6 地址的页面,能显示出地址就说明整条链路都支持。
如果本机有 IPv6 但外部访问不通,九成是路由器的 IPv6 防火墙把入站拦了。这是默认的合理设置,不是故障。要放行特定端口,需要在路由器的 IPv6 防火墙设置里加规则,方向是“入站”,目标是你那台设备的 IPv6 地址,端口填服务的监听端口。不同路由器配置界面差异较大,但逻辑都一样:允许某个端口从外部进入某台设备。
IPv6 方案有两个现实问题必须提前知道。第一是地址会变,宽带重新拨号或者前缀租约到期后,设备的 IPv6 地址可能变化,写死的地址过几天就失效了。解决办法是配合 DDNS,下一节说。第二是对方网络必须支持 IPv6,如果访问方所在网络只有 IPv4,那就连不上你的 IPv6 地址。所以 IPv6 适合“双方都现代”的场景,比如自己的手机访问家里的服务,现在主流移动网络基本都支持了。
我个人对 IPv6 的评价是:这是目前最被低估的方案。不花钱、不依赖第三方、延迟低,唯一的门槛是要理解“没有 NAT”这件事意味着防火墙就是唯一的门禁,配的时候要谨慎一点,只放行确实需要的端口,不要图省事全放开。
4.3 路线三:动态域名 DDNS,解决地址漂移
不管走 IPv4 还是 IPv6,家庭宽带的地址都不是固定不变的,重新拨号、断电重启、租约到期都可能换地址。每次都去查一遍当前地址再手动改连接配置,不现实。DDNS 就是干这个的:在本地跑一个客户端,定期检测当前地址,一旦变化就自动更新到域名服务商那边,你始终用同一个域名访问。
实现方式有三种,按门槛排:
- 路由器内置 DDNS:大部分路由器后台有 DDNS 菜单,选一个服务商,填账号密码,路由器自动上报。这是最省事的,适合不想折腾的人。
- 服务商客户端:在设备上装一个轻量客户端,定期上报。适合路由器不支持你想用的服务商的情况。
- 自己写脚本:用
curl调用服务商提供的更新接口,配合cron定时任务。适合有特殊需求或想完全掌控的。
第三种给个思路,脚本逻辑其实很简单:先查当前出口地址,和上次记录比对,不一致就调更新接口,一致就退出。查询当前地址那一步,用任意一个返回访问者地址的回显接口即可。放一个示意(伪代码,实际接口以所选服务商文档为准):
#!/bin/bash # 伪代码示意:读取当前地址,与缓存比对,变化则上报 CURRENT=$(curl -s https://回显接口地址) CACHE=$(cat /tmp/last_ip 2>/dev/null) if [ "$CURRENT" != "$CACHE" ]; then curl -s "https://服务商的更新接口?host=你的域名&ip=$CURRENT&token=你的令牌" echo "$CURRENT" > /tmp/last_ip fi定时任务设为每 5 到 10 分钟跑一次就够,太频繁容易被服务商限流。
DDNS 本身不解决“能否访问”的问题,它只解决“地址总变”的问题,所以它必须和端口映射或 IPv6 放行搭配使用。这个关系要理清,不然会以为是 DDNS 突然不好用了,其实是底下的映射规则掉了。
4.4 路线四:中继隧道转发,没有公网地址时的兜底
如果前面三条都走不通——没有公网IPv4、没有可用IPv6、宽带服务商那边也没法改——那就只剩中继转发这条路。原理是:在内网设备上跑一个客户端,主动向外网的一台中继服务器建立一条长连接;外部访问请求发到中继服务器,服务器顺着这条已经建立好的连接把流量回传给内网客户端。因为是内网主动往外连,不涉及任何入站,所以在任何网络环境下都能跑通。
这条路的优点和缺点同样明显。优点是适用性最广,什么网络环境都能用。缺点是延迟会变高,因为流量要绕到中继服务器再回来,如果中继服务器离你远,体验会明显下降;另外带宽受中继服务器限制,不要指望跑满你家宽带。
实现上分两类:一类是自建,自己在云上租一台小机器当中继,跑一个转发程序;另一类是用现成的中转服务,配置简单但免费版通常有带宽和连接数限制。选哪种取决于你对延迟和隐私的要求,以及愿意投入多少精力。
用第三方中转服务时有几条经验值得记一下:第一,看清楚它的转发规则,哪些端口能转、有没有并发限制;第二,注意数据传输是否加密,涉及敏感内容时别把不设防的服务直接暴露出去;第三,如果免费版限速严重,先测一下实际带宽再决定要不要投入,别配完了发现没法用。
4.5 四条路线选型对照
| 路线 | 前提条件 | 延迟表现 | 配置复杂度 | 适用场景 |
|---|---|---|---|---|
| 端口映射 | 有公网IPv4 | 最低 | 低 | 家庭服务器、远程桌面、监控 |
| IPv6直连 | 双端支持IPv6 | 很低 | 中 | 手机访问自家设备、新设备联调 |
| DDNS | 前两者之一 | 不额外增加 | 低 | 必须与映射或放行搭配 |
| 中继转发 | 无 | 较高 | 中 | 无公网地址时的兜底 |
选型逻辑其实很清晰:先看有没有公网IPv4,有就直接映射;没有就看IPv6通不通,通就走IPv6;两条都不行再上中继。DDNS 不是独立路线,它是给前两条擦屁股的,别把它当成第四种方案。
5. 实战:把一个内网服务发布出去
理论讲完,来一遍完整流程。这里以一个跑在192.168.1.50:8080的 Web 服务为例,目标是让外网通过一个域名访问到它。整个过程分为六个步骤,每一步我会说清楚为什么这么做,以及容易在哪翻车。
5.1 前置条件自检清单
动手之前先把这几项确认了,能避免后面 80% 的返工:
| 检查项 | 怎么确认 | 不通过怎么办 |
|---|---|---|
| 服务本机可访问 | 本机浏览器访问 127.0.0.1:8080 | 服务没起来,先解决服务 |
| 内网其它设备可访问 | 手机连同一Wi-Fi访问 192.168.1.50:8080 | 本机防火墙拦了,放行 |
| 内网IP固定 | 重启路由后地址是否变 | 做 DHCP 静态绑定 |
| WAN口有公网地址 | 见第3节对比法 | 走 IPv6 或中继 |
| 端口未被服务商封 | 换高位端口试 | 换端口 |
第二项特别容易被跳过。我遇到过太多次“映射配好了怎么不通”,最后发现是服务的监听地址写成了127.0.0.1。这个地址只接受本机连接,其他任何设备都连不上,包括你自己的手机。解决方法是把服务配置里的监听地址改成0.0.0.0,表示监听所有网卡。
第三项也重要。内网IP如果是 DHCP 动态分配的,路由器重启后可能变成192.168.1.51,你映射还写着.50,自然不通。固定方式有两种:一是在路由器的 DHCP 设置里做静态绑定,把设备的 MAC 地址和固定IP绑起来,设备不用改配置;二是在设备本机手动设静态IP,但要避开 DHCP 分配池,否则可能冲突。我更推荐第一种,集中管理,换设备也方便。
5.2 端口映射的具体配置与参数计算
进路由器后台,找到端口转发页面,填四项:
外部端口:38080 内部地址:192.168.1.50 内部端口:8080 协议:TCP外部端口为什么选 38080 而不是 8080?三个理由:第一,8080 是扫描器重点关注的端口,暴露在公网上每天会被扫几百次;第二,部分服务商的接入策略对常见 Web 端口有额外限制;第三,高位端口和你的服务名、设备型号没有任何关联,不容易被针对性尝试。
如果这个服务只需要给自己用,还可以在路由器里加一条来源限制,只允许特定来源地址访问。但家庭宽带的对外地址通常是动态的,手机流量地址也会变,这个限制维护起来麻烦,实际价值有限,更实际的做法是强化服务自身的认证。
配完之后,路由器的映射列表里应该能看到这条规则,状态是启用。有些路由器需要点“保存并应用”之后才生效,有些还需要重启一次,看具体型号。
5.3 防火墙与安全加固
映射只是把路打通,门后面还得有锁。按风险从高到低排,这几件事一定要做:
第一,改掉默认端口和默认账号。暴露在公网上的服务,第一波扫描通常在几小时内就会到。默认端口加默认口令是最容易被拿下的组合,改成一个不常见端口加强口令,能挡掉绝大多数自动化尝试。
第二,能加认证就加认证。Web 服务前面套一层基础认证,远程桌面只允许特定账号,文件服务不要开匿名。这些配置花不了几分钟,但差别巨大。
第三,只开必须的端口。一台设备上跑了三个服务,只映射你自己要用的那一个,不要图省事全映射。每多开一个端口,就多一个可能被利用的入口。
第四,关掉 UPnP 和 DMZ。前面说过,这两个功能会削弱你对端口开放情况的掌控,家庭网络里没必要开。
第五,留日志。至少保留访问日志和登录失败记录,出问题的时候能追溯。我习惯每周扫一眼失败登录次数,如果突然暴增,说明可能被盯上了,该换端口换端口。
注意:远程桌面这类高权限服务的风险等级远高于普通网页服务,能不直接暴露就尽量不要直接暴露。如果必须用,务必开双因素认证,并且把端口改到一个不常见的位置。
5.4 外部验证与结果确认
配完之后按这个顺序验证,每一步都过了才算成功:
- 内网另一台设备访问
192.168.1.50:8080,确认服务本身在内网可用。 - 手机流量访问
公网地址:38080,确认映射生效。这一步能过,说明整条路通了。 - 手机流量访问
域名:38080,确认 DDNS 生效。这一步能过,说明域名解析和地址更新都正常。 - 隔一天再测一次,确认 DDNS 在地址变化后能自动跟上。
第 4 步最容易被忽略。当天配好能用,第二天不能用了,八成是地址变了而 DDNS 没更新,或者更新了但本地 DNS 缓存还没过期。遇到这种情况先nslookup 你的域名看解析出来的是不是当前地址,再决定是查 DDNS 客户端还是等缓存过期。
我个人在实际操作中的体会是,这套流程真正耗时间的不是配置,而是前置条件的排查。配置本身十分钟就能做完,但如果内网IP没固定、服务监听地址不对、光猫多了一层NAT,每一个都能让你卡上几个小时。所以我把前置自检放在最前面,宁可多花十分钟确认,也不要配完之后反复猜。
6. 常见问题与排查实录
这一节全部是踩过坑之后攒下来的,按问题出现的频率从高到低排。每个问题给出判断依据和处理办法,遇到时按顺序对号入座。
6.1 端口映射配了不生效的排查顺序
这是最高频的问题。排查一定要有顺序,乱试只会浪费时间。我的固定顺序是:
第一步,确认公网地址是不是真的。按第3节的对比法走一遍。如果 WAN 口是私有地址或共享地址段,映射配得再对也没用,方向就错了。
第二步,确认服务在内网能不能被别的设备访问。用手机连同一 Wi-Fi 访问内网地址加端口。不通就是本机防火墙或监听地址的问题,跟映射无关。
第三步,确认服务监听的是所有网卡。在服务所在机器上执行:
netstat -ano | findstr :8080或者 Linux 下:
ss -lntp | grep 8080看监听地址那一列。如果是127.0.0.1:8080,只有本机能连,改成0.0.0.0:8080。如果是0.0.0.0:8080或[::]:8080,说明监听没问题。
第四步,确认防火墙放行。Windows 防火墙默认会拦入站,需要给对应程序或端口加一条入站规则。命令行方式:
netsh advfirewall firewall add rule name="自定义服务8080" dir=in action=allow protocol=TCP localport=8080Linux 上如果用 firewalld:firewall-cmd --add-port=8080/tcp --permanent然后--reload。
第五步,确认没有双重NAT。用第3节的 traceroute 方法看第二跳。如果有两层,要么在第一层也加映射,要么把第一层改桥接。
第六步,确认端口没被服务商封。换一个高位端口重新映射,如果换了就好,说明原端口被封了。
把这个顺序记牢,绝大多数映射问题都能在半小时内定位。
6.2 地址天天变、过几天就连不上
宽带地址变化是常态,处理方式取决于你走的是哪条路。走 IPv4 映射的,核心是 DDNS 要真的在更新,定期检查客户端日志有没有报错;走 IPv6 的,同理,而且要确认路由器的前缀变化后设备地址是否跟着变。
有个隐蔽的坑:DDNS 客户端更新成功,但域名服务商那边的 TTL 设得很长,导致解析缓存迟迟不刷新。这种情况不是客户端问题,把 TTL 调到 60 秒到 300 秒之间会好很多。代价是解析请求变多,但自用场景完全无所谓。
另一个坑是客户端和服务商之间的认证令牌过期。很多服务商的令牌有有效期,到期了更新接口会返回失败,但客户端不一定有显眼的提示。建议在脚本里加上失败重试和日志记录,出问题时能第一时间看到。
6.3 IPv6 通了但就是连不上
IPv6 的排查和 IPv4 完全不是一个思路,因为它没有 NAT,问题通常出在防火墙上。检查顺序:
先确认本机确实有全局 IPv6 地址,而不是只有fe80开头的链路本地地址。fe80开头的地址只能在本地链路上用,外部访问不了。然后确认外部网络(比如手机流量)本身支持 IPv6,有些网络环境只给 IPv4,这种情况你这边再正常也没用。最后检查路由器的 IPv6 防火墙入站规则,是不是默认拒绝所有入站,需要给目标端口单独放行。
还有一个容易忽略的点:IPv6 地址写法里有冒号,在浏览器地址栏访问时要加方括号,比如http://[2408:xxxx::1]:8080,不加方括号解析会出错。这个细节坑过不少人。
6.4 安全问题速查表
把风险点整理成一张表,配完之后对着过一遍:
| 风险项 | 判断方法 | 处理建议 |
|---|---|---|
| 默认端口暴露 | 端口号是否常见(22/3389/8080) | 换成 20000 以上高位端口 |
| 弱口令 | 是否有默认账号或简单密码 | 强口令 + 双因素认证 |
| 无认证服务 | 访问是否需要登录 | 至少加一层基础认证 |
| 端口开太多 | 映射列表有几条规则 | 只保留必需的 |
| UPnP 开启 | 路由器设置里是否启用 | 关闭,改手动映射 |
| DMZ 开启 | 是否有设备被全端口暴露 | 关闭 |
| 无日志 | 是否记录访问和失败登录 | 开启日志并定期查看 |
| 服务版本过旧 | 是否有已知漏洞 | 定期更新 |
这张表里我最想强调的还是第一条和第二条。大量自动化扫描就是靠“默认端口 + 默认口令”这两个条件筛目标的,把这两个改掉,能挡掉绝大部分无差别尝试。剩下的针对性攻击那是另一个层面的问题,家庭场景基本遇不到。
6.5 常见现象速查
再补几个零散但高频的现象,遇到直接对照:
| 现象 | 最可能原因 | 快速验证 |
|---|---|---|
| 内网通、外网不通 | 映射未生效或公网地址不对 | 手机流量测端口 |
| 家里通、外面不通 | NAT回流不支持,误判 | 换外部网络测 |
| 昨天通、今天不通 | 地址变了或DDNS失效 | nslookup 查解析 |
| 只有80/443不通 | 服务商封端口 | 换高位端口 |
| 时通时不通 | 设备休眠或无线信号弱 | 有线连接再测 |
| 速度很慢 | 上行带宽限制或走中继 | 内网测速对比 |
“内网通、外网不通”和“家里通、外面不通”这两个现象经常被混为一谈,其实完全不同。前者是真的没通,后者是路由器不支持从内网访问自己的公网地址,实际外部是通的。区分方法只有一个:用手机流量测,不要用家里的网络测。
最后分享一个我自己一直在用的习惯:把所有配置信息记在一个文档里,包括内网IP、映射端口、DDNS域名、服务监听端口、防火墙规则。时间一长,具体数字一定记不住,尤其是设备多的时候。这份文档在换路由器、迁移服务、排查故障的时候能省掉大量时间,比任何记忆都可靠。