前言

我之前在阿里云购买的香港云服务器配置为1核0.5G(实际上进系统之后只有455MB),100MB带宽,270元五年,可以说是白菜价了。但是由于内存是在太小,使用Halo CMS搭建博客时系统需要频繁的swap,这就导致网页的响应时间非常长(7-8s),很多时候甚至直接超时。这对访问网站的用户来说是不可接受的。

正好我的笔记本放在实验室7*24小时不关机,于是我想到了本机使用docker搭建博客 + FRP内网穿透的方案,但是使用的过程中发现端口总是频繁被封禁(使用的并非默认端口)。情况描述:更换端口之后可以使用,但是过一两个小时又被封,再换端口也是如此。分析思路:我使用的FRP版本是0.62,FRP在0.5版本之后就默认开启TLS,所以应该不是被DPI识别流量特征导致的封禁。于是我猜测是长时间的TCP连接触发了运营商的封禁规则。FRP支持KCP,于是我想到使用KCP协议绕过封禁规则。

试了一下,果然有奇效,之后再也没被封过端口。

FRP配置

frps.toml:

kcpBindPort = 47000         # frp监听的端口
auth.token = "<设置token>"  # 为了安全设置token
vhostHTTPPort = 8080        # 将本机halo端口(默认8090)穿透到公网服务器的8080端口

frpc.toml:

serverAddr = "<服务器IP>"
serverPort = 47000
transport.protocol = "kcp"
auth.token = "<这里的token必须和服务端一致>"


[[proxies]]
name = "halo"
type = "http"
localPort = 8090
customDomains = ["<你的域名>"]

之后只需用caddy将443端口反向代理到8080端口,即可自动开启https加密。

不足

TLS + token大致能满足我的安全性需求。根据FRP文档:从 v0.50.0 开始,transport.tls.enable 的默认值将会为 true,默认开启 TLS 协议加密。如果 frps 端没有配置证书,则会使用随机生成的证书来加密流量。默认情况下,frpc 开启 TLS 加密功能,但是不校验 frps 的证书。因此会存在中间人攻击的风险,有更高安全性需求请自己配置证书。