我一直觉得,研发总监这个职位,除了开会、写周报和安抚研发组长,最核心的修养应该是:即便身在千里之外,也能让外地的设备和服务像接在公司机房交换机里一样丝滑。”
我决定在自家的 Unraid NAS 服务器上修一座“跨时空大桥”。
第一关:手撕 MFA 的“温柔杀手”
公司内网的 VPN 极其严苛,Cisco AnyConnect 配合 MFA 动态码。这意味着我每次拉代码,都得像网恋奔现一样,先掏出手机看动态码。
身为一个追求“全自动”的架构师,这绝对不能忍。我祭出了 OpenConnect 容器,并写了一段 Python 脚本,让它自己跟自己“握手”:
Docker部署命令
docker run
-d
--name='openconnect'
--net='br0'
--ip='192.168.50.94'
--pids-limit 2048
--privileged=true
-e TZ="Asia/Shanghai"
-e HOST_OS="Unraid"
-e HOST_HOSTNAME="NasTwo"
-e HOST_CONTAINERNAME="openconnect"
-l net.unraid.docker.managed=dockerman
-v '/mnt/user/appdata/openconnect/etc':'/etc/openconnect':'rw'
-v '/mnt/user/appdata/openconnect/config':'/config':'rw'
--entrypoint /bin/sh 'vimagick/openconnect' /config/connect.sh
connect.sh 脚本
#!/bin/sh
echo "=== 启动 ==="
# 1. 自动安装 Python 和 pyotp
apk add --no-cache python3 py3-pip iptables
pip install pyotp --no-cache-dir
# 2. 自动化获取 6 位动态码
MFA_CODE=$(python3 -c "import pyotp; print(pyotp.TOTP('J7V...FAKE_SECRET...K9Y').now())")
echo "获取到动态码: $MFA_CODE"
# 3. 开启转发闸门 (通往耶路撒冷的唯一路径)
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
iptables -I FORWARD -j ACCEPT
# 4. 暴力拨号
echo "MyPasswd${MFA_CODE}" | openconnect vpn.aurora-cloud.com:8777 \
--user="old_k_tech" --passwd-on-stdin --non-inter
最后,在路由器配置一条静态路由,就完成了。以我20年的计算机功力,这隧道必须轻松拿捏。我点了一根烟,下面就是见证奇迹的时刻。
我在办公电脑的浏览器中尝试打开公司内网服务,然后,无法访问。
第二关:被“大子网”掩埋的邻居
隧道打通后,最诡异的事情发生了:Unraid 宿主机能 ping 通公司,但我的办公电脑就是打不开网页。
排查了一通 tracert,我差点一口老血喷出来。因为我家里设备多,我随手把子网掩码设成了极其豪横的 255.255.0.0(/16 段)。
这里有个冷知识: 当掩码是 /16 时,电脑认为 192.168.x.x 全是自己家的。
当我访问公司 192.168.2.x 网段时,我的电脑会在家里 Wi-Fi 频道里扯着嗓子大喊:“嘿!隔壁住着 2.235 的兄弟在吗?”
结果: 公司机器在上海,当然没人理它。电脑觉得“既然邻居不在家,那就报错吧”,于是包根本没出家门。
为了治好办公电脑的“近视眼”,我给办公电脑下了一道命令:“以后看到 192.168.2.0 段的流量,别在院子里瞎喊,直接去找 openconnect(192.168.50.94)传话!”
:: Windows 管理员权限执行,永久生效route -p add 192.168.2.0 mask 255.255.255.0 192.168.50.20然而,依然不通。
第三关:Host 模式的“暴力美学”
命令敲完,我以为这波稳了,再次尝试 tracert 命令,依然无法访问。检查 tracert 命令返回结果,第一跳显示的是 192.168.50.20,紧接着就是一句冷冰冰的:无法访问目标主机。
我明明在路由表里写的是指向 .94(容器),为什么包却偏偏死活要往 .20(宿主机)身上撞?我又点了一根烟,经过一顿网络搜索和AI问答,发现问题出现在 Docker br0 (macvlan) 模式 上面。
在 br0 (macvlan) 模式下,宿主机与容器共用一根网线,但它们在内核层面上是互不相见的“异次元”。
由于 ARP 响应延迟或者 Unraid 网桥的特殊保护机制,当我尝试寻找 .94 时,宿主机 .20 的网络栈往往会抢先“应答”或者直接把包截获。
尴尬的一幕发生了: 数据包到了 .20 头上,但 .20 身上根本没有 tun0 隧道,它一脸懵逼,只能把包直接丢弃。
“既然独立 IP 玩不转,那就直接把‘灵魂’注入宿主机吧。”
修改 Docker 部署命令 net='host' :
docker run -d
--name='aurora_vpn'
--net='host'
--privileged=true
其他配置省略......
结局:38 毫秒的浪漫
重新配置静态路由路由、修改 openconnect 配置并重启容器、再次 tracert。

C:\Windows\System32>route -p add 192.168.2.0 mask 255.255.255.0 192.168.50.20
操作完成!
C:\Windows\System32>tracert -d 192.168.2.235
通过最多 30 个跃点跟踪到 192.168.2.235 的路由
1 3 ms 1 ms 2 ms 192.168.50.20
2 38 ms 38 ms 38 ms 192.168.10.1
3 * * *
4 39 ms 37 ms 38 ms 192.168.2.235
跟踪完成。
当 tracert 的第一跳落在 NAS 上,第二跳瞬间跨越千里出现在上海内网网关时,那种爽感,不亚于代码一次性跑通了 500 个单元测试。
延迟 38ms。
在沈阳的深夜里,我点开上海总部的研发看板,数据流丝滑得像在本地。
写在最后:为什么要折腾?
读到这里可能有人会问:“你费这么大劲,就为了免去几秒钟的 MFA 动态密码手动输入?”
对于一个有着 20 年“代码洁癖”的架构师来说,平庸的解决方案就是罪。在工作上有时候迫不得已妥协了,难道在自己可控的范围内,还不能追求完美和掌控么?
技术嘛,不折腾到极致,那还叫技术吗?那叫求生。而我,在享受快乐。