首先说明下为什么使用IPV6
为什么我们要使用IPV6呢?其实原因无非有:
- 自从服务商开通了IPV6,每个设备都有IPV6地址了,对于那些没有公网IPV4的小伙伴们,还需要打洞吗?
- IPV6可以在防火墙只打开特定的端口,增加安全性
- IPV6下,只打开一个高位端口,其它端口交给nginx的反向代理,进一步增加安全性
其次,为什么要用nginx
- 当然是用它的反向代理,方便简洁
- 可以使用nginx的
UPSTREAM
分流,达到每个服务一个三级域名或四级域名
- 如果分流之后记不住域名,可以自己搭建导航网页撒。(当然,导航页也可以套娃在
upstream
里)
泛域名,ddns
反正天下文章一大抄,网上各种抄袭这种的无数。各位自行搜索即可
以我个人而言,我买的Aliyun域名。只需要各位搞定id,secret就行。
然后使用开源的aliddns-cli
1 2 3 4
| mkdir download && cd download wget https://github.com/honwen/aliyun-ddns-cli/releases/download/v2022-03-04/aliddns-linux-amd64-v2022-03-04@44122685fc.tar.gz tar -zxvf aliddns-linux-amd64-v2022-03-04@44122685fc.tar.gz sudo cp linux-amd64/aliddns /usr/local/bin/
|
然后编辑~/.bashrc
或者~/.zshrc
中的alias,把id,secret加进去,不然每次输入太痛苦了。
先找到你的网卡名,上一篇博客里有。
~/.bashrc
1
| aliddns --id '你的安全ID' --secret '你的secret'
|
查找你的ipv6地址用这个命令,我的网卡是ens18
1
| ip -o addr show dev ens18 scope global dynamic noprefixroute|grep '/128'|grep '240e'|awk '{print $4}'|awk -F '/' '{print $1}'
|
当然,你们也可以找到同局域网内的其它设置ipv6地址,只是需要转换最后的::xx
就可以了,这个你可以在路由器里查,基本永久ipv6地址的后缀是固定的。
因为我们使用的是家庭宽带,每隔一段时间会自动变化IP,所以也不用在意所谓的安全。不然我们为什么要使用ddns呢。
当然也可以写一个脚本来自动查询IP的变化,以便自动更新DDNS
网上的DDNS脚本很多,大多数都是使用在线ip工具来查看当前IP。由于我个人使用不可描述
的原因,关闭了IPV6域名解析。这就带来一个问题,很多DDNS脚本用不上。所以还是自己搞一个吧。
nano myddns.sh
1 2 3 4 5 6 7 8 9 10 11 12 13
| #!/bin/bash
ip=`ip -o addr show dev ens18 scope global dynamic noprefixroute|grep '/128'|grep '240e'|awk '{print $4}'|awk -F '/' '{print $1}'|awk -F '::' '{print $1}'` str="::189" dsmip=$ip$str listip=`/usr/local/bin/aliddns --id 'LTxxxxxxxxxxxx' --secret 'orxxxxxxxxxxxxxxxxxz' list --domain '你的域名' |grep '你的域名'|awk '{print $4}'`
if [ "$dsmip" = "$listip" ]; then echo "无变化,不用解析" else echo "已变化,解析" /usr/local/bin/aliddns --id 'LTxxxxxxxxxxxx' --secret 'orxxxxxxxxxxxxxxxxxz' update --domain '你的域名' ipaddr $dsmip fi
|
如果是泛域名如下:
1 2 3 4 5 6 7 8 9
| local_ip=`ip -o addr show dev ens18 scope global dynamic noprefixroute|grep '/128'|grep '240e'|awk '{print $4}'|awk -F '/' '{print $1}'` remote_ip=`/usr/local/bin/aliddns --id 'LTxxxxxxxxxxxx' --secret 'orxxxxxxxxxxxxxxxxxz' list --domain '你的域名' |grep '你的域名'|awk '{print $4}'`
if [ "$local_ip" = "$remote_ip" ]; then echo "无变化,不用解析" else echo "已变化,解析" /usr/local/bin/aliddns --id 'LTxxxxxxxxxxxx' --secret 'orxxxxxxxxxxxxxxxxxz' update --domain '*.ipv6.你的域名' ipaddr $dsmip fi
|
然后加入cronbat
cronbat -e
1 2 3
| */10 * * * * /home/user/ddns_dsm.sh */10 * * * * /home/user/ddns_v6.sh
|
泛域名获取证书
安装certbot
按照官方的来吧
1 2 3 4
| sudo apt install certbot sudo ln -s /snap/bin/certbot /usr/bin/certbot certbot --version certbot certonly --manual --preferred-challenges=dns -d *.ipv6.你的一级域名
|
然后根据提示,在你的dns里创建一个txt,把值改成certbot
提供给你的,然后回车就OK
证书位置最后也会给你,通常在这里
1 2
| /etc/letsencrypt/live/ipv6.你的一级域名/privkey.pem /etc/letsencrypt/live/ipv6.你的一级域名/fullchain.pem
|
nginx分流,端口转发
没啥可说的,照抄即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| upstream jellyfin { server 127.0.0.1:8096; }
upstream filebrowser { server 127.0.0.1:8081; }
server { listen [::]:12345 ssl; server_name jellyfin.ipv6.xxx.xxx;
ssl_certificate /etc/letsencrypt/live/ipv6.xxx.xxx/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/ipv6.xxx.xxx/privkey.pem;
location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host;
proxy_pass http://jellyfin;
proxy_buffering off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }
server { listen [::]:12345 ssl; server_name filebrowser.ipv6.xxx.xxx;
ssl_certificate /etc/letsencrypt/live/ipv6.xxx.xxx/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/ipv6.xxx.xxx/privkey.pem;
location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host;
proxy_pass http://filebrowser;
proxy_buffering off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }
|
路由器里开放IPV6特定端口防火墙,比如黑群晖
以下的内容相当于是只开放内网
里IPV6后缀是::201
的5000
的端口
以下的内容相当于是只开放内网
里IPV6后缀是::200
的12345
的端口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| config rule option target 'ACCEPT' option src 'wan' option proto 'tcp udp' option dest_port '5000' option name '5000' option family 'ipv6' option dest 'lan' option dest_ip '::201/0'
config rule option target 'ACCEPT' option src 'wan' option proto 'tcp udp' option dest_port '12345' option name 'nginx' option family 'ipv6' option dest 'lan' option dest_ip '::200/0'
|
这样,你的PVE中黑群晖可以外网成功访问了。另外PVE中的web服务器只开放一个12345
端口,也可以访问所有的服务了。虽然我不建议这样做,一般情况下,我仅仅开发wallabag,speedtest给外网。
当然,最安全的做法是一个端口都不开放,自己在外面访问的话,还是推荐vpn访问,比如wireguard