最近想在自己的Linux虚拟机里搭建Code Server,这样上课时就可以远程连接到虚拟机并编写代码。现在有公网IPv6环境,需要进行DDnS。
首先踩的第一个坑是路由器的防火墙,只能网上搜索解决方案,八仙过海各显神通。(小插曲:本来想拆开路由器,用串口来获取路由器的控制台的,但是网上的教程居然没提到这路由器有两颗隐藏螺丝锁住外壳,致使我把路由器外壳拆裂了)
然后是虚拟机的防火墙规则太严格,导致不能通过SLAAC分配IPv6地址,应当放行ICMPv6的nd-router-advert(SLAAC)和nd-neighbor-socilit(类似ARP),分别接收地址前缀,以及公布自己的IPv6地址给局域网设备。因为对IPv6不了解,设置了严格的防火墙(以为阻挡ICMPv6不会导致类ARP的协议被阻挡在外),导致一直没有地址或者无法访问。
接着就可以DDnS了,使用以下命令可以获取公网IPv6地址:
ip -o addr show | grep inet6 | grep "scope global" | grep dynamic | grep temporary | grep -m1 -oE "([0-9a-f]{1,4}:){7}[0-9a-f]{1,4}"
编写脚本完成DDnS。
还有无443和80端口完成基于acme协议的证书自动更新,基于certbot可用–manual-auth-hook选项,这个选项指定一个脚本,在更新证书前执行此脚本协助验证域名所有权,certbot会传入CERTBOT_VALIDATION环境变量作为需要设置的DNS值,DNS键名为_acme-challenge.域名(TXT类型),利用API更新DNS记录后再等待一会(以便DNS的修改传达到世界)即可成功更新证书。
先大概写个草稿,细节日后补充。