多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

家庭IP原理与DDNS端口映射:让动态IP也能有固定入口

家庭IP原理与DDNS端口映射:让动态IP也能有固定入口 “家庭IP”这四个字很多人是到吃了亏之后才开始认真琢磨的。比如在公司想连回家里NAS取个文件昨天还好使的地址今天突然不通装了一套监控摄像头人在外地想看一眼画面App里却始终提示“设备离线”。折腾一圈发现路由器没坏、网线没断、设备都正常问题恰恰出在IP上——你家宽带出口的地址根本不是固定不变的运营商可能还把你整个小区塞进了一层大内网后面外部根本摸不到你的门口。这篇文章我就从家庭IP的原理讲起帮你看清公网IP、私网IP、IPv4和IPv6的关系再聊怎么判断你到底需不需要一个“固定入口”以及怎么把家里的访问入口做得尽量可靠。最后会放一份完整的实操记录和故障排查表都是我实打实踩过的坑。无论你是刚接触组网的新手还是家里已经有一套NAS、想对外提供服务的进阶玩家都可以照着一路走下来。1. 家庭IP的两层结构公网IP和私网IP的关系1.1 公网IP和私网IP到底差在哪把IP地址想象成家庭住址。公网IP相当于一个全国乃至全球唯一的门牌号别的城市、别的国家的人按这个地址都能找到你私网IP则相当于小区内部的楼栋号出不了小区大门。你家路由器往内网分发的192.168.x.x、10.x.x.x、172.16.x.x这些全都是私网IP它们只在你家局域网内有效出了你家那道墙立刻失效。真正决定你“在外面能不能直接访问回家”的是路由器WAN口上那个公网侧地址。如果运营商给你的是公网IPv4地址别人从互联网发来的数据包就能顺着这个地址找到你的路由器再由路由器通过端口映射转给局域网的某台设备。如果运营商给你的只是一个私网地址说明你家宽带的流量被统一汇聚到运营商侧再统一上网也就是平时常说的“大局域网”或运营商NAT。这种情况下外面的人看到的是运营商的出口IP根本看不到你家里任何一台设备的地址自然也就谈不上直连。很多朋友有个误解认为宽带师傅上门装完光猫、能上网就等于你家有公网IP。实际上运营商给家庭用户的IPv4地址策略这些年越来越紧IPv4资源就那么多一个小区几十户人家可能共用几个出口地址。别被“已拨号上网”这种显示骗了真正要确认的是你在互联网上裸露的那个地址到底是不是你自己独享的。1.2 IPv4和IPv6为什么你家IP总在变动态IP这件事是IPv4资源紧张下的必然结果。运营商的地址池不大不可能给每个家庭都固定一个IPv4地址所以只能轮流分配你家光猫每次重启、断线重拨都可能换到一个新地址。这就像租房子房东每个月可能给你换把锁你的门牌号也跟着变。按目前家宽常规设置动态租约可能是24小时、48小时也可能短到几小时就刷新一次所以昨天还能连上的地址今天就会失效。IPv6的出现很大程度上是为了解决这个问题。IPv6的地址空间足够大运营商一般会给家庭宽带分配一段前缀常见的是/56或者/60足够你家所有设备每人两个以上全球唯一的IPv6地址。可惜的是一方面很多运营商光猫默认配置里就没开IPv6另一方面就算开了用户路由器、设备、App的兼容性也是参差不齐。我在帮人排查时十家里至少有四家光猫都是只开了IPv4模式问师傅“为什么不给我开”答复通常是“默认就这样要用再说”。所以你现在面对的真实情况是IPv4不一定是公网、不一定是静态IPv6理论上可以全球直连但默认往往没开启。搞明白这两点后面所有方案选择都有了判断基础。2. 先判断需求再谈方案典型场景和IP类型自测2.1 你到底需不需要一个对外入口不是所有人都有必要给自己家搞一个固定对外入口得先看真实使用场景。我把这些年遇到的需求归纳成几类你可以对号入座。场景对IP的要求不处理的后果远程访问NAS、下载机、家庭服务器需要知道家里地址且地址尽量不变地址经常失效没法稳定访问远程连回家里的电脑做点临时操作能连上一次是一次的低要求场景每次重新查询地址麻烦但能不花钱解决监控摄像头和智能家居远程查看多数厂商已做云中转不需要自己搞公网IP厂商服务器出问题时画面彻底失联自建游戏服、开发调试、Web服务对外发布要求较高可能需要固定IP或长期稳定的入口别人根本连不进来体验极差纯粹日常上网、看视频、打游戏不需要任何外网访问入口不需要处理这里有个很关键的心态问题如果你只是偶尔一次想访问家里设备完全可以在出门前把IP记下来用完拉倒。但你要是想做到像访问云服务器那样随时可连而不是每次先打电话问家里“今天IP是什么”那就需要一套自动更新的机制也就是后面要讲的DDNS等方案。2.2 一条命令测出你家网络到底属于哪种类型动手之前先摸清自己的网络底细。判断方法不复杂一共三步。第一步把路由器管理页面打开找到WAN口状态看一下路由器拨号拿到的IP地址。这一步在TP-LINK、小米、华为等常见路由器后台里基本都在“网络状态”或“上网信息”里。第二步在浏览器里访问一个能显示出口IP的网站比如 ip.sb、ifconfig.me或者直接搜“IP查询”。这看到的是你家流量出口时对互联网展示的IP。第三步对比两个IP如果WAN口IP和查询网站显示的IP完全一致且不是100.64.x.x、10.x.x.x、192.168.x.x、172.16.x.x这些保留地址说明你拥有公网IPv4。如果WAN口IP是私网段但查询网站显示的是一个完全不同的IP说明你处于运营商大内网里面出去还要再经过一层NAT。如果你查询结果里同时出现了IPv6地址说明运营商给了你IPv6这个地址拿到后等于你有了全球直连的通行证。用命令也可以快速看本机IPWindows下是ipconfigLinux和macOS下是ip addr或者ifconfig。不过本机看到的通常是内网和IPv6地址出口公网IP还是得靠网站查询。想一条命令直接看出口IP的话Windows的PowerShell可以执行 curl ifconfig.meLinux和macOS同样支持。这个测试就一分钟的事我建议你在光猫断电重启前后各测一次感受一下IP变化的速度亲眼看一次就明白动态IP到底有多“动”。3. 让动态IP有个固定门牌DDNS、端口映射与IPv6直连3.1 DDNS动态IP和固定域名之间的绑定向导一旦确认了自家网络能获得公网IP接下来的问题就是IP会变。这时候就该DDNS登场了。DDNS全称是Dynamic Domain Name System动态域名解析服务。它做的事情其实特别简单你在域名服务商那里给一个子域名做了解析然后你家里的一台设备或者路由器每隔几分钟就检查一次当前公网IP如果发现IP变了立刻通过API通知解析服务商把A记录更新成新IP。别人访问你的域名时域名系统就会把请求指向你家最新的IP地址。打个生活化的比方你朋友家的固定电话号码经常变但你手机通讯录里永远存着一个“老张”的名字不管他换多少号码你一拨“老张”就能找到他。DDNS就是那个通讯录里永远不变的“老张”标签动态IP则是每天都在变的电话号码。目前常见的DDNS服务商有这几类。路由器厂商内置的比如TP-LINK的DDNS、华硕的ASUS DDNS、小米路由器的内置服务好处是配置简单填个账号就完事独立DDNS服务商比如No-IP、Duck DNS、dynv6注册一个域名后自己配还有云厂商的域名解析服务比如阿里云解析、腾讯云DNSPod、Cloudflare它们本质是DNS托管平台配合脚本和API自动更新记录。我在实践中最常推荐的是如果你不太想折腾脚本优先用路由器自带的DDNS功能大部分家用路由器都内置了No-IP、DynDNS等客户端的填入口只要把账号和域名填上去路由器自己会定时更新。如果你想把控制权握在自己手里或者用了软路由、Linux服务器那就用脚本配合curl手动调API这样更灵活后期也方便给多个域名同时做更新。3.2 端口映射找到地址之后还要开对门DDNS解决的是“你家的地址在哪”但就算地址找到了路由器默认还会挡住所有从外面发进来的主动连接。数据包到了你家路由器路由器不知道该把它转给哪台内网设备所以默认直接丢弃。这时候要给内网设备开一扇门叫端口映射各家路由器菜单里也叫端口转发、虚拟服务器。举个例子。你家里的NAS内网IP是192.168.1.100NAS的管理页面跑在5000端口。你想从外面访问需要先在路由器上做一条规则把外部端口5000的所有TCP流量转发到内网192.168.1.100的5000端口。保存生效后别人访问你DDNS域名的5000端口路由器就会把请求送进NAS里。配置端口映射的时候有两条非常容易踩的坑。第一内网设备IP一定要固定。如果NAS的IP是DHCP动态分配的哪天租约到期换了新IP你端口映射里写的还是旧IP这扇门就等于开到了别人家。解决办法是在路由器DHCP设置里做固定地址绑定或者直接把NAS改成静态IP配置。第二不要图省事去做全端口映射。有些路由器支持把全部外部端口都转发给某台设备这在安全上等于把家里所有服务全部暴露。要用哪个端口就开放哪个端口宁少勿多这才稳妥。另外聊聊UPnP。有些路由器默认开启UPnP游戏机、NAS、摄像头等设备会主动向路由器申请端口映射用户经常没感知就已经开了门。它的麻烦在于设备自己“敲门”安全控制不在你手里也确实有人在这上面栽过跟头。我个人的习惯是关掉UPnP所有端口映射都手工配置这样家里对外开了几扇门、每个门通向哪里心里清清楚楚。3.3 IPv6直连运营商大内网之下的另一条路如果你测试后发现自己在运营商大内网里、没有公网IPv4先别急着放弃回头看一眼有没有IPv6。我前面提过现在很多运营商已经为家庭宽带分配了IPv6前缀只是光猫默认没开或者你压根没往那方面想。IPv6没有NAT的概念每一台设备都可以拥有全球唯一的公网IPv6地址数据包从外面直接进入到设备本身。想用IPv6做远程访问一般要过三关。第一关光猫和路由器都把IPv6功能打开。光猫通常在下发配置时已经支持路由器则需要在WAN设置里选择“Native/原生IPv6”或“DHCPv6”LAN侧开启IPv6地址分配。第二关确认内网设备已经拿到IPv6地址。在电脑上跑一下ip addr看到以240e、2409、2408、240b等开头的全局单播地址就说明已经拿到公网IPv6了。第三关设备防火墙要对所需的入站端口放行。因为IPv6没有NAT外面确实能找到你的设备但设备自身防火墙默认还是拒绝外部进站的这一条和端口映射一样重要。不过IPv6方案在实际使用中有一个让我头疼的问题很多远端网络本身只有IPv4比如你在外面连的手机流量可能还没有开放IPv6这就出现了“家里支持IPv6外面却没有IPv6地址”的尴尬局面流量根本没有路走过来。遇到这种情况就得回到IPv4框架下想办法。如果运营商一直不给公网IPv4最实际的办法就是借助内网穿透工具比如frp、ZeroTier这类组网方案让家里的设备主动向外网控制节点建立一条常驻连接再由控制节点帮你转发访问请求。这类工具原理不复杂把家里的服务地址映射到云端一台有公网IP的服务器上本质上是用一台有公网IP的机器做跳板把流量转进来。4. 服务商和硬件到底怎么挑不花冤枉钱的选型逻辑4.1 宽带线路怎么选才不容易出问题选宽带线路这件事多数人住进小区的时候就已经定了运营商很少有人会为了远程访问专门换宽带但如果你真的在意访问的稳定性签约前问三句话值得。第一句“我申请的这条家庭宽带能不能获取公网IPv4地址”注意不同地区的政策执行不完全一样同样是那个运营商有的城市可以申请有的城市直接拒绝客服的答复口径也经常变。所以这句话一定要在签约前或者续费前问清楚最好留个聊天记录或录音省得后面扯皮。第二句“我家上行速率是多少”大多数家庭宽带都是下行高、上行低比如500M下行配30M上行。远程访问家里NAS时你在外面拉数据用的是你家的上行带宽30M上行大概能跑到3MB/s左右传照片没问题传大文件就比较吃力了。如果你经常要远程下载家里的大文件上行速率是硬指标选套餐时候尽量挑上行高的。第三句“我可不可以多花钱单独买个公网静态IP”有些运营商会面向家庭用户提供静态公网IP增值服务价格因地区而异。如果预算允许这确实是最省心的方案因为一劳永逸。但大多数情况下你其实用不着为固定IP付费DDNS已经足够应付动态IP的变化。我的建议是先试水如果发现DDNS方案满足不了要求再说。4.2 DDNS解析服务商的选择标准和对比现在市面上的DDNS服务商五花八门怎么挑我一般会盯着这几个指标。第一是更新生效速度。你的公网IP变了之后从“检测到变化”到“域名解析刷新”越短越好。很多服务商提供1分钟TTL的记录更新能力也有免费服务只能做到几分钟甚至十几分钟。TTL就是域名解析结果在客户端缓存的有效时间TTL太长IP已经变了但全世界还记着旧地址访问自然失败。第二是API能力和自动化程度。好的服务商支持API操作记录更新方便你自己写脚本也支持路由器端直接内置集成。像No-IP、Duck DNS这些路由器上一般都有现成的选项配置几步即可。第三是免费额度和稳定性。我见过有些免费DDNS服务商过一段时间就删掉不活跃用户的域名或者强制你每隔几个月确认一次否则收回域名。如果你不想操这个心宁可花很少的钱买一个能长期稳定使用的域名和解析服务也别在免费服务上耗精力。下表是我个人常用的几种服务商定位供参考服务商适合场景主要特点路由器内置DDNS用户不想接触脚本配置最简单更新全靠路由器No-IP / Duck DNS日常远程访问免费域名可用路由器原生支持多阿里云解析 / DNSPod已有域名想自己全套控制API成熟TTL可以调到很低Cloudflare海外设备或全球访问解析节点多免费套餐够用4.3 路由器硬件别让一台旧设备拖垮整条链路很多朋友以为远程连不上是运营商的问题其实家里的路由器才是名副其实的重灾区。老旧的百兆路由器CPU性能差处理不了多少并发连接NAT转发性能也跟不上一旦你同时跑着下载任务和远程访问响应速度会明显下降。挑家用路由器我建议重点看这几个参数。第一个是NAT硬件加速。现在中高端路由都支持硬件加速转发开启后数据包处理不走CPU转发性能会高一大截。如果你打算长期做端口映射对外服务这一步很关键否则高负载时CPU占用过高延迟就上来了。第二个是内存和固件更新策略。内存低于64MB的旧路由器容易出现拨号后启动缓慢、端口映射规则多了之后不稳定等情况。尽量选固件更新勤快的品牌或者直接考虑软路由方案。软路由的好处是除了能跑PPPoE拨号和DDNS更新还能自己装各种服务缺点是配置门槛稍高。不愿意折腾的话买一台主流家用路由器配上原厂固件也完全够用。第三个是IPv6防火墙的可控性。我很在意路由器能不能分别针对IPv4和IPv6设置防火墙规则因为IPv6设备直接暴露在网络里没有防火墙保护会很危险。很多廉价路由器IPv6设置非常简陋要么全放行要么全关闭这时候就得看固件能力。5. 一套完整的实操记录从光猫桥接到远程登录5.1 需求与网络拓扑我拿自己家里一个实际的折腾案例来串联一遍。当时我的需求是家里一台群晖NAS需要在外网访问相册和管理页面同时有一台Linux小主机需要在外网SSH进去跑脚本。两者的共同点是都要从外部访问进来。网络拓扑很简单光猫改桥接模式——主路由拨号——交换机——NAS和小主机。最开始我也是直接用的运营商光猫拨号一体化方案后来发现光猫自带的DDNS选项少、IPv6防火墙设置不完整于是改成了让主路由拨号把所有网络功能集中到一台我自己完全控制的路由器上。这里有一个必须提醒的坑光猫一旦改成桥接模式原来由光猫拨号建立的所有上网会话都会中断如果你们家IPTV是绑定在光猫上拨号的改桥接后有可能直接没信号。所以动手前先确认自己的网络是否包含IPTV增值业务如果包含要么换一种方式要么在光猫配置里保留IPTV通道、绑定对应VLAN接口别一股脑全部桥接。5.2 光猫改桥接与主路由拨号第一步登录光猫后台。光猫的超级管理员账号一般不会印在设备背面的贴纸上普通用户账号进后台只能看几个基础页面改不了拨号模式。这时候通常需要找装维师傅要超级管理员账号或者问运营商客服申请。不同地区流程不一样有些地方师傅直接就给有些地方要走流程审批耐心沟通即可。第二步在光猫后台找到“WAN口设置”或“网络连接”把原来的PPPoE路由拨号模式改成Bridge桥接模式。这一步的类型选择很关键选错就上不了网。每个光猫界面语言不一样核心就是“让光猫不再负责拨号只做光电转换”。第三步在主路由的WAN口设置里选择PPPoE拨号输入宽带账号密码点击连接。有效果的话一两分钟内主路由就能拨上号WAN口会拿到一个公网IPv4或者至少是一个新的IP。如果拨号一直失败大概率是光猫侧没有完全改成桥接或者VLAN绑定留下了残留配置需要回到光猫检查。这三步做完网络的控制权就完全到你自己手里了。好处是路由器可以自由配置DDNS、防火墙、端口映射坏处是光猫有些管理功能会缺失比如通过运营商统一App远程管理光猫的能力可能就失效了。5.3 一个用No-IP和脚本更新DDNS的例子拨号成功后我选择了路由器自带DDNS功能来更新我的No-IP域名因为小米路由器后台直接支持填入账号密码就行。但如果你用的是纯Linux服务器或者软路由更通用的做法是自己写一个定时脚本。以No-IP的动态更新接口为例脚本逻辑非常简单#!/bin/bash NOIP_USER你的No-IP用户名 NOIP_PASS你的No-IP密码 NOIP_HOST你的域名.ddns.net # 获取当前公网IP CURRENT_IP$(curl -s https://ifconfig.me) # 调用No-IP更新接口 curl -u ${NOIP_USER}:${NOIP_PASS} \ https://dynupdate.no-ip.com/nic/update?hostname${NOIP_HOST}myip${CURRENT_IP}然后配合cron每5分钟执行一次*/5 * * * * /usr/local/bin/update_noip.sh注意脚本里每次调用都会向No-IP上报一次IP即使IP没变也会触发一次请求服务商会限制访问频率太高频可能被封。我实际测下来5分钟间隔是稳妥的。如果想更精细可以在CURRENT_IP和上次记录的IP相同时直接跳过curl请求减少不必要的调用。这里再补充一个重要细节公网IP如果很长时间没有变化DDNS服务商可能会认为域名失活有些免费服务会暂停域名解析。所以脚本加一个简单的日志输出偶尔检查一下是否还在工作比出问题后再排查省事得多。5.4 端口转发配置和真实访问验证DDNS更新完成后紧接着配置端口转发。我的规划是这样的群晖NAS的管理端口5000转发规则外部TCP 5000 - 192.168.1.100:5000Linux小主机的SSH端口22转发规则外部TCP 52222 - 192.168.1.101:22之所以外部SSH端口不直接用22是为了避开网络上大量针对22端口自动扫描的脚本。这种把外部端口映射成内网不同端口的做法非常常见能有效减少被无差别扫描命中的概率。同理NAS的管理页面我也建议改掉默认端口可以换成50000以上的高位端口虽然不能彻底防住扫描但至少能少很多噪音。配置完成后用手机流量验证一次比在局域网内测试更接近真实环境。先把手机Wi-Fi关掉再用手机浏览器访问“域名:5000”如果出现NAS登录页面说明链路通了。SSH则用手机终端工具连接“域名:52222”。这一步必须把Wi-Fi关掉测很多人在家里测了半天一切正常出门就失联原因就是家里测试时流量走的是局域网根本没有经过公网链路。验证通过后再做一次“断电重拨测试”把光猫和路由器全部断电等一分钟重新上电等拨号成功后观察DDNS域名是否能自动解析到新IP。我做第一次测试时旧IP和新IP之间有一段更新延迟导致大约3分钟内域名解析的还是旧地址。参考这个时间窗口以后遇到“域名连不上”时心里就有数了。6. 我踩过的坑常见故障排查与避坑技巧6.1 常见问题速查表把这些年最多遇到的故障整理成一张速查表按“症状-原因-解决路径”的格式来写方便你以后直接对号入座。症状常见原因解决路径域名能解析到IP但外网打不开端口映射缺失或目标设备IP已经变了检查路由器端口映射规则确认内网IP绑定光猫重启后访问失败过几分钟又恢复DDNS还没更新或者TTL缓存未过期脚本间隔改为更短或调低DNS解析TTL家里宽带只有IPv6地址外面却访问不了手机流量网络不一定是IPv6尽量配置双栈保留IPv4公网方案远程访问很卡图片加载缓慢家用宽带上行带宽太小降低传输清晰度或换更高上行套餐SSH端口提示连接超时但域名正常防火墙拦截了高位入站端口检查路由器和主机防火墙双向放行端口设备每天固定时间掉线运营商强制重新拨号刷新租约设置脚本定时自主重拨或申请静态IP这些情况里前三个占到了实际问题的八成以上。大多数情况下不是配置错了而是配置了一个时间段后就失效了根源是没有一套自动维护的机制。6.2 避坑心得端口、权限和日志都不能偷懒第一个避坑建议端口映射宁少勿多高位端口比默认端口安全得多。我在实测中见过有人把443、80端口的映射都开着以为这样访问方便结果日志里每天全是扫描和登录尝试。家用宽带的80和443端口在不少地区本来就有封禁限制外部访问不一定能成功开它意义不大。反过来把服务放到高位端口配合非标准端口访问风险会低不少。第二个避坑建议给内网设备做固定IP绑定这件事一定要在配端口映射之前做。DHCP分配的IP一旦变化端口映射规则就指向了一个不存在的设备访问自然失败。你在路由器后台把NAS和小主机的MAC地址与IP绑定好以后重启、断电、加新设备都不影响。第三个避坑建议日志不能只写不查。我给路由器配上DDNS脚本后养成了一个习惯每隔一两周翻一次脚本日志看看最近有没有更新失败。公网IP天天变是正常的一直不变反而说明脚本可能挂了。日志上能看到每次更新时的返回代码No-IP返回“good”代表更新成功“nochg”代表IP没变但请求成功看到其他返回码就要多留意。第四个避坑建议尽量不要把路由器后台账号密码设成和管理员admin一类的弱口令。你开了端口映射之后你的路由器管理端口虽然没有故意暴露出去但网络扫描工具随时可能探测到。给路由器换一个足够强的管理密码关闭远程管理端口这是最基础也最容易被忽略的一道防线。6.3 做一次彻底的链路验证最后分享我一个用了很久的验证套路。每次配置完一套家庭远程访问方案我都会按这个顺序走一次全链路测试在局域网内访问NAS和小主机确认服务本身正常。查看路由器WAN口IP记录当前公网IP。用手机流量访问“域名:端口”确认DDNS和端口映射同时生效。断电重启光猫和路由器等两分钟再重复第3步。检查DDNS服务商的解析记录确认IP已经变成新地址。这套流程三到五分钟能跑完但能帮你一次性把“服务本身、公网IP、DDNS更新、端口映射、防火墙放行”这几层全部验一遍。但凡其中哪一层有问题都能当场定位到具体环节。我做家庭网络排查这些年最深的体会是大多数远程访问失败根源不是靠一条神配置就能一劳永逸的而是因为网络环境本身是一个不断变化的系统。IP会变、运营商策略会变、设备固件会变唯一能对抗这种变化的是一套你能自己掌控、自动维护、出问题时有据可查的机制。先看清自己家的网络底细再按需求选最合适的方案最后配好自动更新和日志这套思路比任何单点技术都更值钱。
返回列表