使用docker nginx给飞牛搭建一个反向代理,这样不论是飞牛本身还是其中运行的docker,乃至局域网内的其他服务,都可以利用飞牛自带的DDNS IPv6实现从外网访问,只需要在docker内运行一个定制的带有ACME脚本的Nginx镜像,就可以实现域名访问和自动证书签发。
本篇文章使用阿里云域名,经过备案可正常解析访问,需在阿里云创建带有AliyunDNSFullAccess权限的子账号,并生成授权Key和密钥,用于在签发证书时验证DNS。
备注写在前面:
1. 以下所有/home/nginx/目录,可以自行指定为其他目录,保持一致即可
2. 示例域名nas.xxx.com需改为自己的根域名或二级域名等,
一:设置飞牛DDNS
此处应该有很多教程了,不多赘述,需要光猫路由器支持IPv6,并且飞牛已获取IPv6地址

二:打通IPv6外网访问
需要关闭光猫的IPv6防火墙,并在路由器上添加出站规则


至此,使用支持IPv6的客户端从外网访问 http://[IPv6地址]:5666 ,正常情况下就已经可以访问到了(浏览器访问IPv6需要使用“[]”包括地址)
三:配置端口和Docker容器
1.释放http(s)端口
为了在域名上隐藏端口,我们需要让Nginx监听飞牛的80,443端口,并将在此端口上收到的请求代理转发到5667端口。所以首先要把端口释放出来,在飞牛的[端口设置]里,取消勾选该选项

2.准备Nginx运行必须的配置文件
使用SSH运行以下命令,生成nginx配置文件
sudo docker run --name tmp-nginx-container -d nginx
sudo docker cp tmp-nginx-container:/etc/nginx/nginx.conf /home/nginx/nginx.conf
sudo docker rm -f tmp-nginx-container
3.创建Nginx容器
新建Docker Compose并运行,此镜像为打包的带acme的nginx官方镜像,项目地址
services:
nginx:
image: ningjx/nginx_acme:latest
container_name: nginx
restart: always
networks:
default:
ports:
- "80:80"
- "443:443"
extra_hosts:
- "host.docker.internal:host-gateway"
environment:
- Ali_Key=xx #阿里云账户Key
- Ali_Secret=xx #阿里云账户密钥
- Cert_Home=/etc/nginx/ssl
- Email=xxx@xxx.com #随便填
volumes:
- /home/nginx/nginx.conf:/etc/nginx/nginx.conf
- /home/nginx/conf.d:/etc/nginx/conf.d
- /home/nginx/logs:/var/log/nginx
- /home/nginx/html:/etc/nginx/html
- /home/nginx/ssl:/etc/nginx/ssl
- /home/nginx/crontabs:/var/spool/cron/crontabs
- /home/nginx/acme:/root/.acme.sh
networks:
default:
enable_ipv6: true
在/home/nginx/conf.d目录下新建代理配置base.conf(文件名随意)
server {
# 监听 IPv4/IPv6 的 80 端口(HTTP)
listen 80;
listen [::]:80;
# 强制跳转到 HTTPS
return 301 https://$host$request_uri;
}
server {
# 监听 IPv4/IPv6 的 443 端口(HTTPS)
listen 443 ssl;
listen [::]:443 ssl;
server_name nas.xxx.com;
# 指定 SSL 证书路径(ECC 证书)
ssl_certificate /etc/nginx/ssl/nas.xxx.com_ecc/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/nas.xxx.com_ecc/nas.xxx.com.key;
# 启用 TLS 1.2/1.3 和优化加密套件
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
# 反向代理配置
location / {
proxy_pass https://192.168.50.100:5667;
# 基础代理头
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket 支持
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 超时设置(避免 WebSocket 连接断开)
proxy_read_timeout 86400s; # 长连接超时
proxy_send_timeout 86400s;
}
# 启用 HSTS(严格传输安全)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}
四:启用自动证书签发
在Docker容器页面,打开nginx容器的终端,输入
acme.sh --issue --dns dns_ali -d nas.xxx.com --reloadcmd 'service nginx force-reload'
即可签发证书,后续会自动续期

至此,即可通过[http://[IPv6地址]:5666](https://nas.xxx.com访问飞牛
当需要反向代理其他服务时,只需在base.conf加入新的server配置,指定新的证书和server_name名即可