iStoreOS 安装 DDNS-GO:动态 IP 也能远程访问家里设备

AI 摘要997笔记AI

文章讲在 iStoreOS 上安装 DDNS-GO,把会变化的公网 IPv4、IPv6 自动绑定到自有域名,并打通端口转发与防火墙放行,让 NAS、路由器后台、SSH、远程桌面真正可从外网访问。重点是装完后为何仍访问不了:IPv6 取错网卡、防火墙未放行、运营商封 80/443;同时强调无公网 IP 时应改用内网穿透,DDNS 帮不上忙。

此内容由AI根据文章内容自动生成。

家里宽带跑得好好的,某天出门想连 NAS,发现域名解析到了别人的地址——因为昨晚光猫重启,公网 IP 换了。IPv6 更夸张,运营商重拨一次,PD 前缀就变,家里所有设备的地址全跟着换。手动改解析不现实,DDNS 就是干这件事的:IP 随便变,域名永远指向最新的那个。

这篇讲在 iStoreOS 上装 DDNS-GO,把家里的动态 IPv4 和动态 IPv6 都绑到自己的域名上,再把端口转发和防火墙打通,让 NAS、路由器后台、SSH、远程桌面从外网真正可达。如果你家根本没有公网 IP(运营商大内网),DDNS 帮不了你,那种情况看 iStoreOS DDNSTO 教程:路由远程访问安装与网络配置,走内网穿透这条线。

这篇文章解决的问题

不是「怎么装一个插件」,而是「装完之后为什么还是访问不了」。很多人卡在三个地方:IPv6 拿错了网卡、防火墙没放行、运营商封了 80/443。这三处本文都会给具体做法。

一、先判断:缺 DDNS 还是缺穿透

DDNS 只做一件事:把「当前公网 IP」写进 DNS 记录。它不改数据通路,所以前提是外面本来就能连到你家。判断方法很简单。

1. 有没有公网 IPv4

在路由器上看到 WAN 口拿到的地址,同时用任意一台内网设备打开 https://4.ipw.cn 之类的地址查询页,两边一致就是公网 IPv4。如果 WAN 口是下面这些段,说明运营商给你套了一层 NAT(CGNAT),做端口转发没用:

  • 100.64.0.0/10:运营商级 NAT,家宽最常见
  • 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16:私网地址

2. 有没有公网 IPv6

看「网络 → 接口」里有没有 240e:(电信)、2408:(联通)、2409:(移动)开头的全局地址。IPv6 不走 NAT,有地址基本就能通,只是默认被防火墙挡在门外。国内三大运营商的家宽 IPv6 覆盖率已经很高,很多「没有公网 IP」的家庭其实有公网 IPv6,只是没人用起来。

3. 三种情况,三套方案

家里情况 该用什么 要点
有公网 IPv4(会变) DDNS-GO 解析 A 记录 + 端口转发 本文主线,最通用
只有公网 IPv6 DDNS-GO 解析 AAAA 记录 + 防火墙放行 本文第五节,不用端口转发
都是大内网 内网穿透(DDNSTO / frp / 异地组网) DDNS 在这一层帮不上忙

DDNS-GO 干活的流程其实很短:读当前 IP → 和上次比对 → 变了才去调服务商接口改记录。没变就不动,所以不会因为频繁请求被限流。

DDNS-GO 工作原理:检测公网 IP、比对、更新 DNS 记录
DDNS-GO 的工作链路:只改 DNS 记录,不动端口、不动内网

二、动手前的三样准备

1. 一个域名和它的 DNS 服务商

建议专门拿一个子域名玩这套,比如 nas.example.com,主域名以后换解析不影响。DDNS-GO 支持阿里云、腾讯云、DNSPod、Cloudflare、华为云、百度云、GoDaddy、Namecheap、EdgeOne 等二十多家,家里常用前四个。

2. 一套最小权限的 API 密钥

别拿主账号的密钥。按服务商各准备一份:

服务商 要什么 权限怎么给
阿里云 AccessKey ID + Secret 建个 RAM 子账号,只授予 AliyunDNSFullAccess,勾选「仅编程访问」
DNSPod / 腾讯云 ID + Token DNSPod 控制台「密钥管理」创建,只给需要解析的域名
Cloudflare API Token 模板选「编辑区域 DNS」,Zone 只勾目标域名

3. 路由器的系统时间要对

各家 API 都用签名校验,时间偏差超过几分钟就会返回 SignatureDoesNotMatch 之类的错误。iStoreOS 默认开了 NTP,一般没问题;如果你关过 NTP 或者路由器刚上电没联网,先在「系统 → 系统 → 时间同步」里刷一下。

三、在 iStoreOS 上装 DDNS-GO

1. 应用商店装(推荐)

iStoreOS 自带 iStore 应用商店,这是最省事的方式:打开 iStore → 全部软件,搜索 ddns-go,点「安装」。安装包由社区维护(作者 sirpdboy),装完会在菜单里出现入口。

iStore 应用商店中的 DDNS-GO 插件
iStore 里的 DDNS-GO:21 万次下载、944 次点赞,版本 6.12.2,网络 / 工具分类

装完从 服务 → DDNS-GO 进管理页(个别固件把它归在「网络」菜单下)。进不去就直接用浏览器打开 http://192.168.11.1:9876,把 IP 换成你路由器的 LAN 地址——DDNS-GO 本体固定监听 9876 端口。

2. 命令行装(商店没包或装不上)

DDNS-GO 是 Go 写的纯静态二进制,OpenWrt 上直接跑没问题。先确认架构,再去 GitHub Releases 下对应文件:

opkg print-architecture
# aarch64_generic / aarch64_cortex-a53  →  下 arm64 包
# x86_64                                →  下 x86_64 包
# mipsel_24kc                           →  下 mipsle 包

以 ARM 软路由为例(版本号换成 Releases 页面上的最新版):

cd /tmp
wget https://github.com/jeessy2/ddns-go/releases/download/v6.12.2/ddns-go_6.12.2_linux_arm64.tar.gz
tar -zxvf ddns-go_6.12.2_linux_arm64.tar.gz
chmod +x ddns-go
./ddns-go -s install

-s install 会把它注册成开机自启的服务。想改监听端口或同步间隔,装服务时带参数:

./ddns-go -s install -l :9876 -f 300

从 6.x 之前升级要注意

iStore 页面写得很清楚:6.x 之前的老版本升级需要卸载重装,直接覆盖可能读不了旧配置。重装前先把配置文件备份出来。

3. 首次进入要设密码

打开 http://路由器IP:9876,第一次会让你设置管理员用户名和密码。设完登录,界面里默认已经勾选「禁止从公网访问」——这个勾别去掉,9876 只在内网用。

密码忘了不用重装,命令行能重置:

cd /opt/ddns-go   # 换成你的实际安装目录
./ddns-go -resetPassword 新密码
/etc/init.d/ddns-go restart

顺带一提,群晖上跑 ddns-go 忘密码是另一套办法,改 yaml 就行,见 群晖 ddns-go 用户名密码忘记怎么找回。

四、五分钟配完:域名绑到家宽

DDNS-GO 的配置页看着项多,其实只有五项是必须填的,其余保持默认。

DDNS-GO 必填的五项配置:服务商、域名、获取 IP 方式、同步间隔、Webhook
五项必填:DNS 服务商、域名、获取 IP 方式、同步间隔、Webhook 通知

1. 填服务商和密钥

顶部选 DNS 服务商,比如「阿里云」,把 AccessKey ID 和 Secret 粘进去。保存时它会验证一次,密钥错会当场报出来,不用等日志。

2. 填域名

域名框里写 nas.example.com。多个域名用英文逗号隔开,一行一个也行;多个域名共用同一份解析值时,一次更新会全改掉,很省事。IPv4 和 IPv6 可以填不同域名(比如 v4.example.com 和 v6.example.com),调试时更容易分辨是哪条记录生效。

3. 选获取 IP 的方式

这是全篇最容易选错的一项:

  • IPv4 选「通过接口获取」:请求公网 IP 查询接口拿结果,默认地址就能用。某些接口国内访问慢或限流,可以换成 https://4.ipw.cn 这类。
  • IPv6 选「通过网卡获取」:IPv6 不能靠查询接口——那返回的是网站看到的出口地址,不一定是你家设备能被动访问的地址。必须从本机网卡上读。

4. 保存,看日志

点保存后等几秒,页面上方的日志会滚动输出。看到「IPv4 地址更新成功」这类提示就说明解析已经写进去了。之后每 5 分钟自动比对一次,IP 不变就不动。

验证解析是不是真的改了,别只看网页,直接查权威结果:

nslookup nas.example.com 223.5.5.5
# 查 AAAA 记录(Linux / macOS)
dig +short AAAA nas.example.com @2400:3200::1

TTL 设小一点,调试期少等十分钟

默认 TTL 常常是 600 秒以上,改完记录要等缓存过期才生效。调试阶段把域名 TTL 调到 60~120 秒,确认没问题再改回去,能省掉大量「明明改对了却打不开」的困惑。

五、IPv6 这一趟:AAAA 与三个坑

1. 前缀会变,后缀通常不变

运营商下发的是 PD 前缀,重拨就可能换一段。家用设备多半用 EUI-64 或 SLAAC 生成地址,后缀跟网卡 MAC 绑着,前缀换了后缀还在。所以「一个域名指向一台设备」在 IPv6 下是可行的,但前缀一变解析就得跟着更新——这正是 DDNS 要干的事。

2. 网卡这一项要选对

「通过网卡获取」的下拉框里会列出所有接口,选错了解析出来的就是内网地址或者 fe80:: 链路本地地址,外面永远连不上。判断规则:

家里怎么拨号 网卡选哪个 说明
iStoreOS 自己 PPPoE 拨号 pppoe-wan 最常见,地址直接挂在拨号口上
光猫拨号,路由当二级 wan 或 br-lan 取上游下发的全局地址,看哪个口有 240x 开头
DHCPv6 客户端模式 wan6 IPv6 地址在 wan6 这个别名接口上

拿不准就去「网络 → 接口」逐个点开,找那个有 240x: 开头 /64 或 /128 全局地址的接口。列表里出现 fe80: 开头的说明看的是链路本地地址,不能用。

3. 防火墙默认是拒绝入站的

IPv6 不需要端口转发(没有 NAT),但 OpenWrt 的 wan 区域默认 input 是 reject,外面主动进来一律被丢。要在「网络 → 防火墙 → 通信规则」加一条放行。命令行等价写法(把端口和设备地址换成你自己的):

uci add firewall rule
uci set firewall.@rule[-1].name='Allow-NAS-IPv6'
uci set firewall.@rule[-1].src='wan'
uci set firewall.@rule[-1].dest='lan'
uci set firewall.@rule[-1].proto='tcp'
uci set firewall.@rule[-1].dest_port='5001'
uci set firewall.@rule[-1].family='ipv6'
uci set firewall.@rule[-1].target='ACCEPT'
uci commit firewall
/etc/init.d/firewall reload

只想放行单台设备,可以在 LuCI 里把「限制地址」填成设备的 IPv6。但那串地址会随前缀变,维护起来很烦——更省心的做法见下一节,把入口收敛到路由器上做反向代理。

六、让外网真的能访问

1. IPv4:端口转发

解析通了只是第一步,数据要进得来还得做端口映射。图形界面在「网络 → 防火墙 → 端口转发」,uci 写法:

uci add firewall redirect
uci set firewall.@redirect[-1].name='NAS-5001'
uci set firewall.@redirect[-1].src='wan'
uci set firewall.@redirect[-1].src_dport='5001'
uci set firewall.@redirect[-1].dest='lan'
uci set firewall.@redirect[-1].dest_ip='192.168.11.10'
uci set firewall.@redirect[-1].dest_port='5001'
uci set firewall.@redirect[-1].proto='tcp'
uci set firewall.@redirect[-1].target='DNAT'
uci commit firewall
/etc/init.d/firewall reload

外部端口不必等于内部端口,比如外面用 15001、里面还是 5001,能少被扫一批。做多了端口记不住,可以看 Socat 端口转发:在 OpenWrt 上把 TCP/UDP 转明白,用一个入口把不同端口分给不同设备。

2. 多设备:别给每台机器开一个洞

家里 NAS、路由器后台、监控、下载机各开一个端口,暴露面会失控。三种收敛方式,按推荐程度排:

做法 长什么样 适合
子域名反向代理 nas.example.com、router.example.com 都指向路由,由路由上的 Nginx 按域名分流转发 设备多、想要一个 443 入口
不同外部端口 example.com:5001 → NAS,:5002 → 路由器 设备少,够用就行
先连 VPN 再访问 WireGuard 拨回家,内网地址随便开 只给自己用,安全最高

反向代理的最小配置长这样(Nginx,跑在路由器或任意内网机器上):

server {
    listen 8443 ssl;
    server_name nas.example.com;
    ssl_certificate     /etc/nginx/cert/nas.crt;
    ssl_certificate_key /etc/nginx/cert/nas.key;
    location / {
        proxy_pass http://192.168.11.10:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

好处是只需要在防火墙上开一个端口,新设备加一段 server 块就行;而且入口做了 TLS,内网设备本身可以是 http。证书走 DNS-01 验证申请,用的还是 DDNS-GO 那个 API 密钥,很适合家宽这种没有 80 端口的场景。

3. 四条安全底线

  • 9876 不对外:DDNS-GO 的「禁止从公网访问」保持勾选。真要远程管,挂在反代后面加一层认证。
  • 路由器的 80 / 22 不要映射出去:管理面暴露在公网,被爆破只是时间问题。SSH 用密钥登录,参考 群晖公钥私钥登录 SSH 的教程,思路通用。
  • 选高位端口:家宽的 80、443、8080 大概率被运营商封了,用 8443、15001 这类,映射出去能通。
  • NAS 自身加固:关掉默认 admin、开二次验证、限制登录失败次数。DDNS 只是把门牌号固定了,门锁还得自己上。

在家用域名打不开?是 NAT 回环

很多固件的端口转发不支持 hairpin NAT:出门用域名能连,坐家里用同一个域名反而失败。这不是 DDNS 的问题,临时用内网 IP 访问即可;想彻底解决要在路由器上做 DNS 劫持,把域名在内网解析到内网地址。

七、排错对照表

DDNS 这类问题基本集中在「记录没更」「更了连不上」两类,按现象对照查比较快。

现象 常见原因 怎么处理
日志说「未改变」,但 IP 明明变了 查询接口返回的地址不对,或走了代理 换个 IP 查询接口;IPv6 改成网卡方式
报 403 / SignatureDoesNotMatch 密钥权限不足、系统时间偏差 核对 RAM 授权范围;同步 NTP
解析更新了,外面还是连不上 端口没映射、防火墙没放行、运营商封端口 先内网测服务,再从 4G 网络测端口
只有 IPv6 能通 IPv4 本身是 CGNAT 正常,走 IPv6 或内网穿透
重拨后十几分钟才恢复 同步间隔 5 分钟 + TTL 缓存 缩短间隔、降低 TTL
手机流量能通,公司网不通 公司网络只有 IPv4 或封了端口 换 IPv4 域名,或换端口
解析到了 fe80:: IPv6 网卡选错 改选有 240x 全局地址的接口

八、进阶:一域名多用 + 通知

1. 子域名分设备

在域名框里填 nas.example.com,ssh.example.com,cam.example.com,一次更新三条一起改。配合上面的反向代理,每个子域名对应一台设备,出门记一个域名就够了。

2. IP 变了推个消息

Webhook 里填 Bark 的地址,IP 变化时手机直接收到通知:

https://api.day.app/你的KEY/家里IP变了/#{ipv4Addr}/#{ipv4Result}

Bark 的路径依次是「标题 / 正文」,中文会自动编码;Bark 的路径依次是「标题 / 正文」,中文会自动编码;钉钉、飞书、Server 酱、PushPlus、Discord 的模板官方 README 里都有,RequestBody 留空就是 GET 请求,填了 JSON 就按 POST 发。变量支持 #{ipv4Addr}、#{ipv4Result}、#{ipv6Addr}、#{ipv6Domains} 等。

3. 同步频率别乱拉高

默认 5 分钟一次,对家宽足够。想做到「IP 一变就更新」,别把间隔压到 10 秒——那是让接口被限流的写法。官方给的折中方案是「勤检查、少比对」:

./ddns-go -s install -f 10 -cacheTimes 180

意思是每 10 秒看一次本机 IP,每 180 次(半小时)才去服务商那边比对一次,变化能立刻发现,又不会把 API 打爆。

4. 换设备时记得备份

配置就一个 yaml 文件,默认在 ddns-go 的工作目录里(.ddns_go_config.yaml),里面有密钥和域名。换路由器、重刷固件前把它拷出来,恢复时放回去再启动服务就行。用 -c 参数可以把配置放到你想放的位置,放在持久化分区更稳。

九、装完之后

到这里,家里的动态 IPv4 和动态 IPv6 都已经绑在域名上了,端口通、防火墙放行、入口收敛到反代,剩下的就是把这些入口用起来:

最后提醒一句:DDNS 解决了「地址会变」,解决不了「安全」。公网可达的设备越少越好,能走 VPN 的就别开端口,能放反代后面的就别直接暴露。家里的网络一旦被扫到,脚本爆破是 24 小时不停的。

上一篇 Socat 端口转发:在 OpenWrt 上把 TCP/UDP 转明白