冯梦华的日常

你好,OrangePi Zero3!

本篇文章将详细地写下我配置这块单板计算机的全过程,之后若是有新的自托管服务也会在本文记录下来。

购买

自从接触 Linux 之后渴望得到一个树莓派了,奈何因为疫情导致了全球的芯片供应紧张,树莓派的价格水涨船高,价格已经远远超过了它的价值,更重要的是超过了我的预算,即使是二手的价格也非常不值当。总之,出于囊中羞涩的考虑,我最终选择了这块国产的派 —— OrangePi Zero3.

2023-08-17_12-27.png

我购买的是内存为 1.5G 的版本价格为一百出头,刚拿到快递的时候我就疑惑了, 为何如此之小!开箱后更是震惊,它甚至没有我的巴掌大呢!虽然但是,这还是很精致的,而且对于这样的设备而言,小其实是更好的,更方便搭载在其他的设备上。

photo_6264513425795298480_y.jpg

除开这块板子,我还另外买了:

  • 亚克力的外壳
  • 风扇+散热片
  • USB to TTL 用于串口调试
  • 64G 闪迪 tf 卡

关于系统镜像方面,我还是选择了熟悉的 debian 发行版,毕竟我的 vps 用的也是这个,这块单板计算机我是拿来内网穿透的 官方镜像

2023-08-17_12-42.png

系统配置

在向 tf 卡刷完系统后,就可以通过串口进行连接了。

自动连接热点 WiFi

使用串口多少是不方便的,所以先来配置一下网络,让其他机器可以通过 ssh 访问这块板子。

  1. 使用nmcli dev wifi查看当前扫描到的 wifi 列表。

  2. 使用 nmcli 连接到热点并输入密码:

sudo nmcli dev wifi connect YourHotspotName password YourPassword
  1. 将连接的配置设置为自动连接:
sudo nmcli connection modify "YourHotspotName" connection.autoconnect yes

YourHotspotName 替换为你的热点名称,YourPassword 替换为密码。

完成后通过 ip addr 即可看到 ip 地址,然后就可以通过 ssh 正常访问板子了

添加一个新用户

useradd -m -G additional_groups -s login_shell username
passwd username

然后去修改 /etc/sudoers 文件

FRP 内网穿透

在这个 releases 页面中,找到对应架构的压缩包,可以使用 uname -a 查看到。

通过 wget 下载

wget https://github.com/fatedier/frp/releases/download/v0.51.3/frp_0.51.3_linux_arm64.tar.gz

通过 tar 解压

tar xvf frp_0.51.3_linux_arm64.tar.gz
  • frpc: 这是 FRP 客户端的可执行文件。FRP 客户端用于连接到 FRP 服务器并将内部网络服务暴露给外部访问。
  • frps: 这是 FRP 服务器的可执行文件。FRP 服务器用于接收来自客户端的连接,并将这些连接转发到内部的网络服务。
  • frpc.ini: 这是 FRP 客户端的配置文件,用于指定客户端的连接设置、代理规则等。
  • frps.ini: 这是 FRP 服务器的配置文件,用于指定服务器的监听端口、代理规则等。
  • frpc_full.ini: 这是 FRP 客户端的完整配置文件,可能包含更多详细的设置。
  • frps_full.ini: 这是 FRP 服务器的完整配置文件,可能包含更多详细的设置。

服务器配置

下载完对应架构的文件后,即可开始配置,只需要关心 frpsfrps.ini 文件即可,前者是FRP 服务器的可执行文件,后者是这是 FRP 服务器的配置文件。

打开 frps.ini进行配置,配置文件的内容如下:

[common]
bind_port = 7000
token = 1234567890

客户端和服务器的配置文件中都需要设置相同的 Token 才能正确进行连接和通信。

为了保障安全性,你应该选择一个强密码的 Token,并确保不会轻易泄露给他人。如果你怀疑 Token 可能已经暴露,应当立即生成一个新的 Token 并更新配置文件。

完成后,运行 ./frpc -c ./frpc.ini

若无问题,则说明配置成功。

接下来,配置一下 systemd 服务,让上面这条运行命令能开机自动启动,这非常实用:

但是在此之前,我们需要先将 frpsfrps.ini 文件放到合适的地方:

sudo cp frps /usr/local/bin/
sudo mkdir /usr/local/etc/frp
sudo cp frps.ini /usr/local/etc/frp/

首先,创建一个名为frps.service的文件,该文件将存储有关你的自启动服务的信息。通常,这些文件存放在/etc/systemd/system/目录下。

sudo vim /etc/systemd/system/frps.service
[Unit]
Description=frps
After=network.target
[Service]
TimeoutStartSec=30
WorkingDirectory=/usr/local/bin/
ExecStart=/usr/local/bin/frps -c /usr/local/etc/frp/frps.ini
Restart=on-failure
[Install]
WantedBy=multi-user.target

保存后,执行:

sudo systemctl enable frps
sudo systemctl start frps
sudo systemctl status frps

若无问题,则可进入客户端的配置。

下面是一些常用的命令:

  • 启动服务:sudo systemctl start frps
  • 停止服务:sudo systemctl stop frps
  • 重启服务:sudo systemctl restart frps
  • 查看服务状态:sudo systemctl status frps
  • 关闭自启动:sudo systemctl disable frps

客户端配置

下载完对应架构的文件后,即可开始配置,只需要关心 frpcfrpc.ini 文件即可,前者是FRP 客户端的可执行文件,后者是这是 FRP 客户端的配置文件。

假设:

服务器的ip地址是 1.1.1.1, 服务端frp正在监听的端口是7000, token是1234567890

客户端目前正在运行一个项目叫 bitwarden ,它正在本地 0.0.0.0 地址上监听 1111 端口

打开 frpc.ini进行配置,配置文件的内容如下:

[common]
server_addr = 1.1.1.1
server_port = 7000
token = 1234567890

[bitwarden]
type = tcp
local_ip = 0.0.0.0
local_port = 1111
remote_port = 8111

值得注意的是,配置文件中的 [bitwarden] 可以替换成任何想要的名字

为了方便,我们同样设置 systemd 服务

但是在此之前,我们需要先将 frpcfrpc.ini 文件放到合适的地方:

sudo cp frpc /usr/local/bin/
sudo mkdir /usr/local/etc/frp
sudo cp frpc.ini /usr/local/etc/frp/

首先,创建一个名为frpc.service的文件,该文件将存储有关你的自启动服务的信息。通常,这些文件存放在/etc/systemd/system/目录下。

sudo vim /etc/systemd/system/frpc.service
[Unit]
Description=frpc
After=network.target
[Service]
TimeoutStartSec=30
WorkingDirectory=/usr/local/bin/
ExecStart=/usr/local/bin/frpc -c /usr/local/etc/frp/frpc.ini
Restart=on-failure
[Install]
WantedBy=multi-user.target

保存后,执行:

sudo systemctl enable frpc
sudo systemctl start frpc
sudo systemctl status frpc

若无问题的话,则说明没有问题!

原理

Frp(Fast Reverse Proxy)是一个用于内网穿透的工具,它允许你在公网上访问位于内网的计算机服务。它的原理是通过在公网服务器上部署 frps(Frp 服务器端)和在内网机器上部署 frpc(Frp 客户端),通过公网服务器作为中转,将外部请求转发到内网机器上。

  • 在公网服务器上部署 frps:公网服务器上运行的 frps 监听一个指定的端口,等待来自 frpc 的连接。
  • 在内网机器上部署 frpc:内网机器上的 frpc 将建立到 frps 的连接,并注册自己的服务信息。frpc 和 frps 之间建立的连接可以被用于穿透数据。
  • 数据传输:当公网客户端请求连接到公网服务器的指定端口时,frps 会将这个请求转发给已经连接的 frpc 客户端,然后 frpc 客户端再将请求转发到内网机器的指定服务上。

在我上面的配置中,其转换的意思就是:

frps 监听在公网服务器的 7000 端口,frpc 连接到公网服务器的 7000 端口,并注册自己的服务信息。frpc 客户端配置了一个类型为 TCP 的服务,将本地的 bitwarden 服务映射到公网服务器的 8111 端口上。

若是请求 https://1.1.1.1:8111 那么这个请求就转发给客户端的 http://0.0.0.0:1111

Nginx 配置

我在服务器中是使用 Nginx 来进行反向代理的,若你的服务器不是,则可以跳过此内容。若你完全不了解 nginx 建议先去学习了之后再回来进行配置,因为此处我写得很简略,可能会对你产生误导。

我的 Nginx 代理了80端口,所有的请求都是从此处进入上文提到,需要从 8111 端口进入才能访问内网,所以我需要对 nginx 添加一些配置:

2023-08-17_15-48.png

这样,当请求 bitwarden 路径时,将会反向代理到 8111 端口

当然,通过 nginx 也可以配置子域名来访问,首先将三级域名 bitwarden.yarnom.top 通过 CNAME 指向当前的服务器地址

然后,nginx 设置一个新的 server ,server_name 就是这个三级域名:

2023-08-17_15-26.png

搭建 Vaultwarden

由于官方的 Bitwarden 服务对于我的小机子来说过于庞大了,所以选择了社区用 Rust 编写 Vaultwarden 项目

它可以用 docker 搭建,那就是几条命令就能安装完毕:

Pull the docker image and mount a volume from the host for persistent storage:

docker pull vaultwarden/server:latest
docker run -d --name vaultwarden -v /vw-data/:/data/ --restart unless-stopped -p 80:80 vaultwarden/server:latest

完成!

搭建 Memos

docker 搭建

docker run -d --name memos -p 5230:5230 -v ~/.memos/:/var/opt/memos ghcr.io/usememos/memos:latest

自行修改参数即可。

完成!

七月与八月

七月就这样过去了呢,很久没有写博文了,主要是生活现在千篇一律,没啥想写的内容,总不能写一大堆的流水账不是嘛。

虽说是千篇一律,但最近也是有好好用功的。最近在捣鼓一个新的项目:用 Rust 语言完成静态博客生成器。我目前使用的 Hexo 就是这样的工具,它将markdown文件转换为html文件,再对 tags 和 categories 等内容进行整理。这是之前未曾接触过的代码经历。

事实上,一开始为真的无从下手,于是我开始询问 ChatGPT,这真是一个很棒的人工智能,它认真地回答了我很多的问题,给予了我很多实际地代码。我用了一天时间了解了 rust 的语法,囫囵吞枣地学习显然不足以支撑我完成这个项目,但是有了 ChatGPT 的帮助,事情真的变得容易了很多,之后完成了这个项目,我会写一篇更详细的文章来介绍这一过程。

最近事情真的很多,实训整得我莫名其妙地很累,也没啥时间写博文,况且静态博客的弊端就是无法随时地去写啦,最近想着要不要用 java 去搭建一个服务,上面用来写一些短的评论或者吐槽的话语,目前的初步想法是这样的。

V2ray 搭建与配置记录

前言

近来想纯净自己的ip,同时也想试着搭建 v2ray 服务供以自己代理使用,所以上两个星期便购买了一台 Vultr 的 VPS。出现了一些问题,同时也确实都得以解决了,这里将问题和解决办法列出:

1. 未做伪装的 ip 被封杀

这是第一次尝试使用 vps 搭建 v2ray 服务,事实上非常的顺利,我确实完成了 v2ray 的搭建,但是第三天便遭到了中国政府的防火墙一记 ban ip 操作。现在想着这是极为危险的,但事情还得继续,问题自然是发生在我未对 v2ray 进行伪装,因为初次接触,所以对很多新的名词有恐惧心理,一开始便没有去尝试伪装操作,最终酿下错误,但是错误的本身其实也在推动着我技术的进步。

问题的解决方法是,首先通过 WebSocket+TLS+Web 完成对传输层流量伪装,原理就是通过 Nginx 搭建了一个真实的网站,分流一个特定的路由去转发 v2ray 的流量,其实正常的伪装到这里就结束了。但前面我说了,我的 VPS ip 被封杀了,其导致了我没办法在国内正常通过 ssh 访问到服务器,所以根据攻略我又加了一层伪装,我将我的域名名服务器交给 cloudflare 让其帮我把域名伪装成其他的ip,从而躲过封杀。

这样的后果也很明显,虽然更加安全了,但是代理速度确实也下来了。。。于是,我还是决定摧毁当前的 vps ,重新构建一个,Vulter 会重新分配一个 新的ip。

2. ChatGPT 封杀所有 vultr 的 ip

如小标题所言,openai 确实封杀了所有来自 vultr 的 ip,但是这个问题不大,我还是通过 cloundflare 单独对这个域名伪装了 ip 得以成功使用chatgpt,这个在后文中会详细讲到。

配置 vps 和 v2ray

修改 hostname

这个对v2ray 没啥子用,只是我想改而已:)

vim /etc/hostname

安装 git

apt-get install git

安装 zsh 和 ohmyzsh

Linux 自带的 bash 不是那么地方便使用,所以换成 zsh 是个更好的选择。

apt-get install zsh
sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

安装 v2ray

通过官方脚本自动安装 v2ray 本体

确实有很多种方式安装 v2ray,我这里选择使用 fhs-install-v2ray 项目提供的安装脚本进行安装: 主要是它能帮我自动创建一些文件:

installed: /usr/local/bin/v2ray
installed: /usr/local/bin/v2ctl
installed: /usr/local/share/v2ray/geoip.dat
installed: /usr/local/share/v2ray/geosite.dat
installed: /usr/local/etc/v2ray/config.json
installed: /var/log/v2ray/
installed: /var/log/v2ray/access.log
installed: /var/log/v2ray/error.log
installed: /etc/systemd/system/v2ray.service
installed: /etc/systemd/system/v2ray@.service

执行下面的程序脚本即可(目前时间是:2023-05-22,该脚本未来可能发生变动,以具体情况为准) 此处贴出项目 README 文件:README.zh

bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)

执行完后,若无明显错误,即可通过 systemctl start v2ray.servicesystemctl status v2ray.service 查看是否能正确启动。

配置 v2ray 服务端

无论是服务端亦或是客户端的配置,其实都非常简单,只需要将配置文件改动一些即可使用。 以下是官方提供的服务端配置:

{
    "inbounds": [
        {
            "port": 10086, // 服务器监听端口
            "protocol": "vmess",
            "settings": {
                "clients": [
                    {
                        "id": "xxxxxxxxxxxxxxx"
                    }
                ]
            }
        }
    ],
    "outbounds": [
        {
            "protocol": "freedom"
        }
    ]
}

在入门阶段,只需要了解 inbounds 中的 portid 即可。

  • port 即是服务器的监听端口
  • id 可以理解为某种密钥一样的存在,在服务端与客户端交流时,需要通过这值进行辨别身份。可以使用 cat /proc/sys/kernel/random/uuid 指令生成这个 id。

服务器的配置中需要确保 id 和端口与客户端一致,就可以正常连接了。

最后重启一下 v2ray 服务即可:systemctl restart v2ray.service ,当然因为可能存在的将配置文件写错的问题,最好再查看一下有没有错误产生 systemctl status v2ray.service

没有问题后,即可开始配置 v2ray 客户端。

啊,最后注意让防火墙放开对应的端口,比如这里的10086端口

ufw allow 10086/tcp

配置 v2ray 客户端

  • Linux 平台可以使用 v2ray 程序(服务器所用的那个),它即可以当服务端也可以作为客户端使用
  • Android 平台可以使用 v2rayNG

无论是 android 还是 windows,其都有相应的图形界面,配置起来很简单,这里主要讲一下 v2ray 如何作为客户端使用。

以下贴出官方提供的客户端配置:

{
    "inbounds": [
        {
            "port": 1080, // SOCKS 代理端口,在浏览器中需配置代理并指向这个端口
            "listen": "127.0.0.1",
            "protocol": "socks",
            "settings": {
                "udp": true
            }
        }
    ],
    "outbounds": [
        {
            "protocol": "vmess",
            "settings": {
                "vnext": [
                    {
                        "address": "server", // 服务器地址,请修改为你自己的服务器 ip 或域名
                        "port": 10086, // 服务器端口
                        "users": [
                            {
                                "id": "b831381d-6324-4d53-ad4f-8cda48b30811"
                            }
                        ]
                    }
                ]
            }
        },
        {
            "protocol": "freedom",
            "tag": "direct"
        }
    ],
    "routing": {
        "domainStrategy": "IPOnDemand",
        "rules": [
            {
                "type": "field",
                "ip": [
                    "geoip:private"
                ],
                "outboundTag": "direct"
            }
        ]
    }
}

虽然这看起来蛮多的,但需要修改的地方也就是 outbounds 里的 addressportid

  • address 填入 vps 的 ip 地址亦或是域名
  • port 填入服务端中监听的那个地址
  • id 填入服务端的 id

这样一切弄完后,在配置一下 socks_proxy 的环境变量即可。

export socks_proxy=https://127.0.0.1:1080;"

当然也可以把 http_proxyhttps_proxy 代理填入。

若是你想在浏览器使用:

  • firefox 相对方便,直接在设置中选择 socks5 代理,地址即填入配置文件中的:127.0.0.1:1080
  • chrome 可以去下载 名为 SwitchyOmega 的插件,也使用 sock5 配置即可

使用 WebSocket+TLS+Web 完成伪装

此处先给出参考的文章引用,在文章末尾也会重复给出,感谢各位前辈的教程。

在完成了之前那些操作后,自然是可以正常使用 v2ray 的,但是非常容易被封杀(我的坚持了两天hhhhh),这也是我后来才得知道的 :(

总之,被封杀了我便意识到了伪装是极其重要的,以下先介绍一些概念名称,我刚开始接触这一部分便直接放弃了,但遗憾的是这一部分却又不得不学,GFW 太强啦,我们只能被迫去与之对抗。

TLS

TLS 加密,TLS 中文叫 传输层安全性协议,以下是 wikipedia 的描述:

将通信两方交换的资料做加密,保证两个应用间通信的保密性和可靠性,使客户与服务器应用之间的通信不被攻击者窃听

这是用来加密的,广为人知的 HTTP 在经过 TLS 加密后,成为了HTTPS

若是 v2ray 的流量没有被 TLS 加密,那么审查者便能根据数据内容分析出,这是违“法”的数据,而且代理流量源源不断地从固定 ip 发来,这样的流量同样是不正常的。

网站前置伪装 与 websocket 协议

仅用 TLS 加密依旧是不够的,因为流量不正常,这些大规模的流量因为代理的原因来去于同一个ip,这样的流量即使是加密的,也应该是有问题的。所以,需要再完成一次伪装,使用 Nginx 与 域名 搭建一个真实的网站,我们的客户端通过 websocket(ws)协议与这个用 Nginx 作为前端的网站进行数据交流,这样一来,我们的服务器就是正儿八经的网站服务器(事实也确实如此),而非代理服务器,在找到某种特征之前,不可能大面积封杀这样的正常服务器。

使用,我们现在的任务很简单,购买一个域名(可以是免费的二级域名),在我们的 VPS 中通过 Nginx 搭建一个真实但简单的网站,然后让客户端和服务器端通过ws协议交流,接着通过 Nginx 分流特定的路由。

看完了 NeoVim 的 Tutor 文档

今天闲得没事干,于是想起了可以看看 NeoVim 提供的入门文档,是的,它是全英文的,但是里面的单词还是很简单的,颇为流畅地通读了一遍。之前只是知道一些零零散散的命令,如今感觉好多了,又学习到了很多新的知识。

dwm 和 st 的安装及补丁

前言

得益于近些日子在学校深入学习了很多关于 Linux 的知识,加之之前也多次重装过 Arch ,这些因素综合起来后,这一次的系统安装可以说颇为顺畅,之前因无法理解的地方而导致难以下手的操作,所赖知识见长,逐渐克服且熟练了起来。

本次为了更加深入地去学习 Linux ,所以放弃了像 Gnome 这样简单易用的桌面环境, 而是使用像 DWM 这样更简单的窗口管理器,虽然是自找麻烦,但我也乐在其中,我会在本文中简略地记录下折腾的过程。

DWM 和 st 的安装

事实上安装 DWM 非常的简单,自需要从 suckless 官网下载源码文件即可。


$ git clone git://git.suckless.org/dwm
$ cd dwm
$ make
# sudo make install

编译安装后,我这里是通过 xrog 的 .xinitrc 从 tty 终端使用 startx 命令启动的:

exec dwm

启动之后的第一眼就是简陋,目前还什么都干不了,因为我甚至还没安装终端,suckless 也提供了一个 xrog 下的终端实现,叫 st 。 通过魔法键回到 tty (ps.当然也可以通过快捷键:Alt + Shift + Q 退出 dwm ),通过 tty 的终端去下载 st 源码。

同样也是通过源码安装:

$ git clone https://git.suckless.org/st
$ cd st
$ make
# sudo make install

编译安装完后,在dwm便应该通过Alt + Shift + Enter 组合键启动 st 管终端。但是毫无疑问,也是十分简陋,甚至字体小到无法看清……

不过问题不大,我学过 C ,源码文件是能看懂的,首先就是修改了字体大小,顺带一提我还通过 pacman 包管理下载了 [ttf-fira-code] 字体。

首先来修改一下 dwm 的字体和其大小:

# dwm > config.h

static const char *fonts[]          = { "Fira Code:size=14" };
static const char dmenufont[]       = "Fira Code:size=14";

保存后通过 sudo make clean install 命令安装即可

接着修改 st 终端的字体和大小:

# st > config.h

static char *font = "Fira Code:style=Bold:pixelsize=23:antialias=true:autohint=true";

保存后通过 sudo make clean install 命令安装即可

这样修改完后,便好看很多了。

安装 dmenu

这个就是 suckless 的程序托盘? 总之,安装后,可以快速打开程序,也是蛮好的,这个就没有使用源码安装了,不过听说它也有很多好玩之处,之后再研究吧,总之 dmenu 通过包管理器安装:

$ sudo pacman -S dmenu

给 dwm 打补丁

Dwm 目前其实足够我使用了, 这里就打一个透明补丁: 「 alpha.diff

$ wget https://dwm.suckless.org/patches/alpha/dwm-alpha-20201019-61bb8b2.diff
$ patch p1 < dwm-alpha-20201019-61bb8b2.diff

通过 patch 命令 把补丁打进去即可,之前我都没怎么用过这个 patch 命令,用多了其实也还好,出现错误了,手动去修改源文件即可。

给 st 打补丁

这里打了好几个补丁:

也是一样地通过 patch 命令打进去,这里就不再赘述了。

安装 picom

这是一个合成管理器,可以给窗口管理器带来需要效果,比如透明、阴影,上面的透明补丁也需要它的安装才能真正起作用。

$ sudo pacman -S picom

安装完后,编辑 ~/.xinitrc 文件,进程让它以 Daemon(后台) 的形式运行。

compton -b

(未完待续)