在 Windows Server 上运行 Xray:启动、权限与故障恢复

在 Windows Server 上运行 Xray:启动、权限与故障恢复

Ryan Foster
2026年10月11日· 6 分钟阅读

在 Windows Server 上运行 Xray,可以用专用低权限账户配合任务计划程序实现开机启动。本文限定 Windows Server 2022 x64 与 Xray v26.3.27,以一个 VLESS/REALITY 连接说明失败、升级和撤销检查。内容依据官方资料编写,未完成作者端到端自测。

关键要点

  • 普通 Xray 可执行文件不是原生 Windows 服务,由一个计划任务直接管理进程。
  • 运行账户只读程序与配置,仅日志目录可写。
  • 只放行一个可信客户端来源和一个 TCP 端口,保留独立管理通道。
  • 监听成功、配置检查通过,都不能代替真实代理认证。

何时适合在 Windows Server 上运行 Xray?

先按自建责任与恢复清单确定维护人。如果只需要日常出口,先比较维护 VPS 与使用托管 VPN 的责任,再决定是否承担 Windows 更新和凭据维护。本文的增量是 Windows 生命周期,不重写 Linux 部署。

核心与客户端的角色说明解释了为何安装程序不等于配置浏览器。还要区分协议、传输与混淆层:VLESS、RAW、REALITY 和应用代理设置分别负责不同环节。

改动主机前要准备什么?

使用获授权的专用 Server 2022、独立恢复控制台和另一台 Windows 客户端。准备自有或明确获准用于本实验的 TLS 1.3 目标,其证书与域名须匹配;无法满足就停止,不随意借用第三方网站名称。

记录防火墙配置文件、入站规则、监听端口、任务和管理通道,并通过救援路径重新登录一次。设备排障基线可帮助区分客户端故障。

示例用 TCP 24443。执行前替换全部大写占位符:SERVER_LISTEN_IP 是主机实际接口地址,可能是供应商 NAT 后的私有地址;SERVER_ADDRESS 是客户端可达地址;TRUSTED_CLIENT_PUBLIC_IP 是服务器看见的客户端来源,不是客户端局域网地址。

步骤 1:安装官方包并完成 Xray Windows 权限配置

通过浏览器从官方 v26.3.27 下载 Xray-windows-64.zip,保留正常 TLS 校验,解压到 C:\Xray\bin,建立 C:\Xray\config、C:\Xray\logs。不用教程镜像安装器;记录包版本,以后升级前私下保留旧可信包。[1]

在计算机管理中新建标准本地账户 XrayRunner,设置独立密码,不加入 Administrators。在本地安全策略中授予“作为批处理作业登录”;域策略可能覆盖它,应先确认策略所有者。密码存入操作者使用的凭据管理工具,不写入脚本。

用管理员 PowerShell 限制以下新建目录;不要把命令套到共享安装目录。

$svc = "$env:COMPUTERNAME\XrayRunner"
icacls C:\Xray /inheritance:r
icacls C:\Xray /grant:r '*S-1-5-18:(OI)(CI)F' '*S-1-5-32-544:(OI)(CI)F' "${svc}:(OI)(CI)RX" /T
icacls C:\Xray\logs /grant:r "${svc}:(OI)(CI)M" /T

SID 保留 SYSTEM、Administrators 的完整权限,运行账户只读程序与配置、可修改日志。运行后查看 icacls,包括额外显式授权;取消继承不会自动删除它们,应仅移除本目录中不适当的权限。

步骤 2:建立单一认证配置并前台检查

先运行版本、UUID、X25519 命令,私下保存 UUID 和私钥。本版本的客户端 X25519 值标为 Password,填入客户端 realitySettings.password,不能拿服务器私钥替代。用密码管理器生成随机 16 位十六进制 short ID。[2][3]

C:\Xray\bin\xray.exe version
C:\Xray\bin\xray.exe uuid
C:\Xray\bin\xray.exe x25519
C:\Xray\bin\xray.exe run -test -config C:\Xray\config\server.json
C:\Xray\bin\xray.exe run -config C:\Xray\config\server.json

把下列配置保存为 C:\Xray\config\server.json 后,才执行上面最后两条命令。两处 OWNED_TLS_NAME 均替换为获准目标名。固定版本源码使用 clients、network,不能未经核对照搬新版在线示例。

{
  "log": {"error": "C:\\Xray\\logs\\error.log", "loglevel": "warning"},
  "inbounds": [{
    "listen": "SERVER_LISTEN_IP", "port": 24443, "protocol": "vless",
    "settings": {"clients": [{"id": "GENERATED_UUID", "flow": "xtls-rprx-vision"}], "decryption": "none"},
    "streamSettings": {
      "network": "raw", "security": "reality",
      "realitySettings": {
        "show": false, "target": "OWNED_TLS_NAME:443", "xver": 0,
        "serverNames": ["OWNED_TLS_NAME"],
        "privateKey": "GENERATED_PRIVATE_KEY", "shortIds": ["GENERATED_HEX_ID"]
      }
    }
  }],
  "outbounds": [{"protocol": "freedom", "tag": "direct"}]
}

通过“以其他用户身份运行”打开 PowerShell,以 XrayRunner执行检查和前台启动。管理员运行成功不证明该账户能读配置。遇到配置错误、私钥不可读或端口占用就停止;注册任务前关闭前台实例。

步骤 3:设置无需登录的 Xray Windows 开机启动

在管理员 PowerShell 注册一个任务,操作直接执行 Xray,显式填写工作目录和绝对配置路径,不使用会脱离子进程的启动器。保存密码的任务登录方式允许无人登录时启动。[4]

$action = New-ScheduledTaskAction -Execute 'C:\Xray\bin\xray.exe' -Argument 'run -config C:\Xray\config\server.json' -WorkingDirectory 'C:\Xray'
$trigger = New-ScheduledTaskTrigger -AtStartup
$settings = New-ScheduledTaskSettingsSet -RestartCount 3 -RestartInterval (New-TimeSpan -Minutes 1) -MultipleInstances IgnoreNew -ExecutionTimeLimit ([TimeSpan]::Zero)
$cred = Get-Credential -UserName "$env:COMPUTERNAME\XrayRunner" -Message 'Task account'
Register-ScheduledTask -TaskName 'Xray-Lab' -Action $action -Trigger $trigger -Settings $settings -User $cred.UserName -Password $cred.GetNetworkCredential().Password -RunLevel Limited
Start-ScheduledTask -TaskName 'Xray-Lab'
Get-ScheduledTaskInfo -TaskName 'Xray-Lab'
Get-NetTCPConnection -State Listen -LocalPort 24443

这里最多重试三次,间隔一分钟;重复启动忽略,常驻进程不设正常运行时限。这是有界策略,不保证修复任意卡死。任务状态和结果码只是线索,还要看真实进程与错误日志。

确认任务账户为 XrayRunner、选择“不管用户是否登录都要运行”、权限保持受限。恢复控制台可用后才重启。账户密码或批处理登录权限变更后,应更新任务凭据并重新检查无人登录启动。

步骤 4:只放行一个客户端并验证应用路径

保持防火墙开启、默认阻断未经请求的入站连接。先检查该程序或端口是否已有宽泛允许规则;新增窄规则不会抵消另一条宽规则。示例假定接口合理属于 Private;实际为 Public 时明确选择真实配置文件,不为放通而修改网络分类。[5]

New-NetFirewallRule -Name 'Xray-Lab-TCP' -DisplayName 'Xray Lab TCP' -Direction Inbound -Action Allow -Protocol TCP -LocalPort 24443 -LocalAddress 'SERVER_LISTEN_IP' -RemoteAddress 'TRUSTED_CLIENT_PUBLIC_IP' -Program 'C:\Xray\bin\xray.exe' -Profile Private

供应商防火墙也按相同来源和端口限制,不向全网开放 RDP,不动救援规则。在独立客户端放置同版 Xray,把以下内容保存为 client.json 并替换对应值。服务器私钥不离开服务器。

{
  "log": {"loglevel": "warning"},
  "inbounds": [{"listen": "127.0.0.1", "port": 1080, "protocol": "socks", "settings": {"auth": "noauth", "udp": false}}],
  "outbounds": [{
    "protocol": "vless",
    "settings": {"vnext": [{"address": "SERVER_ADDRESS", "port": 24443, "users": [{"id": "GENERATED_UUID", "encryption": "none", "flow": "xtls-rprx-vision"}]}]},
    "streamSettings": {
      "network": "raw", "security": "reality",
      "realitySettings": {"serverName": "OWNED_TLS_NAME", "fingerprint": "chrome", "password": "GENERATED_PUBLIC_VALUE", "shortId": "GENERATED_HEX_ID"}
    }
  }]
}

运行 xray.exe run -test -config client.json,再运行 xray.exe run -config client.json。Firefox 手动选择 SOCKS5 127.0.0.1:1080,启用 SOCKS5 代理 DNS;核对这次请求的出口 IP,再访问获准 HTTPS 目标。结果仅覆盖该请求,不证明全应用、DNS、IPv6 或 UDP 路径。

用临时客户端配置分别测试错误 UUID、未允许的服务器名,均不得完成预期认证代理请求。TCP 握手或目标站 fallback 响应不代表认证成功。恢复正确值,对照诊断,不公开凭据和日志。

失败、升级和撤销如何恢复?

读者检查预期证据停止或恢复
运行账户无法读配置启动失败,目标请求未成功只修配置 ACL,不授予管理员权限
连续启动两次只有一个目标 Xray 进程检查操作和重复任务,再开放访问
进程异常退出最多三次一分钟间隔重试查错误;未解决就禁用任务,离线修复
无人登录时重启正确账户、监听和认证请求恢复任务凭据或旧配置
客户端来源变化旧来源规则不再放行核实新地址,只改自有规则

升级前禁用并停止任务,确认进程和监听消失,私下备份程序、配置、ACL 记录与导出的任务。新官方包另处准备,阅读发行说明,以运行账户验证并重复正向、拒绝测试。失败就再次停止,在重新开放前恢复上一组程序与配置。

日志由操作者制定保留策略。本实验示例为每日查看;达到 10 MiB 时禁用并停止任务、私下归档 error.log,最多留七份,再启动并验证请求。会短暂停机,这是维护示例,不是 Xray 自带轮转保证;日志快速增长应调查,不靠删除掩盖。

撤销时执行下列命令,清除 Firefox 代理、停止客户端、撤销供应商规则和连接凭据。确认没有其他任务使用后才移除 XrayRunner。若仍有监听,先识别所有者,不批量结束全部 Xray 进程。

Disable-ScheduledTask -TaskName 'Xray-Lab'
Stop-ScheduledTask -TaskName 'Xray-Lab'
Remove-NetFirewallRule -Name 'Xray-Lab-TCP'
Get-NetTCPConnection -State Listen -LocalPort 24443 -ErrorAction SilentlyContinue
Unregister-ScheduledTask -TaskName 'Xray-Lab' -Confirm:$true

总结

  • 安装所有者与低权限运行账户分开。
  • 配置、任务、来源限制和认证请求分别验证。
  • 保留上一组包与配置,以及故障时仍可用的管理通道。
  • 先停自有任务、撤销访问,再删除资源。

常见问题

Xray 是原生 Windows 服务吗?

普通可执行文件不会因为在后台运行就实现服务生命周期。这里使用任务计划程序,不引入 SCM 服务包装器。

为什么需要独立账户?

低权限账户限制进程能修改的范围,同时仍须能读配置、写专用日志目录;不能用管理员运行代替权限设计。

配置测试通过就能联网吗?

配置测试只验证载入配置,不证明供应商防火墙、目标证书、客户端认证或应用实际网络路径可用。

为什么重启后才失败?

应查任务凭据、批处理登录权限、工作目录与目标可达性;管理员登录后的前台成功不能证明这些条件。

能限制移动网络客户端吗?

规则匹配服务器实际看见的来源地址。来源变化后先核实,再更新单一授权地址,不扩大为全网放行。

REALITY 错误客户端要证明什么?

错误 UUID 或未允许名称应阻止目标代理会话;不要求底层 TCP 端口拒绝每一次握手。

其他 Windows 版本可以照用吗?

先重新核对包支持、账户策略、任务和防火墙配置。本文基线是 Server 2022,不是经过实测的多版本矩阵。

免责声明:仅操作获授权基础设施并遵守适用规则。本文据下列官方资料编写,未在 Windows Server 上完成端到端自测。

来源:

  1. Xray-core v26.3.27
  2. Xray v26.3.27 VLESS configuration
  3. Xray v26.3.27 transport configuration
  4. Microsoft Task Scheduler
  5. Microsoft Windows Firewall

Sources checked 2026 年 10 月 11 日。


延伸阅读:

开启 3 天免费试用

注册即可免费体验全部高级功能。

*仅限新用户;每位用户只能获得一次试用。

在 Windows Server 上运行 Xray:启动、权限与故障恢复 | AethoVPN