摘要:通过 systemctl --user 启动的 OpenClaw Gateway 服务默认不继承终端代理,导致无法连接 Telegram 等外网服务。本文教你使用 systemd 的 Drop-In 机制,只为该服务单独设置代理,安全、精准、持久生效。
🌐 问题背景:为什么 OpenClaw 连不上 Telegram?
你可能遇到过这种情况:
export http_proxy=http://192.168.31.197:7890
export https_proxy=http://192.168.31.197:7890
export all_proxy=socks5://192.168.31.197:7891
export no_proxy="localhost,127.0.0.1,192.168.0.0/16,.local"
- ✅ 成功;在终端执行
curl https://api.telegram.org
- ❌失败:但
systemctl --user start openclaw-gateway 作为后台服务 一直报网络超时或连接拒绝,导致Openclaw一直无法连接上Telegram。
原因很简单:
你在终端设置的代理(如 export http_proxy=...)只对当前 shell 有效。而 systemctl --user start openclaw-gateway 启动的服务由 systemd 管理,运行在独立环境中,完全“看不见”你的终端代理变量!
尤其 OpenClaw Gateway 依赖 Telegram Bot API,若无法走代理,核心功能将直接失效。
✅ 正确方案:使用 systemd “Drop-In” 覆盖机制
systemd 提供了一种优雅方式:不修改原始服务文件,仅通过覆盖目录添加代理配置。
🔧 步骤 1:确认服务位置
systemctl --user show -p FragmentPath openclaw-gateway.service
示例输出:
/home/Jaben/.config/systemd/user/openclaw-gateway.service
📁 步骤 2:创建覆盖目录
mkdir -p ~/.config/systemd/user/openclaw-gateway.service.d
📝 步骤 3:创建代理配置文件
nano ~/.config/systemd/user/openclaw-gateway.service.d/proxy.conf
填入你的代理信息(根据实际地址调整):
[Service]
# HTTP/HTTPS 代理(Clash 默认 7890)
Environment="http_proxy=http://192.168.31.197:7890"
Environment="https_proxy=http://192.168.31.197:7890"
Environment="HTTP_PROXY=http://192.168.31.197:7890"
Environment="HTTPS_PROXY=http://192.168.31.197:7890"
# SOCKS5 代理(Clash 默认 7891)
Environment="all_proxy=socks5://192.168.31.197:7891"
Environment="ALL_PROXY=socks5://192.168.31.197:7891"
# 排除本地和内网
Environment="no_proxy=localhost,127.0.0.1,192.168.,.local"
Environment="NO_PROXY=localhost,127.0.0.1,192.168.,.local"
💡 小贴士:
- 同时设置大小写变量,兼容不同语言(Node.js / Go / Python 等)。
192.168. 可匹配所有 192.168.x.x 内网地址,比 CIDR 更通用。
🔄 步骤 4:重载并重启服务
systemctl --user daemon-reload
systemctl --user restart openclaw-gateway
一键命令输入
mkdir -p ~/.config/systemd/user/openclaw-gateway.service.d
cat > ~/.config/systemd/user/openclaw-gateway.service.d/proxy.conf <<EOF
[Service]
Environment="http_proxy=http://192.168.31.197:7890"
Environment="https_proxy=http://192.168.31.197:7890"
Environment="HTTP_PROXY=http://192.168.31.197:7890"
Environment="HTTPS_PROXY=http://192.168.31.197:7890"
Environment="all_proxy=socks5://192.168.31.197:7891"
Environment="ALL_PROXY=socks5://192.168.31.197:7891"
Environment="no_proxy=localhost,127.0.0.1,192.168.,.local"
Environment="NO_PROXY=localhost,127.0.0.1,192.168.,.local"
EOF
🔍 如何验证代理是否真正生效?
✅ 方法 1:查看进程真实环境(最可靠!)
运行以下命令:
PID=$(systemctl --user show openclaw-gateway -p MainPID --value)
tr '\0' '\n' < /proc/$PID/environ | grep -i proxy
🟢 成功走代理的输出示例:
http_proxy=http://192.168.31.197:7890
https_proxy=http://192.168.31.197:7890
HTTP_PROXY=http://192.168.31.197:7890
HTTPS_PROXY=http://192.168.31.197:7890
all_proxy=socks5://192.168.31.197:7891
ALL_PROXY=socks5://192.168.31.197:7891
no_proxy=localhost,127.0.0.1,192.168.,.local
NO_PROXY=localhost,127.0.0.1,192.168.,.local
✅ 如果你看到类似以上内容,说明代理环境变量已成功注入到 OpenClaw 进程中!

🔴 未配置代理的输出:
(无任何输出)
或仅显示其他无关变量(如 PATH、HOME),但没有 proxy 相关字段。
📊 方法 2:观察服务日志(功能级验证)
journalctl --user -u openclaw-gateway -f
🟢 成功走代理的日志特征:
- 不再出现
ETIMEDOUT、ECONNREFUSED、getaddrinfo ENOTFOUND 等网络错误;
- 出现类似以下成功连接信息:
[INFO] Connected to Telegram Bot API successfully
[DEBUG] Fetched remote config from https://api.openclaw.com/v1/config
[INFO] Gateway online and ready
🔴 未走代理的典型错误:
Error: connect ETIMEDOUT 149.154.167.220:443
at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1494:16)
[ERROR] Failed to connect to Telegram API
💡 149.154.167.220 是 Telegram 的 IP,国内直连通常超时。
⚠️ 重要提醒
systemctl --user show --property=Environment openclaw-gateway可能不显示代理变量,这是 systemd 的显示限制,不代表没生效!
- 请以
/proc/$PID/environ 和实际日志行为准。
🛡️ 为什么推荐这种方式?
| 优势 |
说明 |
| ✅精准隔离 |
仅影响 openclaw-gateway,其他程序不受干扰 |
| ✅无需全局代理 |
避免整个系统流量被代理,更安全 |
| ✅持久生效 |
重启后依然有效,无需手动干预 |
| ✅非侵入式 |
不修改原始服务文件,便于升级维护 |
💬 结语
下次再遇到 systemctl --user 服务无法访问外网的问题,记住:它需要自己的代理配置!
这一招不仅适用于 OpenClaw,也适用于任何基于 Node.js、Electron、Python 的 systemd 用户服务。

如有修改将更新在文章底部留言,觉得有用可以点赞+转发+推荐,点点关注,你的支持是我更新的最大动力❤。