首先说明下为什么使用IPV6
为什么我们要使用IPV6呢?其实原因无非有:

  1. 自从服务商开通了IPV6,每个设备都有IPV6地址了,对于那些没有公网IPV4的小伙伴们,还需要打洞吗?
  2. IPV6可以在防火墙只打开特定的端口,增加安全性
  3. IPV6下,只打开一个高位端口,其它端口交给nginx的反向代理,进一步增加安全性

其次,为什么要用nginx

  1. 当然是用它的反向代理,方便简洁
  2. 可以使用nginx的UPSTREAM分流,达到每个服务一个三级域名或四级域名
  3. 如果分流之后记不住域名,可以自己搭建导航网页撒。(当然,导航页也可以套娃在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分钟检查一次
*/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后缀是::2015000的端口
以下的内容相当于是只开放内网里IPV6后缀是::20012345的端口

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