前言
之前捣鼓了很久,NAS基本运行起来了,但是还存在证书信任等问题,非常烦。问了GPT,提供了一个ZeroTier + Pi-Hole + Caddy的网络方案(不得不说,科技改变生活)
重置服务器
删除证书
mkcert -uninstall cd /etc/ssl/certs rm xxxx.pem # 删除空的根证书软链接 rm xxxx.0 # 删除空的根证书hash软链接 rm -r ~/.local/share/mkcert
清理docker
sudo docker stop xxx # 停止所有容器(除了dae) sudo docker container prune # 删除停止的容器 sudo docker network rm nextcloud-aio # 删除虚拟网卡 sudo docker volume prune --filter all=1 # 删除空挂载卷 sudo docker image prune -a # 删除无活动镜像
清理文件
sudo rm -r /mnt/ncdata/ftp sudo rm -r /mnt/ncdata/nextcloud sudo rm -r ~/xxxx # 清理home目录下相关文件
安装ZeroTier
介绍
ZeroTier是P2P VPN,利用在互联网中构建一个虚拟局域网来实现组网。
一般情况下ZeroTier使用UDP进行打洞(先利用共同的通信服务器交换两台设备的链路信息,然后两台设备利用信息实现直连),实现内网直连;UDP打洞失败情况下会使用TCP中继。
ZeroTier除了官方实现外,还有很多第三方控制器,用以解除对设备数量的限制。这里我选择的是imashen/zerotier-aio,集成了ZeroTier 1.14.0、ztnui和planet构建工具
安装
拉取镜像
sudo docker pull imashen/zerotier-aio
运行容器
sudo docker run -d -p 9993:9993/udp -p 3443:3443 -p 3180:3180 \ -v zerotier-one:/var/lib/zerotier-one \ -v zerotier-webui:/www/zerotier-webui/etc \ -v zerotier-logs:/logs \ -e ZEROTIER-WEBUI_PASSWD=<password> \ -e MYADDR=<outter-network-ip> \ -e MYDOMAIN=site.home \ --name zerotier-aio \ --restart always \ imashen/zerotier-aio # 9993是ZeroTier打洞端口,3443是面板https端口,3180是http服务器端口 # 该容器需要有公网ip,作为整个局域网的控制器和根节点(可选) # 迁移只需复制三个卷
访问https://本机ip:3443
默认用户名admin,密码为设置的密码,如果密码太弱会被自动更换,需要进入容器日志查看
sudo docker exec -it zerotier-aio /bin/bash cd /logs cat zerotier-webui.log
新建一个网络->easy setup,生成网络IP池
进入IP池,创建一个/80的ipv6 IP池
进入ipv6选项,勾选自动分配及6plane
进入路由选项,填入ipv6子网,路由留空
在其他ZeroTier客户端,加入该网络,启用DNS,全局ip和默认路由
zerotier-cli join <networkID> zerotier-cli set <networkID> allowDNS=1 zerotier-cli set <networkID> allowGlobal=1 zerotier-cli set <networkID> allowDefault=1
加速
进入zerotier-zio容器,配置planet
sudo docker exec -it zerotier-aio /bin/bash mkplanet -b2j # 在roots中配置,配置项为{"identity": "zerotier-id", "stableEndpoints": [ipv4/zerotier-udp-or-tcp-port, ipv6/zerotier-udp-or-tcp-port]},最多四个 vim planet.json mkplanet -j2b
将生成的planet文件替换客户端下planet文件,重启zerotier服务,可以将planet文件放在/www/zerotier-webui/etc/myfs/下供客户端下载
Linux:/var/lib/zerotier-one
Windows:C:
MacOS:/Library/Application Support/ZeroTier/One
安装Pi-hole
安装
拉取镜像
sudo docker pull pihole/pihole
停止系统默认域名解析服务
sudo systemctl stop systemd-resolved vim /etc/systemd/resolved.conf # 解除注释DNSStubListener,并改为no sudo systemctl restart systemd-resolved # 用/run/systemd/resolve/resolv.conf替换软链接/run/systemd/resolve/stub-resolv.conf sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
运行容器
sudo docker run -d \ --name pihole \ --cap-add=NET_ADMIN \ --restart always \ -p 53:53/tcp -p 53:53/udp -p 8000:80/tcp \ -e TZ=Asia/Shanghai -e WEBPASSWORD=<password> \ -v etc-pihole:/etc/pihole -v etc-dnsmasq_d:/etc/dnsmasq.d \ pihole/pihole # 80是面板入口,需要修改映射以防端口冲突
访问http://宿主机ip或zerotier虚拟ip:8000/admin,登录面板
在Local DNS->DNS Records中添加自定义域名(节点名称.域名)及对应的zerotier虚拟ip4和ipv6(dae需要)
在Settings->DNS->Interface settings中,选择Permit all origins
在ZeroTier自建控制器中设置网络的dns,域名填写和pihole中的一致,ip填写pihole所在节点的虚拟ip
在dae中配置代理自建DNS
# 添加合并内容 dns { upstream { piholedns: 'tcp+udp://zerotier虚拟ip:53' } routing { request { qname(suffix: 你的域名) -> piholedns } response { upstream(piholedns) -> accept } } } routing { sip(dns源填的ip) && l4proto(udp) && port(53) -> must_direct }
获取域名
免费域名
访问getlocalcert,使用GitHub登录注册
注册一个免费域名,记得选择.localcert.net,.localhostcert.net只能用于本机测试
生成API Key,保存json文件
zerotier网络配置的域名需要与该域名一致,否则可能需要额外dns配置才能实现访问
安装Caddy
安装
拉取镜像
sudo docker pull caddy:<version>-builder sudo docker pull caddy:<version>
构建DNS质询caddy镜像
sudo vim Dockerfile # 内容 # FROM caddy:<version>-builder AS builder # # RUN xcaddy build --with github.com/caddy-dns/acmedns # # FROM caddy:<version> # # COPY --from=builder /usr/bin/caddy /usr/bin/caddy sudo docker build -t caddy:<tag> .
运行容器
sudo docker run -d \ --restart always \ --name caddy \ -p 80:80 -p 443:443 -p 443:443/udp -p 8443:8443 \ -v caddy-data:/data \ -v caddy-config:/config \ -v /path/to/Caddyfile/Dir:/etc/caddy \ caddy
Caddyfile配置
<yourSubdomain>.localcert.net { tls { # ca https://acme-staging-v02.api.letsencrypt.org/directory dns acmedns <creds.json> } respond "Hello from Caddy" }
可以先解除注释,尝试获取证书,确认无误后再使用正式环境获取证书
安装NextCloud AIO
安装
拉取镜像
sudo docker pull nextcloud/all-in-one
配置反向代理
# Caddyfile https://<yourSubdomain>.localcert.net:443 { reverse_proxy nextcloud-aio网卡的ip:11000 } https://<your-nc-domain>:8443 { reverse_proxy https://nextcloud-aio网卡的ip:8080 { transport http { tls_insecure_skip_verify } } }
运行容器
sudo docker run -d \ --init \ --sig-proxy=false \ --name nextcloud-aio-mastercontainer \ --restart always \ --publish 8080:8080 \ --env APACHE_PORT=11000 \ --env APACHE_IP_BINDING=0.0.0.0 \ --env NEXTCLOUD_DATADIR="data-dir" \ --volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \ --volume /var/run/docker.sock:/var/run/docker.sock:ro \ nextcloud/all-in-one:latest
给caddy添加nextcloud-aio网卡,dae代理nextcloud-aio网卡
后续
- 内网DNS太容易断线了,把pihole服务器放到了有公网ip的云服务器上