如何在公司办公室里远程工作

2018/07/23

如果你家里用一个 NAS 的话会很自然地想到我能不能在地铁上用手机浏览阅览 NAS 上的内容. 如果你上班时必须使用公司发的 Mac 的话能随时访问家里运行 Linux 的笔记本就变成了一个很强的需求. 很自然的就会想到用 VPN, 先列一下需求再来决定该用什么样子的 VPN

  1. 是个 VPN
  2. 加密
  3. 多平台支持
  4. 可扩展性
  5. 可批量部署
  6. 起码能跑 50MiB/s, 要高于常见设备的 Wifi 速度
  7. 能局域网和公网混用

使用这个 VPN 的流程应该是

  1. 部署 VPN 服务器
  2. 分发配置
  3. 每个客户端启动 VPN client, 加一条 /24 的路由指向 VPN server
  4. 某些情况下再加一条 /0 路由, 启动全局 VPN
  5. 在两个 client 互相可见的情况下直接通讯, 不可见时才通过 VPN server 通讯

这第 5 条需求叫做 mesh net, 常见于无线通讯等两个 client 可能互相看不见的情况 WIKI, 以前用 ZigBee 接触过这种网络结构, 但那时用的 SDK 封装的很完全, 我只管发包就好.

确定了需求之后选择软件

VPN 名字为啥不行
SS/V2Ray不是个 VPN
裸 IPsec山寨路由器不支持, 不知道怎么死的
OpenVPN会被墙
L2TP部署复杂, 山寨路由器上速度只有 3MiB/s
WireGuard目前不支持 Mesh

最后选择了 tinc 因为他们的 goals 就是我的需求

搭建 tinc 网络

tinc 没有客户端和服务器端, 每个 tincd 都会监听一个 udp 端口, 接受其他 tincd 的链接

一个标准并完整的 tinc 配置文件长这样

sa@mac /e/tinc> tree
.
├── ed25519_key.priv
├── hosts
│   ├── mac
│   ├── tx
│   └── vultr
├── rsa_key.priv
├── tinc-up
└── tinc.conf

网络拓扑图:

tinc 运行时有三种模式, 分别对应 hub switch router, 我这里运行模式全是 router, 所以需要手动配一下 ip, 上面拓扑图中的 ip 要同时写在系统的路由表(tinc-up)和 tinc 自己的路由表( host/*) 中.

拓扑图中的连线没有意义, 因为 mesh 网络会自动发现可以连接的设备, 我配置的 tincd 一开始都会去连接 vultr 和 tx 两台机器, 获取元数据后会开始和别的 tincd 互联.

值得一提的是 vultr 的 subnet 是 /0 原因是这样子当 tincd 运行时会把所有的包当做内网包, 从实现使用流程中的第4条.

我并没有把内网 ip 和 vpn 内 ip 整合, 虽然 tinc 内可以跑 dhcp 协议, 但并不是所有客户端都能运行 dhcp 客户端

使用体验

tinc 有一套消息序号, 所以只能用一个线程处理一个连接.

在 J1800 上使用 HTTP 下载文件, 最大速度是 65MiB/s 没有达到千兆, 此时 J1800 已经满载.

两台机器不互相通讯时连接建立的时间相当长, 但互相通讯时(哪怕只有一个 ping) 连接建立需要5-10秒, 直接体验就是 vpn 内拷贝文件前几秒速度只有3MiB/s, 然后飙升至65MiB/s

如何在办公室远程工作?

ssh [email protected]  "ssh [email protected]"
sudo mount -t nfs -o resvport,rw 10.1.0.4:/data /private/nfs