在家远程访问办公室电脑(受腾讯iOA限制)综合方案:EasyTier 组网 + 代理切换 + 宿主 RDP 控制
一、背景与目标
办公室机器是 WSL2(用户 usera,主机 DESKTOP-xxx),需实现三件事:
-
在家访问办公室 WSL 内服务;
-
在家 RDP 控制办公室 Windows 宿主,进而操作办公机及其 WSL 内服务;
-
在 WSL 内灵活切换代理(自建 gost / 公司腾讯 iOA)。
约束(决定方案的关键):
-
办公室宿主机装有腾讯 iOA 管控软件,不在白名单的软件无法联网 → Windows 宿主装 EasyTier 无效;但 WSL 已申请加白名单,可正常联网。
-
公司网 ACL 拦跨段入站 → 家里无法直连宿主真实 IP 的 RDP。
二、环境一览(已验证)
| 项 | 值 |
|---|---|
| 办公室机器 | WSL2(Ubuntu),用户 usera,主机 DESKTOP-xxx |
| 办公室内网 | WSL eth1 / 宿主 WLAN 均为 10.66.18.94/20(子网 10.66.18.0/20,镜像模式同 IP) |
| 宿主 RDP | 端口 13389(注册表 PortNumber=13389,监听 0.0.0.0:13389) |
| WSL 网络模式 | 镜像模式(mirrored)(.wslconfig 中 networkingMode=mirrored) |
WSL 内 127.0.0.1:13389 | 通(镜像模式下 localhost 与宿主共享 = 宿主 RDP) |
| EasyTier 虚拟 IP | 192.168.10.10(固定) |
| 家里服务端 | easytier.t.xyz:11010(TCP 监听,网络中心) |
| 家里其他节点 | ubuntu26(192.168.10.1)、usera-WIN11(192.168.10.2) |
| EasyTier 安装目录 | /opt/easytier/,核心 easytier-core,管理 easytier-cli |
| 配置目录 | /opt/easytier/config/,service 模板 easytier@.service |
| 代理 A(自建) | gost:https://usera:0000@1.t.xyz:18888 |
| 代理 B(公司) | 腾讯 iOA 本机 127.0.0.1:12639(Windows 系统级,WSL 默认继承) |
| SSH | openssh-server 已装(1:9.6p1),/usr/sbin/sshd;unit 名 ssh.service(非 sshd.service) |
三、WSL 内 EasyTier 组网与安装
3.1 拓扑与模式选择
-
办公室 WSL 作为 peer 连回家里服务端
easytier.t.xyz:11010。 -
最终采用 TUN 模式 + 固定虚拟 IP(
no_tun = false,ipv4 = "192.168.10.10")。
> 历史备注:早期曾试 --no-tun + --proxy-networks(免 TUN 设备);但该模式下虚拟 IP 默认动态分配,节点 IP 会漂移,最终改为固定 IP 方案。
- 虚拟网段
192.168.10.0/24。
3.2 关键踩坑(务必先看)
- 端口 11010 被 systemd 占用:安装脚本会生成并默认拉起
easytier@default.service监听 11010,手动命令行启动会报Address in use (os error 98)。
- 解决:不要 pkill 手动起,改为改配置 + systemctl restart;或停掉 default 实例让新实例独占。
-
配置字段名:命令行
--help显示-i, --ipv4→ TOML 字段是ipv4(不是ipv4_addr)。 -
固定 IP 原理:
--ipv4为空时该节点只转发、不分配虚拟 IP;指定ipv4后还需同时配dhcp = false关闭动态分配,否则仍可能漂移/被重新分配。两者必须一起设置。
3.3 安装(官方 install.sh 脚本)
# 1) 装依赖(脚本解压 release 需要 unzip)
sudo apt update && sudo apt install -y curl unzip
# 2) 下载官方安装脚本
curl -fsSL "https://github.com/EasyTier/EasyTier/blob/main/script/install.sh?raw=true" -o /tmp/easytier-install.sh
# 3) 执行安装(install.sh 自动下载最新 release、解压并安装到 /opt/easytier)
sudo bash /tmp/easytier-install.sh install
# 4) 验证安装成功(两个二进制:easytier-core 守护进程、easytier-cli 命令行工具)
/opt/easytier/easytier-core --version
/opt/easytier/easytier-cli --help
安装脚本会一并生成 systemd 模板服务
/etc/systemd/system/easytier@.service和默认配置/opt/easytier/config/default.conf,下面直接复用,无需手写。
3.4 写配置文件
由默认配置复制一份,改成本机参数:
# 复制默认配置为 office 实例的配置
sudo cp /opt/easytier/config/default.conf /opt/easytier/config/office.conf
# 编辑(如用 vim,注意权限,可能需要 sudo)
sudo vim /opt/easytier/config/office.conf
office.conf 最终内容如下(关键字段已标注):
instance_name = "ubuntu26"
dhcp = false # ← 关闭动态分配,配合固定 ipv4
ipv4 = "192.168.10.10" # ← 固定本机虚拟 IP
listeners = [
"tcp://0.0.0.0:11010",
"udp://0.0.0.0:11010",
"wg://0.0.0.0:11011",
"ws://0.0.0.0:11011/",
"wss://0.0.0.0:11012/",
]
exit_nodes = []
rpc_portal = "0.0.0.0:0"
[[peer]]
uri = "tcp://easytier.t.xyz:11010" # ← 中心服务器地址
[network_identity]
network_name = "ubuntu26" # ← 与家里节点一致
network_secret = "0000" # ← 与家里节点一致(示例值,生产请更换)
[flags]
default_protocol = "tcp"
dev_name = ""
enable_encryption = true
enable_ipv6 = true
mtu = 1380
latency_first = false
enable_exit_node = false
no_tun = false
use_smoltcp = false
foreign_network_whitelist = "*"
disable_p2p = false
p2p_only = false
relay_all_peer_rpc = false
disable_tcp_hole_punching = false
disable_udp_hole_punching = false
注意:
listeners/peers写法须与原文一致(字符串或数组),改前先cat备份。
3.5 启动服务并验证
# 1) 停掉并禁用安装脚本默认启用的 default 实例(避免多实例冲突)
sudo systemctl stop easytier@default
sudo systemctl disable easytier@default
# 2) 启用并启动 office 实例(模板服务 %i=office,自动加载 office.conf)
sudo systemctl enable easytier@office
sudo systemctl start easytier@office
# 3) 查状态,应 active (running)
sudo systemctl status easytier@office
# 4) 验证虚拟 IP 已分配
ip addr show | grep 192.168.10.10
# 5) 查看 peer 连通状态(应看到本地 192.168.10.10/24 及远端节点 p2p 通)
sudo /opt/easytier/easytier-cli peer
3.6 固定 IP 验证
sudo systemctl restart easytier@office
sudo /opt/easytier/easytier-cli peer # 本机应稳定显示 192.168.10.10
若家里两台也想固定,分别配 ipv4 = "192.168.10.1" / "192.168.10.2"(同样配 dhcp = false),全段即固定。
3.7 连通性排查命令
sudo ss -tlnp | grep 11010 # 看端口占用
sudo journalctl -u easytier@office --no-pager -n 40 # 启动错误
sudo journalctl -u easytier@office | grep -i proxy # 子网代理是否注册
sudo /opt/easytier/easytier-cli peer # 邻居/p2p/延迟/丢包
wsl保活
wsl终端一旦关闭,wsl虚拟机就会自动关,导致easytier断联,可以参考https://jishuzhan.net/article/2061265285704921090 进行wsl保活。
主要步骤:
1. 创建开机自启动文件
按 Win + R,输入以下路径打开启动文件夹:
%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup新建文件 wslstart.cmd,内容如下:
@echo off
:: 保持 WSL 后台运行,供 Hermes Agent 使用
start /b wsl -d Ubuntu24.04 --exec dbus-launch true(将 Ubuntu 替换为你实际的发行版名称)
重启电脑后,WSL 将自动在后台运行。
二、常用管理命令
wsl -l -v # 查看 WSL 状态
wsl --shutdown # 完全关闭 WSL(释放资源)
wsl -d Ubuntu # 连接到后台实例四、RDP 控制宿主(socat 中继方案)
4.1 核心原理
镜像网络模式下,WSL 的 127.0.0.1 与宿主共享,因此 WSL 内访问 127.0.0.1:13389 就等于访问宿主 RDP。
只需在 WSL 里用 socat 做一次端口转发,把 EasyTier 虚拟 IP 上的一个端口”搬”到宿主 RDP:
家里 → EasyTier 隧道 → 192.168.10.10:23389 → socat → 127.0.0.1:13389 → 宿主 RDP
全程 RDP 流量在 EasyTier 加密隧道内,不进公司网 ACL,绕过跨段拦截。
为什么监听端用 23389 而不是 13389
镜像模式共享网络栈,宿主 RDP 已监听 0.0.0.0:13389(覆盖所有接口),socat 再绑 192.168.10.10:13389 会端口冲突(Address already in use)。因此监听端换成 23389,转发目标仍是宿主的 127.0.0.1:13389。
4.2 前置条件
-
WSL 内已装并运行 EasyTier(systemd 服务
easytier@office.service),虚拟 IP 固定192.168.10.10(见第三节)。 -
WSL 为镜像网络模式(见 4.4)。
-
家里节点已连入同一 EasyTier 网络,能直连
192.168.10.10。 -
宿主 RDP 端口为
13389(办公电脑由 IT/系统预设,非用户主动修改;若实际端口不同,按实际端口调整下文命令)。
4.3 验证宿主 RDP 端口(宿主侧执行)
在办公室 Windows 宿主 PowerShell 执行,确认 RDP 确实跑在 13389:
# 1) 查注册表 RDP 端口(十进制 13389,对应十六进制 0x34A9)
Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name PortNumber
# 2) 查监听状态:应看到 0.0.0.0:13389 LISTENING(监听所有接口)
netstat -ano | findstr :13389
# 或 PowerShell 等价写法
Get-NetTCPConnection -LocalPort 13389 -State Listen
# 3) 本机连通性:源=目的均为本机,验证 RDP 服务本身可用
tnc 127.0.0.1 -Port 13389
# 4) 确认远程桌面服务在运行
Get-Service TermService
预期结果:
| 命令 | 预期输出 |
|---|---|
注册表 PortNumber | 13389 |
netstat / Get-NetTCPConnection | 0.0.0.0:13389 LISTENING |
tnc 127.0.0.1 -Port 13389 | TcpTestSucceeded : True |
Get-Service TermService | Status : Running |
若注册表端口不是
13389,把下文所有命令里的13389换成实际端口即可。
4.4 确认 WSL 镜像模式
# 应看到 networkingMode=mirrored
cat /mnt/c/Users/<用户名>/.wslconfig
# 确认 WSL 的 eth1 与宿主 WLAN 同 IP
ip -4 addr show eth1
PS C:\Users\XXX> cat .wslconfig
[experimental]
autoMemoryReclaim=gradual
networkingMode=mirrored
dnsTunneling=true
firewall=true
autoProxy=true
若为 NAT 模式(默认网关是
172.x.x.1),本方案需调整,见「九、排错汇总」。
4.5 WSL 安装 socat
sudo apt update && sudo apt install -y socat
which socat # 确认路径,一般为 /usr/bin/socat
4.6 验证关键连通性(决定性一步)
# 测 WSL 内 localhost 是否等于宿主 RDP(镜像模式特性)
timeout 2 bash -c "echo > /dev/tcp/127.0.0.1/13389" 2>/dev/null \
&& echo "通:可继续" || echo "不通:见排错章节"
只有这一步「通」,方案才成立。
4.7 手动跑通 socat(可选,验证链路)
# 前台跑,看到连接日志即通(-d -d 只打印连接日志,不刷 RDP 二进制)
socat -d -d TCP-LISTEN:23389,bind=192.168.10.10,fork,reuseaddr TCP:127.0.0.1:13389
bind=192.168.10.10必须保留:只暴露在 EasyTier 虚拟网,不暴露到公司局域网。
家里测试:
tnc 192.168.10.10 -Port 23389 # 应 TcpTestSucceeded: True
mstsc /v:192.168.10.10:23389
4.8 systemd 保活(开机自启 + 崩溃自愈)
前提:WSL 已启用 systemd(ps -p 1 -o comm= 输出 systemd)。若未启用,先在 /etc/wsl.conf 加 [boot] systemd=true 并 wsl --shutdown 重启。
# 先停掉手动跑的 socat,避免端口占用
sudo pkill -f 'socat.*TCP-LISTEN:23389'
# 建服务(依赖 EasyTier,保证 EasyTier 重启时转发一起重建)
sudo tee /etc/systemd/system/rdp-forward.service > /dev/null <<'EOF'
[Unit]
Description=Forward EasyTier 23389 to Windows host RDP 13389
After=network-online.target easytier@office.service
Requires=easytier@office.service
[Service]
ExecStart=/usr/bin/socat TCP-LISTEN:23389,bind=192.168.10.10,fork,reuseaddr TCP:127.0.0.1:13389
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now rdp-forward
sudo systemctl status rdp-forward # 看到 active (running) 即成功
五、【可选】WSL 双代理一键脚本(~/proxy.sh)
5.1 需求与约束
-
两个代理互斥(环境变量同名,无法按目标分流叠加):gost(xyz) 与 公司 iOA。
-
xyz开 gost;off关脚本代理并保留 iOA;clear彻底清所有代理且常驻写入 ~/.bashrc;no_proxy始终常驻 bashrc。 -
关键发现:
off后公司 iOA 自动可用(iOA 是 Windows 系统级,WSL 默认继承,之前只是被脚本 unset 清掉)。
5.2 常驻块设计(~/.bashrc 内三段,带标记可幂等增删)
| 标记 | 内容 | 何时写入 |
|---|---|---|
proxy.sh no_proxy begin/end | export no_proxy/NO_PROXY="..." | 每次执行都重写(常驻) |
proxy.sh clear begin/end | unset http_proxy https_proxy all_proxy HTTPS_PROXY HTTP_PROXY ALL_PROXY | clear 时写;xyz/off 时删 |
proxy.sh begin/end | [ -f ~/.proxy-env.sh ] && . ~/.proxy-env.sh | xyz 时挂载;off/clear 时摘 |
5.3 指令语义
| 指令 | 当前终端 | bashrc clear 块 | 新终端效果 |
|---|---|---|---|
xyz | 注入 gost | 移除 | 走 gost |
off | 清脚本变量 | 移除 | 系统 iOA 自动恢复 |
clear | 清所有 | 写入 | 彻底无代理(含 iOA) |
5.4 用法
source ~/proxy.sh xyz # 开 gost,当前终端立即生效
source ~/proxy.sh off # 关脚本代理,iOA 恢复
source ~/proxy.sh clear # 常驻写入 unset,彻底无代理
~/proxy.sh status # 看状态
env | grep -i proxy # 看状态
source ~/proxy.sh xyz一步完成「生成配置 + 当前终端生效」;source ~/.bashrc只是重载旧文件,不能切换/开启。
5.5 no_proxy 固定值
localhost,127.0.0.1,::1,.t.xyz,192.168.10.0/24,10.66.18.0/20
-
用
.t.xyz(前导点)而非*.t.xyz,兼容性最广(覆盖 curl/wget/git/Go 等)。 -
含 EasyTier 虚拟网段与 WSL 子网,防止隧道流量被代理劫持导致掉线。
5.6 实现要点(踩坑修正记录)
-
sed多行替换用「先/BEGIN/,/END/d删块再追加」,不用c\(GNU sed 多行不稳定)。 -
clear的unset行必须写进 bashrc 常驻(用户要求),而非仅当前终端执行。 -
iOA 用
127.0.0.1:12639按用户要求;若 WSL 内连不通,改IOA_HOST="AUTO"自动探测宿主 IP。
六、WSL 内 SSH 服务(供家里远程ssh登录)
6.1 现状
-
openssh-server已装(1:9.6p1),/usr/sbin/sshd存在。 -
systemd unit 名是
ssh.service(不是sshd.service),所以systemctl start sshd报Unit sshd.service not found。 -
ssh.socketenabled,ssh.servicedisabled。
6.2 首次启动必做
sudo ssh-keygen -A # 生成主机密钥(首次必做,否则 sshd 起不来)
sudo mkdir -p /run/sshd # WSL 需要此目录
sudo systemctl start ssh # 用 ssh.service,不是 sshd.service
sudo systemctl status ssh
sudo ss -tlnp | grep :22 # 确认监听 0.0.0.0:22 或 *:22
6.3 账号与登录
- 当前以
root@DESKTOP-xxx登录 WSL;家里连过来用usera需:
- 设密码:sudo passwd usera,或
- 放公钥:把家里公钥写入 ~usera/.ssh/authorized_keys。
- 开机自启:
sudo systemctl enable ssh。
6.4 踩坑
-
systemctl start sshd报 not found → 改用ssh.service(或ssh.socket)。 -
sshd 起不来多为缺主机密钥(
ssh-keygen -A)或/run/sshd目录不存在。 -
若
ss -tlnp | grep :22显示127.0.0.1:22,需改/etc/ssh/sshd_config的ListenAddress 0.0.0.0才能从虚拟网进来。
七、家里连接方法(SSH/RDP)
7.1 SSH 连办公室 WSL
隧道通后(EasyTier),在家里节点执行:
ssh usera@192.168.10.10
说明:WSL 内 sshd 监听
22;(可以按需改为高位不常用端口)
7.2 RDP 连办公室宿主
在家里的PC(已连接easytier节点)执行:
# 使用命令行进行远程桌面连接 或者使用GUI
mstsc /v:192.168.10.10:23389
-
端口填
23389(不是 13389); -
WSL 内服务仍走各自虚拟 IP 端口。
八、一键复盘清单(重装 WSL 后)
-
EasyTier:写
office.conf(含ipv4="192.168.10.10"+dhcp=false)→systemctl enable --now easytier@office→peer验证。 -
SSH:
ssh-keygen -A+mkdir /run/sshd+systemctl start ssh+ 设usera密码/公钥。 -
代理:粘贴
~/proxy.sh→source ~/proxy.sh xyz(或off用 iOA)。 -
RDP 中继:装 socat → 验证
127.0.0.1:13389通 → 建rdp-forward.service并 enable。 -
验证:家里
ping 192.168.10.10、ssh usera@192.168.10.10、mstsc /v:192.168.10.10:23389。
九、排错汇总
| 现象 | 原因 | 处理 |
|---|---|---|
EasyTier 手动启动报 Address in use | easytier@default 已占 11010 | 停用 default 实例,或改配置后 systemctl restart |
| 虚拟 IP 漂移 | 未配 dhcp=false / 未指定 ipv4 | 同时设置 ipv4="..." + dhcp=false |
socat 报 Address already in use | 监听端被占(尤其用了 13389 与宿主 RDP 冲突) | 换监听端口(如 23389),或 ss -tlnp | grep 23389 找占用 |
socat 报 Cannot assign requested address | EasyTier TUN 接口没起来,192.168.10.10 不存在 | 确认 EasyTier 运行,ip addr show | grep 192.168.10.10 |
WSL 内 127.0.0.1:13389 不通 | 非镜像模式(NAT 隔离),localhost 不共享 | 改用「宿主反向隧道」方案(宿主主动连 WSL,绕开 iOA 入站拦截) |
家里 tnc 不通 | EasyTier 未连上 / 家里不在同一网络 | 检查 easytier-cli peer 是否 p2p 通 |
systemctl start sshd 报 not found | unit 名是 ssh.service | 改用 systemctl start ssh |
| sshd 起不来 | 缺主机密钥 / 缺 /run/sshd 目录 | ssh-keygen -A + mkdir -p /run/sshd |
ssh 只监听 127.0.0.1:22 | sshd_config 默认绑定回环 | 改 ListenAddress 0.0.0.0 |
十、关键结论(坑点记录)
-
EasyTier 固定 IP 两件套:
ipv4 = "..."与dhcp = false必须同时设置,否则虚拟 IP 会漂移。 -
停用 default 实例:安装脚本默认拉起的
easytier@default会占用 11010 端口,新实例必须先停掉它。 -
镜像模式是 RDP 方案的基石:
networkingMode=mirrored让 WSL 的 localhost 与宿主共享,这是绕开 iOA 拦截、无需宿主装软件的关键。 -
不要用 13389 做 socat 监听端:镜像模式共享网络栈,与宿主 RDP 的
0.0.0.0:13389冲突。 -
bind=192.168.10.10必须显式指定:避免端口暴露到公司局域网,也避免与宿主端口冲突。 -
依赖 EasyTier 服务:
rdp-forward.service用Requires=easytier@office.service保证 EasyTier 重启时转发自动重建。 -
代理互斥与 no_proxy:gost 与 iOA 环境变量同名无法叠加;
no_proxy必须含虚拟网段与内网子网,否则隧道流量被劫持导致掉线。 -
ssh 的 unit 名是
ssh.service:不是sshd.service;首次需ssh-keygen -A+/run/sshd目录。 -
RDP 方案无需在 Windows 宿主安装任何软件,完全符合 iOA 出网白名单限制。