家建服务器与cloudflare前置的使用心得
说到家建服务器,那简直就像在无人区搭帐篷——步步惊心,坑比天上的星星还多!!
而且,这些坑还特别会“伪装”,表面上看起来风平浪静,实则暗流涌动,一不小心就让你陷入“无法访问”的深渊。
本文进行了一些常见问题的个人探索,算作个人记录。
服务器硬件、电费、内网端口转发问题
路由器作为家建服务器主体,这些问题通通不存在。
本文中的路由器型号RT-AX88U,搭载梅林384固件,和光猫是桥接状态,自主拨号上网
80、443端口被封问题
按照这位作者的说法(https://www.bilibili.com/opus/640653277763993623)
解决方案有二,一是使用可以指定回源端口的CDN,二是使用隐性URL解析
本文使用CLOUDFLARE前置转发端口,算是方法三吧
但是cloudflare前置实在太卡了,为了加速cloudflare的访问,我又折腾了很久,
以下是我的配置,但请
注意!
这个配置!并!不!好!使!
请读者就此转身,期待下一篇文章的探索
准备两个域名:访问域名donneryst.com与中转域名donneryst.site
1.托管域名
中转域名的DNS一定给托管给cloudflare
访问域名的DNS一定得支持顶级域名CNAME(godaddy就不支持)
按供应商要求修改nameserver即可
2.设置回退源与自定义主机
分配一个origin.donneryst.site作为回退源域名,
A记录可以随便写,合法ipv4就行,会被DDNS不断刷新
自定义主机名是donneryst.com与www.donneryst.com
这里证书的版本保持默认 TLS1.0即可,这样可以支持更多用户
按需求添加DCV 委派,保证两个自定义主机名的证书有效
按需求添加TXT验证,保证两个自定义主机名的状态有效
如此设置完,域名DNS应该有
donneryst.com
CNAME _acme-challenge donneryst.com.XXXXX... 仅DNS
CNAME donneryst.com origin.donneryst.site 仅DNS
CNAME www donneryst.com 仅DNS
TXT _acme-challenge.www XXXXXXXXXXXXXXXXXXXXXX 仅DNS
TXT _cf-custom-hostname XXXXXXXXXXXXXXXXXXXXXX 仅DNS
donneryst.site
A origin XX.XX.XX.XX 已代理
这里有很多网文说CNAME www 给 visa.com,可以优选节点,
亲测无效,cloudflare应该已经屏蔽了这种做法
3.设置SSL/TLS证书
概述那里设置当前加密模式:完全(严格)
边缘证书不用管,cloudflare自动生成,两个域名都会生成对应的证书,3个月一换
客户端证书不需要
源服务器,需要在donneryst.site这个域名下生成15年证书,并交给你的web服务器作为认证文件
注意私钥只出现一次,一定要复制完保存好,再点确认退出
自定义主机上文已经说了
4.设置转发规则
新建Origin Rule,
条件是
SSL/HTTPS 等于 true and 主机名 通配符 donneryst.site,
操作是
重写 端口 收件人 (你的web服务端口)
(以下内容好使,可以参考)
DDNS问题
梅林固件安装Cloudflare DDNS插件,按需要的变量配置即可
区域ID的查看在(域名 - 概述 - 右侧窗口)
AUTHKEY的查看在(我的个人资料 - API令牌 - Global API Key)
从安全角度讲,拿着全局密钥去干更新DNS这么小的事是不适当的,应该走API令牌
无奈这个插件就是这么写的,懒得自己改源码,如需改源码,详见
/jffs/.koolshare/scripts/cfddns_config.sh
我没试,怕改出其他问题
算力资源不足问题
一些前端页面放在路由器上问题不大,
然而后端放上路由器就会有算力资源不足的问题。
具体表现为:nodejs的server会不定时终止,内存页访问fatal error
为了解决这一问题,我们使用cloudflare的云计算
从域名的菜单回到主账户的菜单,计算(workers)下找到(Workers和Pages)
新建hello world worker,然后修改源码
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
const url = new URL(request.url)
const pathname = url.pathname
// 允许跨域请求
const headers = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET',
'Access-Control-Allow-Headers': 'Content-Type'
}
// 获取客户端真实 IP 的中间件
const getClientIp = (req) => {
const forwarded = req.headers.get('x-forwarded-for')
return forwarded ? forwarded.split(',')[0] : req.headers.get('CF-Connecting-IP')
}
// 获取客户端 IP 地址
if (pathname === '/') {
try {
const clientIp = getClientIp(request)
return new Response(JSON.stringify({ ip: clientIp }), { headers: { ...headers, 'Content-Type': 'application/json' } })
} catch (error) {
return new Response(JSON.stringify({ error: '无法获取IP地址' }), { status: 500, headers: {...headers, 'Content-Type': 'application/json' } })
}
}
// 处理其他请求
return new Response('Not Found', {...headers, status: 404, headers })
}
以上云计算功能是一个简单的获取ip的功能,注意点就是云计算跨域,需要增加允许跨域的header
最后再加一个CNAME
donneryst.com
CNAME ip ip-lookup.jhpx.workers.dev 已代理
当然使用cloudflare的worker功能依旧有限,
解决不了所有后端问题,
但我觉得这是一种开放的方向,
实在是受够了国内的封闭环境,
既然底层地功能实现可以外包给其他厂商,
为啥计算就不可以用云呢?