步骤/目录:
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。

标签: docker, DDNS, ddns-go

添加新评论