0%

基于frp的家庭网电脑建站方案

起因

我有一台2015年(初三)左右购入的惠普笔记本,当时买来用于练习英语听力。到了2020年左右,我正在上大二,且仍然使用这台惠普。
笔记本、手机等更新换代是常有的事,然而我的惠普上的windows7旗舰版能够胜任我一个计算机专业学生的所有需求,只不过硬件有些撑不住了–外壳破裂,开启无线网的按钮失灵。

2020年寒假,我照常把笔记本丢在了学校,结果因为疫情没法回去,所以顺势买了台新的戴尔笔记本。老惠普从此退役,没在打开过。

今年暑假,我觉得老惠普就这样扔掉太可惜,于是想将它变成服务器。这里记录了这个过程。

经过

  1. 网络和电源

我用一根网线直接连接路由器和老惠普,使其不仅有网还比无线网络稳定。电源也一直连接着。电脑屏幕会息屏,但是息屏是桌面的事,不会干扰ssh登陆。

  1. 重装系统

改造之前,惠普上是windows11+ubuntu16.04+ubuntu16.04的三系统共存。windows11到底是比较吃硬件的,在老惠普上运行很慢。两个ubuntu非常好用,只可惜空间有点小。虽然能直接访问windows下的D、E、F各个盘,还是觉得windows11的存在很累赘。于是我把系统重装为ubuntu22.04单系统。重装完之后老惠普的键盘出现了大小写错乱和没按shift却一直输出特殊字符的问题。此时想重装为之前没这种Bug的ubuntu16.04已经晚了。这是因为重装为ubuntu22.04之后只有uefi一种引导方式了,而ubuntu16.04的镜像文件里恰恰没有照应uefi的引导文件,导致开机检测不到u盘里的ubuntu16.04镜像文件。

可能还有其他方法可以把系统装回低版本ubuntu,但已经不想折腾了。况且作为服务器,老惠普的键盘、桌面统统不重要。因为远程ssh登陆老惠普之后的输入都跟老惠普自身的键盘、桌面无关。ubuntu比windows轻捷很多,同样的老机器,ubuntu运行起来非常顺滑。

  1. 启用ssh

新装的ubuntu上ssh是没开的。装下openssh-server

1
2
3
4
5
sudo apt update
sudo apt install openssh-server
# 看看ssh服务器是不是开了
sudo systemctl status ssh

新装的系统上带了防火墙。看看防火墙的状态,确保ssh使用的22端口是放行的。

1
sudo ufw status

此时,因为我的戴尔和惠普处在同一个家庭网中,用我的戴尔是能够ssh登陆老惠普的。老惠普的键盘错乱到我不想用的地步,ssh一开我立马从戴尔上登入惠普。

  1. frp内网穿透

老惠普老当益壮,4G内存,4核CPU,400G+的磁盘,已经完胜XX云上普通配置的机器了。
他唯一的弱点是没有一个公网ip,让我离家千里之后能在互联网上寻找到他。
好在我有kexueshangwang的刚需,手里常年会有一台vultr的最低配置的vps。但是vps要花钱,我穷我舍不得买高配的用,低配的带些服务器比较吃力(我觉得会比较吃力)。此外,最不放心的是vps在物理上经常永远不属于我,我不想把重要的东西放在上边。

我需要把vps的公网ip和老惠普的硬件资源做一个整合。把vps当作门户,把我的域名jixinlong.top解析到vps的ip上。即使以后更换vps也可以很快的调整dns解析条目。利用frp做一个内网穿透,建立从vps到老惠普的ssh,http,https,静态文件服务 映射。

  • vps 7000端口 –绑定– 惠普7000端口
  • vps 80端口 –http映射– 惠普80端口
  • vps 443端口 –https映射– 惠普443端口
  • vps 非22端口 –ssh映射– 惠普22端口
  • vps 8080端口 –静态文件服务映射– 惠普某端口

还需要一个8888端口给后续的宝塔面板使用。

  • vps 8888端口 –tcp映射– 惠普8888端口

vps上的frps.ini:

1
2
3
4
5
root@01:~/frp_0.43.0_linux_amd64# cat frps.ini
[common]
bind_port = 7000
vhost_http_port = 80
vhost_https_port = 443

惠普上的frpc.ini

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
50
jxl@jxl-HP-g14-Notebook-PC:~/frp_0.43.0_linux_amd64$ cat frpc.ini
[common]
server_addr = dns.jixinlong.top
server_port = 7000

[hp-ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = xxxx

[hp-static-files]
type = tcp
remote_port = 8080
plugin = static_file
# 要对外暴露的文件目录
plugin_local_path = xxxx
# 访问 url 中会被去除的前缀,保留的内容即为要访问的文件路径
plugin_strip_prefix = static
plugin_http_user = xxxx
plugin_http_passwd = xxxx

[hp-https-www]
type = https
custom_domains = www.jixinlong.top
local_port = 443

[hp-https]
type = https
custom_domains = jixinlong.top
local_port = 443

[hp-jxl-http]
type = http
local_port = 80
custom_domains = jixinlong.top

[hp-jxl-http-www]
type = http
local_port = 80
custom_domains = www.jixinlong.top


#宝塔面板
[hp-jxl-baota]
type = tcp
local_port = 8888
remote_port = 8888
local_ip = 127.0.0.1
#custom_domains = baota.jixinlong.top

注意这里的宝塔8888端口映射使用普通的tcp映射就好,采用http反而连不上报错。这个和宝塔面板本身有关。

两边分别运行frps和frpc,此时就可以利用ssh直接域名dns.jixinlong.top及对应非22端口来远程登陆老惠普了。vps那边可以用screen把frps切到一边去常态化监听。

  1. 惠普的frpc开机自启

vps一般是不会无故重启啥的,比较稳定。但是惠普就不一定了,家里停电、断网啥的都可以导致它关机。一旦关机我就没法在外地远程登陆惠普了。所以这里需要让惠普这边的frpc开机自动启动。
此处参考了网上的一些写法,配置systemctl进行开机启动
创建frpc.service服务

1
vim /lib/systemd/system/frpc.service

输入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

[Unit]
#服务描述
Description=frpc service
After=network.target network-online.target syslog.target
Wants=network-online.target

[Service]
Type=simple
#执行命令
ExecStart=/home/jxl/frp_0.43.0_linux_amd64/frpc -c /home/jxl/frp_0.43.0_linux_amd64/frpc.ini
#定期重启,一天一次,以防内网穿透疲惫
Restart=always
RuntimeMaxSec=604800


[Install]
WantedBy=multi-user.target

注意: 网上教程的After和Wants是这样写的:

1
2
After=network.target syslog.target
Wants=network.target

区别在于没有-online。不加online的network.target意味着希望在网络服务启动之后再启动frpc服务,但网络服务启动不保证能连上网络。我实际实验时也发现这种写法的自启动,网络并没有连接上,导致frpc启动失败。改成我这种写法之后,就能使网络连接成功之后再启动frpc。

继续,终端里输入

1
systemctl daemon-reload  

之后便可以直接使用systemctl命令来控制frpc

1
2
3
4
5
6
7
8
9
10
11
12
#启动
sudo systemctl start frpc
#关闭
sudo systemctl stop frpc
#重启
sudo systemctl restart frpc
#查看状态
sudo systemctl status frpc

设置开机自动启动

sudo systemctl enable frpc
  1. 安装宝塔面板,并利用宝塔安装wordpress

宝塔是一个帮人快速搭建建网站的环境,并帮人建网站的面板。wordpress单纯是一个帮助人快速建网站的框架。wordpress需要数据库、php、Apache 服务等作为环境,这些可以在ubuntu上自己挨个装(方法1);也可以先搞个宝塔,利用宝塔一键装这些环境(方法2)。

网上有的教程是用宝塔装好环境之后,直接在宝塔的应用商店里搜到wordpress一键装wordpress的。但我没搜到。所以我是基于方法2,从wordpress中文官网下载压缩包,丢到宝塔网站目录里装的wordpress。

总之把wordpress安装好之后,网站就初步建立了。

  1. wordpress使用

网上说wordpress写得很不好,资源利用率不高啥的。我不明觉厉。wordpress也有优点,就是快捷建站,有良好的生态(使用者多,那么围过来的开发者就多),插件、网站主题很多。跟同样快捷的Hexo+github静态建站方案比起来,它的优点是动态的,天然地带评论区等功能。

图片、视频、音乐都可以上传到wordpress的媒体库。主题可以随时换,不同主题不一样,有没有用到背景图、头像等因主题而已,但是针对某个主题的设定会有记忆,下次切回来的时候不用重新挨个设置该主题的内容元素。

插件这边,我装了WP Githuber MD,可以直接把本地写好的markdown复制进去,自动渲染后发表成文章。wordpress默认使用的头像服务被ban了,访问时会出现头像加载不出来的丑态。我直接One User Avatar插件把所有人的头像设成存在网站本地的小鸟游同学大头照。

  1. wordpress更换网址(可选)

首先要修改设置里的WordPress地址(URL)和站点地址(URL)为新地址。此时frp穿透无误的情况下,是可以通过新网址访问网站前后台的。

接着,网站中存有很多之前写文章时导入的图片,其链接还是旧的,这些图片就会加载不出来。改下数据库里的这些链接。进入phpmyadmin数据库管理,找到 wp_posts 这个数据表,切换到SQL状态,在输入栏中输入如下代码执行即可:

1
UPDATE wp_posts SET post_content = replace( post_content, '老域名','新域名') ;

改完大部分图片加载正常了。去网站上翻翻看,还有音频啥的没改过来,就重新编辑所在文章,删了重新添加,音频的链接就会变成新的。

  1. http更换为https

这一步其实很简单。
宝塔面板里 该网站-设置-SSL-申请个证书并部署它-打开“强制https”
http变成https也算是网址的更换了,所以要做一次wordpress更换网址
更换之后再访问网站,浏览器就不会提示不安全连接啥的了。

  1. 假如改wordpress网址玩脱了

导致登不进去了。有两种办法。

  • 宝塔进入使用主题的function.php,在任意空白处加上下面两行代码:
1
2
3
update_option('siteurl','改之前的网址');    

update_option('home','改之前的网址');

保存,再次登录即可。记得再把这两行注释掉。

  • 直接改数据库,把记录里的网址改回去。
    宝塔登陆phpMyAdmin,选中你的WordPress数据库;
    找到wp-options这个数据表;
    打开这个表,找到第一条记录,也就是option_name为siteurl的那条记录,将option_value中错误的地址改为正确的即可。(如果option_name为home的那条记录地址也是错误的,改为正确的即可)

优缺点总结

本方案利用vultr的vps做网站门户,实际网站资源部署在家庭网内的老惠普上。这样的好处是:

  • 将域名解析到一个oversea的vps上,且名义上我oversea的vps就是网站所在地,这样不需要繁琐的域名、网站put on records 工作。
  • vps的更换可以是高度灵活的。假如我换了vps,只需要把域名解析到新的ip,然后在新的vps上继续运行frps即可。重启老惠普上的frpc,老惠普会自动依据我的域名寻址到新的vps,并请求和新的vps建立映射。真正网站实体在老惠普上,铁打的惠普,流水的vps。

这样的坏处也显而易见:

  • 本来可以直连的网站中间多了个vps,路径变远了。更何况这个vps还是oversea的,远上加远。这降低了网站速度。