在家远程访问办公室电脑(受腾讯iOA限制)综合方案:EasyTier 组网 + 代理切换 + 宿主 RDP 控制

一、背景与目标

办公室机器是 WSL2(用户 usera,主机 DESKTOP-xxx),需实现三件事:

  1. 在家访问办公室 WSL 内服务

  2. 在家 RDP 控制办公室 Windows 宿主,进而操作办公机及其 WSL 内服务;

  3. 在 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).wslconfignetworkingMode=mirrored
WSL 内 127.0.0.1:13389(镜像模式下 localhost 与宿主共享 = 宿主 RDP)
EasyTier 虚拟 IP192.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 默认继承)
SSHopenssh-server 已装(1:9.6p1),/usr/sbin/sshd;unit 名 ssh.service(非 sshd.service

三、WSL 内 EasyTier 组网与安装

3.1 拓扑与模式选择

  • 办公室 WSL 作为 peer 连回家里服务端 easytier.t.xyz:11010

  • 最终采用 TUN 模式 + 固定虚拟 IPno_tun = falseipv4 = "192.168.10.10")。

  > 历史备注:早期曾试 --no-tun + --proxy-networks(免 TUN 设备);但该模式下虚拟 IP 默认动态分配,节点 IP 会漂移,最终改为固定 IP 方案。

  • 虚拟网段 192.168.10.0/24

3.2 关键踩坑(务必先看)

  1. 端口 11010 被 systemd 占用:安装脚本会生成并默认拉起 easytier@default.service 监听 11010,手动命令行启动会报 Address in use (os error 98)

   - 解决:不要 pkill 手动起,改为改配置 + systemctl restart;或停掉 default 实例让新实例独占。

  1. 配置字段名:命令行 --help 显示 -i, --ipv4 → TOML 字段是 ipv4不是 ipv4_addr)。

  2. 固定 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 前置条件

  1. WSL 内已装并运行 EasyTier(systemd 服务 easytier@office.service),虚拟 IP 固定 192.168.10.10(见第三节)。

  2. WSL 为镜像网络模式(见 4.4)。

  3. 家里节点已连入同一 EasyTier 网络,能直连 192.168.10.10

  4. 宿主 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
 

预期结果:

命令预期输出
注册表 PortNumber13389
netstat / Get-NetTCPConnection0.0.0.0:13389 LISTENING
tnc 127.0.0.1 -Port 13389TcpTestSucceeded : True
Get-Service TermServiceStatus : 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=truewsl --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 彻底清所有代理且常驻写入 ~/.bashrcno_proxy 始终常驻 bashrc。

  • 关键发现:off 后公司 iOA 自动可用(iOA 是 Windows 系统级,WSL 默认继承,之前只是被脚本 unset 清掉)。

5.2 常驻块设计(~/.bashrc 内三段,带标记可幂等增删)

标记内容何时写入
proxy.sh no_proxy begin/endexport no_proxy/NO_PROXY="..."每次执行都重写(常驻)
proxy.sh clear begin/endunset http_proxy https_proxy all_proxy HTTPS_PROXY HTTP_PROXY ALL_PROXYclear 时写;xyz/off 时删
proxy.sh begin/end[ -f ~/.proxy-env.sh ] && . ~/.proxy-env.shxyz 时挂载;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 多行不稳定)。

  • clearunset 行必须写进 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 sshdUnit sshd.service not found

  • ssh.socket enabled,ssh.service disabled。

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_configListenAddress 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 后)

  1. EasyTier:写 office.conf(含 ipv4="192.168.10.10" + dhcp=false)→ systemctl enable --now easytier@officepeer 验证。

  2. SSHssh-keygen -A + mkdir /run/sshd + systemctl start ssh + 设 usera 密码/公钥。

  3. 代理:粘贴 ~/proxy.shsource ~/proxy.sh xyz(或 off 用 iOA)。

  4. RDP 中继:装 socat → 验证 127.0.0.1:13389 通 → 建 rdp-forward.service 并 enable。

  5. 验证:家里 ping 192.168.10.10ssh usera@192.168.10.10mstsc /v:192.168.10.10:23389


九、排错汇总

现象原因处理
EasyTier 手动启动报 Address in useeasytier@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 addressEasyTier 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 foundunit 名是 ssh.service改用 systemctl start ssh
sshd 起不来缺主机密钥 / 缺 /run/sshd 目录ssh-keygen -A + mkdir -p /run/sshd
ssh 只监听 127.0.0.1:22sshd_config 默认绑定回环ListenAddress 0.0.0.0

十、关键结论(坑点记录)

  1. EasyTier 固定 IP 两件套ipv4 = "..."dhcp = false 必须同时设置,否则虚拟 IP 会漂移。

  2. 停用 default 实例:安装脚本默认拉起的 easytier@default 会占用 11010 端口,新实例必须先停掉它。

  3. 镜像模式是 RDP 方案的基石networkingMode=mirrored 让 WSL 的 localhost 与宿主共享,这是绕开 iOA 拦截、无需宿主装软件的关键。

  4. 不要用 13389 做 socat 监听端:镜像模式共享网络栈,与宿主 RDP 的 0.0.0.0:13389 冲突。

  5. bind=192.168.10.10 必须显式指定:避免端口暴露到公司局域网,也避免与宿主端口冲突。

  6. 依赖 EasyTier 服务rdp-forward.serviceRequires=easytier@office.service 保证 EasyTier 重启时转发自动重建。

  7. 代理互斥与 no_proxy:gost 与 iOA 环境变量同名无法叠加;no_proxy 必须含虚拟网段与内网子网,否则隧道流量被劫持导致掉线。

  8. ssh 的 unit 名是 ssh.service:不是 sshd.service;首次需 ssh-keygen -A + /run/sshd 目录。

  9. RDP 方案无需在 Windows 宿主安装任何软件,完全符合 iOA 出网白名单限制。