博客搭建系列(一)使用IPv6建站
本文最后更新于 2024-10-16,文章内容可能已经过时。
我的博客系统使用的是Halo
halo-dev/halo: 强大易用的开源建站工具。 (github.com)
IP
IPv4 or IPv6?
关于选择IPv4还是IPv6,笔者在此前一直使用内网穿透隧道,借助frp工具将内网端口映射至外网,从而获得服务。
公网IPv4还是内网穿透
如果自家有公网IPv4的话,那么我建议还是可以利用起来(当然在安全性上需要进行更多的考虑)。
如果没有公网IP,那么可以考虑使用厂商的frp服务。
这样做的优点如下:
如果隧道供应商是正规的,那么安全性比大部分个人玩家稍微高一点。服务商的服务器一般是带防护的,并且流量带宽(整个服务器)并不低,能够扛住一定的DDoS。
操作比较简单。
相较于购买云服务器,成本并不高。(我使用的10/月,有200GB流量),这对于个人用户来说差不多了。
缺点也是显而易见的:
只能进行一个端口的映射,想要映射多个服务出去增加成本。
带宽限制,我使用的带宽限制是24 Mbps,换算后只有3MBps的速度,对于文件服务器这样的需求就暂时不用考虑了。
绑定域名、安装证书可能比较麻烦。
当然frp只适用于个人玩家玩一玩的情况或者临时将本地服务放在公网上,长期的话还是考虑一下公网IPv6.
笔者在之前也用过云服务器搭建服务,但是太贵了!带宽也非常的一言难尽,如果被DDoS了,一晚可能能给你欠费干1000.。
IPv6
IPv6的优点有很多,这里就不再赘述了,2020年开始普及家用IPv6后,大部分人都应该具有IPv6了,具体的查看方法就是前往这个网址
IPv6 测试 (test-ipv6.com),如果能够获取到并且与ipconfig命令获取的信息一致,那么就是有IPv6.
注意保护好自己的IP信息!网络攻击的第一步是获取IP!
通过ipconfig命令查看
给出的IPv6有三个,其中我们与外界进行通信的临时IPv6地址,它会随着时间进行变化,这为我们的安全性提供了很大的保障,导致攻击者没法锁定攻击目标,但是这也给了我们一个麻烦,IP是变动的,又该如何绑定域名?
DDNS
DDNS专门用于解决绑定域名与临时IPv6。(购买域名的过程略过)
DDNS的原理就是不断地向域名提供商发送主机临时IPv6的地址,添加AAAA的解析记录。
我采用的工具是DDNS-GOGitHub - jeessy2/ddns-go
Docker安装DDNS-GO
docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root jeessy/ddns-go
随后使用ip:9876即可进行访问。
添加DNS
以华为云服务器为例,按照DDNS上填写信息即可。
我没有启动IPv4的DDNS,获取IP方式任何一个都可以。我选择通过网卡获取,可以使用匹配正则表达式匹配临时IPv6,记住检查获取到的IP与临时IPv6一致,否则你就将自己的永久IPv6绑定上去,泄露了会出现安全风险。
保存后我们可以前往服务商域名管理界面验证
我们发现已经有了AAAA的两条记录,这就是将IPv6与域名绑定的记录。
反向代理
反向代理我选择的是Nginx,使用Nginx Proxy Manager进行可视化配置。
Docker Compose安装Nginx Proxy Manager
首先创建安装目录
mkdir -p /root/data/docker_data/npm
cd /root/data/docker_data/npm
创建docker-compose.yml
sudo nano docker-compose.yml
在文件中添加:
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80' # 冒号左边可以改成自己服务器未被占用的端口
- '81:81' # 冒号左边可以改成自己服务器未被占用的端口,这是后台访问用的端口
- '443:443' # 冒号左边可以改成自己服务器未被占用的端口
volumes:
- ./data:/data # 冒号左边可以改路径,现在是表示把数据存放在在当前文件夹下的 data 文件夹中
- ./letsencrypt:/etc/letsencrypt # 冒号左边可以改路径,现在是表示把数据存放在在当前文件夹下的 letsencrypt 文件夹中
启动服务:
docker compose up -d
输入ip:81即可访问。
注意,安装Nginx Proxy Manager之前需要卸载已有的Nginx!
更新Nginx Proxy Manager
cd /root/data/docker_data/proxy
docker compose pull
docker compose up -d
卸载Nginx Proxy Manager
cd /root/data/docker_data/proxy
docker compose down
# rm -rf /root/data/docker_data/proxy # 完全删除映射到本地的数据
使用Nginx Proxy Manager代理服务
添加proxy
填写信息
ip填写宿主机在容器下的ip即可。譬如halo通过2283端口进行访问,并且容器所在网络网段为172.21.0.x,那么宿主机的ip为172.21.0.1,端口填写2283即可。
这几个选项都可以勾上。
到此为止我们已经可以使用域名的方式访问服务。比如http://moonlighti.cn。
但是访问服务后会显示不安全,我们与服务器的通信可以被第三方通过抓包与监听获取,非常的危险。因此需要SSL证书。
自定义SSL
Nginx Proxy Manager可以使用Let's Encrypt免费获取SSL证书,但是笔者的域名是在华为云购买的,block掉了服务,因此笔者在华为云上申请了免费的SSL证书,下载到本地之后上传到Nginx Proxy Manager。
将对应的文件上传即可,注意如果证书的名字比较复杂,可以修改一下,否则有可能识别不出来。
上传证书后,我们再回到之前添加Proxy Hosts的地方为域名添加证书
记得强制启用SSL
到此为止我们就可以在浏览器通过https访问。譬如https://moonlighti.cn。
tips:如果绑定证书之后访问域名,仍然是不安全的,可以清除浏览器记录或者使用另外的浏览器进行访问。这可能是因为之前使用http访问后浏览器保留了缓存。
在google chrome中如果显示证书有效,那么就已经绑定成功!
- 感谢你赐予我前进的力量