选好 硬件 和 文件系统, 后面就是安装系统和应用了, 为了使用 ZFS 和 docker, 我选择的系统是 Truenas Scale

相关的安装/使用教程有很多, 官方文档(英文)也很详细, 下面给出链接:

  1. 官方安装教程
  2. 官方Docker 使用教程

如果英文不过关也可以参照下面的第三方教程:

  1. TrueNAS SCALE小白级安装设置教程(物理机)
    上面的作者似乎对 Truenas scale 很有研究, 博客中有很多关于 Truenas scale 的使用研究和教程, 同时也发布了 B站 视频, 资料比较可靠.

依托于方便的 docker 我在 NAS 上部署了私有的 影音库 jellyfin , 电子书库 calibre百度网盘远程下载


什么是内网穿透

搬运一个易于理解的解释:

举个栗子:IP好比你家的大门,别人到你家玩就需要通过这扇门。

如果你家是别墅,那么别人可以直接找到你家大门,这就好比你有外网IP地址,外人可以通过这个IP地址直接找到你。

而你家如果是在小区的高楼里,这就相当于你只有内网IP地址,外人无法直接找到你家,要先找到小区,再找到几栋几层,而进入小区之后,通过几栋几层找到你,这个过程就叫端口映射,小区就充当路由器的角色。

而在疫情期间快递员不能直接送快递到你家门口,只能送到小区门口集中收件点,你要去这个收件点和快递员面对面收快递,这个快递收件点给你实现的功能就是内网穿透。

由于 IPV4 资源枯竭, 现在家用宽带基本上得不到公网IP(打电话都要不到)
为了能够远程访问上面那些在内网服务器中部署的服务, 就必须内网穿透

内网穿透的方案

实现内网穿透的方案有很多, 比如 蒲公英, 花生壳, zerotier 等
我使用的方案是 frp + openvpn

使用这种方案需要:

  1. 一台有公网IP的服务器
  2. 基本的 linux 技能

选择这种方案的原因是: 我手上正好有一台闲置的服务器可以用来做穿透, 同时 truenas 自带 openvpn, 而且如果使用 vpn, 我就相当于连上了家里的局域网, 能够访问家里的各个局域网设备, 而且不需要修改访问路径, 全部统一使用内网访问.

openvpn

首先需要设置 openvpn, 如上面所说, openvpn 已经内置在 truenas 中了, 但是需要调整一些参数来提升使用体验

tcp or udp

官方文档上说建议使用 udp, 但是由于 运营商对 udp 有做限速处理, 速度并不理想, 尽管延迟会低一点, 但实测带宽会比 tcp 低一半, 因此我使用的是 tcp

使用 tcp 还是 udp 需要自行测试(毕竟从原理上来说, udp 应该快于 tcp)

加密, 认证, 压缩

先说说 加密, 认证, 压缩 是用来干什么的?
加密: 提高数据安全性, 避免数据由于被监听而泄露, 默认加密方式是 bf-cfb
认证: 确保在和正确的 客户端/服务器 通信, 数据没有被篡改, 默认认证方式是 md5/sha1
压缩: 减小数据体积, 加快传输速度(但如果机器的性能较差, 压缩会得不偿失)

再说说我的选择:
由于 AEAD , 加密和认证是可以在一套算法中实现的, 而无需再专门选择 认证方式, 所以我选择的加密算法是 AES-128-GCM, 无认证算法
由于我更多的是传输媒体数据, 压缩算法效果有限, 尽管机器性能尚可, 但我还是没有开启压缩

这样的选择兼顾了合理的安全性和速度

tun or tap

简单说, 你是希望 vpn 转发 二层流量(数据链路数据帧) 还是 三层流量(网络层数据包), 两者各有利弊, 关于这一点, openvpn 的官方文档也有说明: 见此处

简单说, 如果你只是希望使用内网服务(只有访问内网的流量走 vpn), 那你就应该使用 tun, tap 通常用于桥接两个子网, 由于所有的流量都会通过 vpn, 所以效率相比 tun 要更低.

mtu

mtu(Maximum Transmission Unit), 配置合适的 mtu 对 VPN 的传输速度至关重要, 一开始使用默认的 mtu 速度低的可怜, 还以为是自带的 openvpn 有问题

mtu 值的大小需要自己去测, 下面给出测试方法: ping –l {数据包大小} –f {VPN网关ip}

数据包大小应该在 1400-1500 之间, 可以从 1500 开始尝试并逐步减小, 知道能够 ping 通为止, 假设最后得出的数据包大小为 x

最终 mtu 的值为 x+28

网关设置

最后需要在内网服务器的网关处设置静态路由, 确保 vpn 的流量能够到内网的vpn服务器上, 而不是被丢弃

vpn ip段	VPN IP段掩码	vpn服务器内网ip	跃点	转发端口
10.0.0.0	255.0.0.0	192.168.2.10	20	LAN

openvpn server配置

附加配置如下:

# 推送局域网网段给客户端
push "route 192.168.2.0 255.255.255.0"
# 上面设置的 mtu, 后面的 1452 需要替换成你测试的结果
tun-mtu 1452
# 允许同一账号多客户端登录
duplicate-cn
# 禁用 n 秒后重新协商
reneg-sec 0

frp

frp 分为 客户端 frpc 和 服务端 frps 两个部分, 将 frpc 部署在没有公网的内网服务器上, frps 部署在有公网的服务器上, 可以达到端口映射的效果

流量走向: openvpn客户端 -openvpn-> 公网服务器 -openvpn over frp-> 内网服务器

下面给出我的配置
frps:

[common]
bind_port =  frp 通信端口, 需要对客户端开放
authentication_method = token # 客户端的验证方式: 使用密码验证
token = 客户端的验证密码, 需要和客户端保持一致
tcp_mux = false # 禁用多路复用, 提升连接带宽上限

frpc:

[common]
server_addr = 服务器公网ip
server_port =  frp 通信端口, 和 frps 的 bind_port 保持一致
authentication_method = token # 客户端的验证方式: 使用密码验证
token = 客户端的验证密码, 需要和客户端保持一致
tcp_mux = false # 禁用多路复用, 提升连接带宽上限

[OPVN_tcp]
type = tcp
local_ip = 需要穿透的主机 ip
local_port = 需要穿透的本地端口
remote_port = 穿透服务器的目的端口

具体配置内容见官方文档:

  1. 官方示例
  2. 完整配置参考

Q.E.D.


此 生 无 悔 恋 真 白 ,来 世 愿 入 樱 花 庄 。