ipv6+dhcp-dp+ndp+docker+dns
============================
https://github.com/lemonhall/vagrant_docker/blob/main/README_dhcp.md
环境
====
* fedora36物理机
* 5.18的内核
* docker官方版本
* 电信网络,ipv6全开,有LAN global,也大于/80,可以继续划子网
脚本
===
核心是check.py
逻辑大约如下:
1)检查当前物理机器的ip地址,写入一个文本文件,由crontab拉起(root),间隔时间内两者做对比,如果有任何变化:
2)打开/etc/docker/daemon.json文件,修改里面的fixed-cidr-v6值为prefix
3)prefix的计算,是将当前网络做/68级别的划分并取了第二个网段
4)如果有第二台物理机,安全起见,需要配置为第三个网段
5)重启docker的服务,这样所有容器重新启动,并获得配置好了的ipv6地址
6)修改/etc/ndppd.conf内rule的值,为prefix
7)同样的,重启
8)完成重启工作之后,获取docker所有的命名容器,并将name作为dns域名的二级域名,将ip地址作为AAAA记录的值上报
9)更新dns记录
ELSE:
什么都不做
这就是核心的逻辑
细节记录如下:
1) crontab里面的python脚本当中的os.system里面的命令必须写全,如/sbin/bash这样,否则会找不动命令
2) 和这个prefix值,取的时候确实相当啰嗦,本质上还是因为没有一个简单一点的命令,另外记住这里的interface的值是写死了的
3) 这里需要注意多台物理机器的话,需要变更n这个值,这个应该抽象到全局配置里面去的,这里使用了一个辅助库subnet-utils
4) 同上
5) 没什么可说的,就是sleep(5),这里使用了python的json库
6) ndp这个邻居发现协议,是很惊喜的,一开始我选用了之前ipv4一样的方案,在路由器上做静态路由,但是后来发现和v4的行为不一样,v6做了静态路由之后,确实可以正确得从外网访问,但是内网却不行了。另外想了想也不对,因为v6的地址本身都是动态的,所以我配置的不是一个私网地址,而这个地址,也是会变化的,也就是说,每次路由器重启或者租约过期的时候,这条静态路由就失效了。那还有什么意义?
结果发现了之前误解了ndp的意思,其实一个韩国人的文章里也提到了RA,但最后还是用的是ndp,这个协议是值得细细挖掘的,它的confg文件的意思其实和静态路由是一样的,就是对外声明了一件事,这个docker0网段上的东西,我负责,这个很方便,确实的。
这里使用了官方的fileinput库,很好用
7) 这里使用了systemdctl 来控制,这个新机制很友好,比之前的
8) CloudFlare这个库,还挺健壮的,这个就不多说了,还有docker的官方的python库获取容器基础信息
使用了venv的技巧,都在root用户下
mkdir ~/.venvs
mkdir ~/.venvs/docker
python3 -m venv ~/.venvs/docker
source ~/.venvs/docker/bin/activate
参考资料以及繁琐的实验过程可以参考,README_physics_host.md和READEME_ip_v6.md,以及README_ddns.md
### 安装
谈不上安装,这个脚本运行于/etc/dhcp之下,还有一个文本文件需要提前建立好,venv以及依赖需要提前pip好
二进制依赖主要有crontab,对应的fedora36的包,ndppd的安装,因为没有依赖dhcpclient,所以,那个东西其实不依赖
ip命令这些基础的网络包就不在说,ip 、ifconfig、netstat、route,这几个就不多说了
### SSL证书
certbot-dns-cloudflare.md
我使用了certbot+cloudflare的组合来生成全域名的证书,很方面,参考上面的的说明文件