一只会思考的猪
一只会思考的猪
发布于 2026-05-07 / 0 阅读
0
0

1500公里的“数字幽灵”:内网穿透自救指南

我一直觉得,研发总监这个职位,除了开会、写周报和安抚研发组长,最核心的修养应该是:即便身在千里之外,也能让外地的设备和服务像接在公司机房交换机里一样丝滑。

我决定在自家的 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

最后,在路由器配置一条静态路由,就完成了。

第二关:被“大子网”掩埋的邻居

隧道打通后,最诡异的事情发生了:Unraid 宿主机能 ping 通公司,但我的办公电脑就是打不开网页。

排查了一通 tracert​,我差点一口老血喷出来。因为我家里设备多,我随手把子网掩码设成了极其豪横的 255.255.0.0​(/16 段)。

这里有个冷知识: 当掩码是 /16​ 时,电脑认为 192.168.x.x​ 全是自己家的。

当我访问公司 192.168.2.x​ 网段时,我的电脑会在家里 Wi-Fi 频道里扯着嗓子大喊:“嘿!隔壁住着 2.235 的兄弟在吗?”

结果: 公司机器在上海,当然没人理它。电脑觉得“既然邻居不在家,那就报错吧”,于是包根本没出家门。

第三关:Host 模式的“暴力美学”

为了解决这个“邻居误会”,我放弃了 Docker 默认的桥接模式,直接开启了 ​Host 模式​。这就像是把 VPN 网卡直接插在了 NAS 的脊梁骨上。

修改 Docker 部署命令 net='host' :

docker run -d 
  --name='aurora_vpn' 
  --net='host' 
  --privileged=true 
  其他配置省略......

最后一步,我给办公电脑下了一道“死命令”:

“以后看到 2 段的流量,别在院子里瞎喊,直接去找 NAS(192.168.50.20)传话!”

:: Windows 管理员权限执行,永久生效
route -p add 192.168.2.0 mask 255.255.255.0 192.168.50.20

结局:38 毫秒的浪漫

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。

在沈阳的深夜里,我点开上海总部的研发看板,数据流丝滑得像在本地。

写在最后:为什么要折腾?

技术人的浪漫,就藏在亲自打通的 tun0 网口和 0% 丢包率里。


评论