步骤/目录： 1.背景介绍 2.测试IPv6 3.购买域名，DNS解析 4.安装ddns-go 5.端口被封禁的解决方法 6.安全措施 7.进阶搭配使用本文首发于个人博客https://lisper517.top/index.php/archives/246/，转载请注明出处。本文的目的是使用 IPv6 + DDNS 以访问内网ubuntu机器。本文写作日期为2024年1月4日，主要参考了 这篇文章 。1.背景介绍在以前的文章中，笔者介绍过frp，也介绍过DDNS。通过frp，购买一台有公网IPv4地址的云服务器，可以将内网机器开放到公网，还可以搭配NPM给内网机器分配不同的子域名。缺点有：（1）服务器成本；（2）如果被封禁80、443端口，需要换ip，但除了vultr等少数厂商外，很多厂商都不能免费换ip；（3）受服务器网速限制，家里的上传带宽一般都不能跑满。优点则是：（1）内网机器不直接暴露端口，获得了一层额外的保护。DDNS（动态DNS），如果你有幸获得了公网IPv4地址（前几年的电信据说比较容易获得），一般是一个动态的公网v4，每次拨号都会变化。通过DDNS，一个固定域名可以与你每次都不同的v4地址绑定，从而方便使用。参考 路由器与DDNS 。随着IPv6的普及，现在基本上一半的网址都能通过v6访问（手机基本上都支持v6）。由于v6能提供的地址太多，协议也比较新鲜，美国暂时没有管制v6发放，现在使用v6的机器都能分配到公网v6地址。但是v6地址太长且经常变化，使用不方便，所以需要搭配DDNS（动态DNS）使用。最后需要提醒，v6 + DDNS 的方案会将内网机器直接暴露到公网，所以一定要设置好防火墙。对于linux系统，这里推荐ufw防火墙（见 ufw简介与树莓派安装ufw ）和fail2ban端口封禁（见 Fail2ban提升服务器安全性 ）。2.测试IPv6第一步确认自己的路由器、光猫能否访问IPv6。先到光猫、路由器后台找到v6相关设置，把v6打开，如果路由器自带v6防火墙可以暂时先打开。然后访问 IPv6 连接测试 和 ddnspod提供的v6检测 （如果有代理，此时需要关闭代理），正常情况下会显示电脑的v6地址，并且结果相同。接下来最好把光猫改桥接，因为光猫的性能较差，而且光猫的防火墙喜欢拦截入站的v6请求。直接打电话给运营商转人工服务，要求光猫改桥接，几分钟就好了。如果不知道自己的宽带账号密码，可以顺便问一下。接着到主路由管理页面，上网方式从DHCP（或者静态IP）改到PPPoE，输入宽带拨号的账号密码即可。另外，ipv6、ipv4的DNS也可以手动改一下，以缓解DNS污染，这里提供cloudflare和google的：cloudflare: 1.1.1.1；1.0.0.1 2606:4700:4700::1111 2606:4700:4700::1001 google: 8.8.8.8；8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844路由器PPPoE能成功上网后，查看路由器的v6地址，复制到 IP查询 ，看一下路由器是否公网v6，也可以在cmd中 ping -6 你的v6地址 能否ping通，不是的话可以先关闭路由器防火墙，还是不行的话问一下运营商。最后，在浏览器访问路由器的v6地址（注意网址栏的v6地址要用 [] 括起来），应该能看到路由器的登录界面。显示 ERR_CONNECTION_REFUSED ，那一般是防火墙的问题。这里如果看不到也没关系，后面的方案是把内网的其它机器开放而非路由器开放到公网。3.购买域名，DNS解析以下购买域名的厂商称为域名厂商，提供DNS的厂商称为DNS厂商。购买一个自己的专属域名，最便宜的依然推荐 namesilo ，因为没什么套路，域名续费也很便宜。如果不会用namesilo，也可以在cloudflare、阿里云、腾讯云等购买，当然可能会稍微贵一点。普通的top域名一般一年在￥9.9-99比较合理。如果在namesilo购买域名，还要设置一下DNS解析，因为namesilo的DNS不是很给力。把DNS服务器修改到DNS厂商，笔者最推荐cloudflare。然后转到DNS厂商，把域名解析到路由器的v6地址进行测试（cloudflare），等几分钟（解析记录需要几分钟扩散），浏览器访问该域名，也许能看到路由器的登录页面（看不到也没关系）。最后，登录到你的DNS厂商，获得一个token令牌。以阿里云为例，在头像处的下拉菜单中找到AccessKey，创建一个，保存好（忘记保存就再创建一个），AccessKey ID相当于用户名，AccessKey Secret相当于密码。各家DNS厂商可能有一些细小的区别，其它厂商可能叫token令牌、API之类的。总之它会给你一串只出现一次，但可以重复创建的字符作为令牌，用令牌可以对接认证到该厂商进行一些服务。权限最高的称为全局令牌，只拥有某些权限的是局部令牌或者子令牌，一般来说尽量用局部令牌，并且令牌要严防泄露，如果不小心泄露了要及时重新创建。4.安装ddns-go路由器每次重启获得的v6地址都会变化，即动态ip地址，家庭内的其它电脑也一样。现在需要的最后一步就是让电脑每次开机时，通过token对接到DNS厂商，更改DNS解析，将你的域名解析到新的v6地址。好在这一步有现成的工具，即 ddns-go 。接下来就演示在linux下，通过docker安装ddns-go。另外提醒一下，群晖、win、mac也是可以用ddns-go的。需要说明的是，一些路由器也可以进行类似的操作，把路由器暴露到公网。笔者不推荐这样做，因为一般都需要刷固件、新手容易刷坏，而且路由器设置防火墙也稍微要复杂一点。如果想折腾，可以到 恩山论坛 看看有没有自己路由器对应的教程。安装好docker、docker-compose后（参考 Docker入门（一） 和 Docker入门（二） ），在linux上如下操作：mkdir -p /docker/ddns-go/conf/ddns-go cd /docker/ddns-go vim docker-compose.yml写入以下内容：version: '3.8' services: ddns-go: image: 'jeessy/ddns-go:latest' container_name: ddns-go network_mode: host volumes: - /docker/ddns-go/conf/ddns-go:/root restart: always用ufw打开ddns-go使用的9876端口，并运行ddns-go：ufw allow 9876 comment "ddns-go" ufw status docker-compose config docker-compose pull docker-compose up然后网页访问 linux机器ip:9876 ，配置一下。ddns-go的配置比较简单，选一个DNS厂商（也可以多个DNS厂商配置都针对一条解析，能提高解析传播速度。目前支持 Cloudflare、阿里云Alidns、腾讯云Dnspod、华为云、Callback、百度云、Porkbun、GoDaddy、Google Domain），填入该厂商的token，关闭v4，开启v6即可。等待几分钟到半个小时后，通过公网访问该linux机器的网页服务或者SSH测试，记得打开端口。5.端口被封禁的解决方法笔者发现IPv6的80和443被封禁了，但其它端口还能访问。具体表现为内网能通过域名访问，外网不行（但外网ping又能获得正确的IPv6地址），如果把网页服务改到其它端口则外网能访问。解决方法见 可视化管理Nginx-Nginx Proxy Manager 。6.安全措施最后提醒，v6 + DDNS 会将内网机器端口直接暴露到公网。笔者建议的安全措施如下：（1）设置复杂密码。担心记不住密码，浏览器可以记忆，或者用vaultwarden等密码管理工具（参考 VaultWarden ）。（2）SSH设置仅密钥登录，并且密钥设置密码。（3）su用户和sudo用户分开。su指切换用户的权限，sudo指执行命令权限，这样的话即使密钥泄露，登录以后还是要通过密码切换到sudo用户才能执行其它命令。（4）用好ufw（见 ufw简介与树莓派安装ufw ，推荐用 ufw allow from 192.168.1.0/24 to any port 22 这样指定来源ip的形式），fail2ban（见 Fail2ban提升服务器安全性 ）。同时也要理解frp这类穿透能无视ufw。（5）用好docker，做好备份。（6）设置非常规端口，或者更进一步用NPM等反代工具（只需要暴露80、443，扫端口的一般不会去猜子域名）。当然，v6因为地址太多了，其实被扫IP的风险相比v4已经大大降低。7.进阶搭配使用（1）NPM，方便管理各种子域名，见 可视化管理Nginx-Nginx Proxy Manager 。（2）如果要将内网的其它机器也通过该linux机器开放到公网，可以使用 NPM + frp ，也就是开放的机器作frps，其它内网机器为frpc。
步骤/目录： 1.DDNS简介 2.获取域名 3.配置路由器 4.配置端口转发 5.配置光猫 6.DDNS的安全性本文首发于个人博客https://lisper517.top/index.php/archives/54/，转载请注明出处。本文的目的是介绍DDNS，并在路由器上使用DDNS，以达到访问内网设备的目的。本文写作日期为2022年9月30日。1.DDNS简介想要从公网访问自己的电脑或其他设备，笔者之前的文章中曾详细介绍过frp内网穿透，它的使用流程大概是：购买一台有公网IP的云服务器，在云服务器上运行frps，在需要从公网访问的机器上运行frpc，运行frpc时是将一个或多个内网机器的端口投射到云服务器的端口上，比如多个内网机器的22端口都需要开放到公网，那云服务器自己占一个22端口，其他机器就用云服务器的122、222、322等端口。frp是中心化的，优点是你可以将多个不同局域网（比如你在两个地方各买了一套房子，或者其他情况下不得不把需要投射的机器放在几个不相连的局域网中）的机器端口投射到同一个公网ip，安全性也有保障（如果你会设置tls、双向认证的话）；缺点是带宽等于云服务器的带宽，而云服务器的带宽常常不够用，可能只有 5 Mbps 这种速度（ 625 KB/s ），想看看家里的监控都有点卡。本文介绍的DDNS则是另一种路线，使用流程为：向网络运营商申请公网ip（这个公网ip在每次拨号时都会变化，不是固定的。另外，据说电信的公网IP最容易申请，联通次之，移动基本不可能），到DDNS服务商处申请一个域名，在需要开放到公网的机器上安装DDNS客户端即可。它的原理是，每次装有DDNS客户端的内网机器联网时，都会要求DDNS服务商把你的域名解析到这台机器的公网ip上（所以虽然每次拨号时公网ip可能变化，但都能通过域名确定公网ip）。在实践中，一般这个开放到公网的机器是路由器，因为它开机时间长、不怕断电，能把连到路由器上的其他内网机器的端口投射到路由器上，而且现在很多路由器都自带DDNS客户端支持。DDNS是以域名为中心的，优点是网速可以很快，只和你的路由器速度、宽带（百兆还是千兆）相关；缺点是域名选择比较少（但是花一些钱，也可以把DDNS的域名设置为自己的域名，比如下文的no-ip是29.95$/年），所有要投射的机器都要在同一个局域网下，而且安全性上需要一点注意（在openwrt等固件上可以设置DDNS用HTTPS加密，但是路由器自带的固件很少有支持这个的）。申请公网ip这一步，你需要找到当初帮你装宽带的师傅，或者你这一片区的网络负责人，可以告诉他家里要装监控，想申请一个公网ip，如果是电信、联通的基本都会帮你开。另外据说尽量不要通过10000或10010找师傅，因为这样算投诉、要扣工资，而是应该留一个师傅的私人电话或微信联系。本文中，选择红米AX6S路由器，它自带支持花生壳（oray.com）、公云（3322.org）、 dyndns.com 和 no-ip.com 这四家DDNS服务商，其中笔者选择 no-ip.com ，很多路由器都支持 no-ip.com 。不过路由器支持最多的还是花生壳，可惜比较贵，而且用花生壳据说需要提交身份证信息。如果你想跟着本文实操，最好买一样的路由器，或者自己去找支持DDNS的路由器（同时还需要支持端口转发，一般支持DDNS的路由器都支持端口转发），查看该路由器支持哪些DDNS服务商；不要买太便宜的路由器了，两三百还是要出的，表示一下起码的尊重，如果一切顺利，你需要花钱的地方只有买路由器这一步，原本的路由器就支持DDNS的话甚至可以不用花钱。2.获取域名进入 https://www.noip.com/ ，右上角用自己的邮箱注册一个免费账号（高级账号有一些额外功能，但是这里就用免费账号演示一下），注册的时候可以先不填域名。登录后自己跳转到 https://my.noip.com/ ，点击左侧的 Dynamic DNS -> No-IP Hostnames ，点击 Create Hostname ，这里需要输入自己的域名、选择后缀域名，最后的样子是 自己的域名.后缀域名1.后缀域名2 ，意思就是比如 www.bing.com ，这3者当中你能随意改动的只有 www ； bing.com 则是固定的，不过还是可以有几种选择。自己的域名最好独特一点，否则路由器下线的时候这个域名可能被别人注册（虽然概率极低）；后缀域名最好先试试能否访问，有些后缀域名因没有备案而无法访问。接下来点击右侧的 Account -> Account Info ，在 Basic Info 里把Username改一下。这个用户名和密码要记住，设置路由器要用。然后在右侧点击 Account -> Security ，有个二维码，下面有这样一段文字：Account: No-IP.com: 你的邮箱 Key: 你的密钥 Type: time-based这个密钥最好记一下，本文中不需要用，但有些时候可能有用。最后提醒，由于这是no-ip的免费DDNS服务，每30天你会收到一封邮件要求再次激活一下，但这个激活不算太麻烦。如果免费DDNS玩熟练后需要额外功能，请升级到no-ip的高级账号（1.99$/月，后缀域名比免费账号的选择更多）或最高级账号（29.95$/年，可以完全用自己的域名）。3.路由器设置以红米AX6S为例，就用原版固件、不用openwrt等其他固件（目前AX6S的openwrt固件用来看视频还行，玩一些在线游戏就会偶有断网，而且笔者对AX6S开SSH、刷其他固件的需求不强），在 高级设置 -> DDNS 里点击 添加服务 ，选择 no-ip ，用户名密码就填刚才的Username和你自己的密码，主机名称为你选的域名，状态检查和强制更新随便，比如填成5分钟和6小时。最后确定，路由器会尝试连接，等待几秒后 状态 变为绿色的 连接正常 ，就行了。如果是红色的 连接失败 ，就检查一下有没有填错的地方，等一会儿再尝试连接一下，直到成功。另外在 常用设置 -> 局域网设置 -> DHCP静态IP分配 里，把连到路由器的所有机器的内网IP都固定一下，这样转发端口的时候不会乱。最后是一些AX6S的其他推荐设置。在 常用设置 -> 上网设置 -> 上网设置 里，选择 手动配置DNS ，填入Google的两个DNS： 8.8.8.8 和 8.8.4.4 ；开启 IPV6网络设置 ，同样 手动配置DNS ，填入Google的IPV6 DNS服务器，即 2001:4860:4860::8888 和 2001:4860:4860::8844 。然后看看配置的效果，访问 http://test-ipv6.com/ （这个网址挺不错，还可以检测自己能否访问ipv6网址），看一下自己的ipv4地址、ipv6地址。最后提一嘴，在现在的主流浏览器上，比如chrome、edge这些，要访问ipv6的IP而不是域名（解析到ipv6地址的域名）的话，用 https://[ipv6地址]:端口号 类似的格式，比如 http://[2001:4860:4860::8888]:80 （这个网址访问不了，只是举个例子）。4.配置端口转发配置到这里，理论上说已经可以通过域名访问自己的路由器及内网机器了（但是可能只在局域网内，这将在后面说明），我们下面来实验一下。首先是路由器的管理页，你访问 选择的域名 （比如 test.ddns.net ），应该就能访问到路由器登录页面，这已经说明成功了。如果需要进一步实验，把内网机器的端口开放到公网，就要配置端口转发，在AX6S的 高级设置 -> 端口转发 里。以树莓派为例，我想用realvnc访问树莓派桌面，realvnc使用的是5900端口，那么可以新建一个端口转发规则，名称可以写成 pi-realvnc ，外部端口比如是56789，内部ip地址为树莓派连到AX6S后的内网ip，内部端口为5900，然后把树莓派的5900端口打开，在realvnc的客户端里，ip填 选择的域名::56789 ，连接即可。再以笔者之前文章提到的samba（一种NAS的搭建方案）为例，它使用的是445端口，那么ip填运行samba的机器的ip，内部端口填445，外部端口也填445（你也可以填其他外部端口，只是用windows连NAS稍微麻烦一点），在samba客户端中，比如windows机器上，访问 //选择的域名/... 即可。其他就不再举例了。总之，搞清楚自己想开放的机器的ip，搞清楚需要开放哪一个或几个端口，就能非常轻松地从外网访问到自己的内网机器。5.配置光猫如果你家里是通过路由器拨号连到外网，那么就可以跳过这一步；如果你家是通过光纤连光猫（EPON、GPON），然后连到下级路由器上，则此时这个域名只能通过内网访问。具体可以查看AX6S的DDNS设置界面，如果 WAN口 IP 是 192.168. 开头的，那就说明只能内网访问；或者可以到 no-ip官网 ，登录自己的账号，可以看到自己的域名， IP / Target 对应的是 192.168. 开头。这是因为虽然你的光猫能获取一个动态的公网ip，但路由器拿到的是内网ip，在路由器上进行DDNS配置也是把域名解析到一个内网ip，自然无法在外网访问。接下来就需要对光猫和路由器再进行一些设置，但下面的步骤笔者并未进行实操。光猫的设置方法比较多变，建议自行搜索（搜索 光猫型号+超级密码 ），这里以TEWA-708E这个型号的光猫为例：首先去光猫背面查看用户名和密码（或者你自行更改过密码，则是自己改的密码），然后访问光猫的ip，比如 192.168.1.1 ，但是这个ip可能只是一些基础设置，对TEWA-708E这个型号需要访问 192.168.1.1:8080 ，用户名密码是一样的。接下来的操作需要你知道自己上网拨号的账号、密码。在 状态 -> 配置向导 里把光猫的工作模式从 自动拨号 改成 桥接模式 ，这里也能看到上网拨号的账号。然后是AX6S路由器，登录管理页面后，在 常用设置 -> 上网设置 -> 上网设置 里，把DHCP改成PPPoE，账号密码就是你上网拨号的账号密码。简单来说，DHCP是由上级的路由器或光猫等给自己分配网络，PPPoE则是自己拨号上网。成功配置后，在上面的上网信息里，应该能看到 IP地址 从 192.168 开头变成一个公网ip，你可以网页访问 https://www.whatismyip.com/ 或 https://www.ip138.com/ 或 http://www.test-ipv6.com/ 看看这三个网站显示的IPv4地址和AX6S路由器上显示的IPv4地址是否相同。在AX6S的DDNS设置里，也能看到 WAN口 IP 变成了这个公网ip。再等待3~10min（如果用的不是no-ip，有时可能要等30min），当DNS服务器里都把你的域名解析到路由器的这个动态公网ip后，就能通过域名访问到自己的内网。最后提一下，很多光猫有一些隐藏功能，比如TEWA-708E这个型号，你还可以访问 http://192.168.1.1:8080/scdmz.html 这个页面来配置DMZ。DMZ功能需要输入一个ip，光猫会把所有端口的流量都转发到这个ip上，相当于转发所有端口。还有开启telnet（ssh），详情参考 这篇文章 。6.DDNS的安全性前面也提到过DDNS的安全性上需要一些注意，下面主要给出4点建议：定期更换域名，或者定期更改路由器的登录密码（设置的复杂一点）。一般情况下，国内的网络会屏蔽80、443端口，大家可能会把路由器的管理页面放到其他端口。虽然概率不大，但路由器长时间开着，总有些人会用一些脚本扫描no-ip的各种域名或ip，万一不巧扫到你的，他又恰好扫描端口到路由器的管理页面，一个一个试你的密码，说不定就给你试出来了。从内网登录路由器后台。不要在公网登录路由器，因为用的http是不加密的。笔者的解决方法是在端口转发规则里常备一个树莓派的22端口、5900端口转发，需要的时候先ssh登录树莓派、临时打开5900端口，用realvnc的客户端登录树莓派的桌面，浏览器访问192.168.31.1登录小米路由器后台，从内网这里操作路由器页面。这也是对上面一条的补充，因为你并没有在外网改端口开放路由器的管理页面，更安全。使用非常规的端口。在转发端口时，内网机器的端口号可以不改，路由器开放的公网端口建议要改一下（前文中的5900改成56789），而且在1~65535这个范围内尽量大一点，这样别人扫到端口的几率会降低，而且就算扫到也猜不到是用来干什么的。最后，你转发端口时也要注意你的这些服务是否加密，比如SSH就是安全的，realvnc也在传输层有加密，samba用的是用户名密码认证，也算是安全的（只是建议定期修改密码）；如果是redis的6379端口，则不应该直接开放到公网，而是要设置一下redis的tls加密才敢放开。有些路由器的DDNS支持在最外层用https加密，也可以打开，但是需要在DDNS服务商处有一些其他设置或收费。