本文最后更新于 2024-10-16,文章内容可能已经过时。

我的博客系统使用的是Halo

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中如果显示证书有效,那么就已经绑定成功!