You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arch Linux下OpenVPN route-up脚本通过systemctl运行失败求助

解决Arch Linux下OpenVPN通过systemctl运行时route-up脚本失效的问题

我明白你现在的困扰——手动以root身份启动OpenVPN时,网络命名空间的配置顺风顺水,但换成systemd管理服务后,route-up脚本就彻底罢工了。这基本是因为systemd运行服务时的环境、权限或者执行上下文,和你直接root登录操作时不一样,咱们一步步来排查解决:

1. 先给route-up脚本做个“体检”

首先排除脚本本身的问题:

  • 脚本开头必须有正确的shebang,比如#!/bin/bash或者#!/usr/bin/env bash,而且要给它执行权限:chmod +x /path/to/route-up.sh
  • 脚本里所有命令和路径都要用绝对路径!比如不要写ip,要写/usr/bin/ip——因为systemd的默认PATH环境变量非常有限,很多你平时能用的命令它找不到
  • 手动跑一遍脚本试试:sudo /path/to/route-up.sh,看能不能正常配置网络命名空间,先确认脚本本身没bug

2. 修正OpenVPN配置里的route-up路径

打开你的OpenVPN客户端配置文件(比如/etc/openvpn/client/myvpn.conf),确保route-up指定的是绝对路径:

# 比如这样写,不要用相对路径
route-up /usr/local/bin/route-up.sh
# 如果需要传递参数,也要确保参数里的路径是绝对的
route-up /usr/local/bin/route-up.sh dev tun0

3. 调整systemd服务的权限(关键!)

Arch Linux默认的openvpn@.service模板是用openvpn普通用户运行的,但配置网络命名空间、修改路由这类操作必须要root权限!这大概率是核心问题:

  1. 复制默认服务文件到自定义路径:
    cp /usr/lib/systemd/system/openvpn@.service /etc/systemd/system/openvpn@myvpn.service
    
  2. 编辑这个自定义服务文件,注释掉User=openvpn和Group=openvpn这两行,让服务以root身份运行:
    # User=openvpn
    # Group=openvpn
    
  3. 重新加载systemd配置:
    systemctl daemon-reload
    
  4. 重启OpenVPN服务:
    systemctl restart openvpn@myvpn.service
    

4. 加日志排查,精准定位问题

如果还是不行,给route-up脚本加日志输出,看看执行时到底哪里出问题了。在脚本最开头加上:

#!/bin/bash
# 把所有输出和错误写到日志文件里
exec >> /var/log/openvpn-route-up.log 2>&1
# 开启命令调试,每一步执行的命令都会记录
set -x

然后重启服务,查看日志:cat /var/log/openvpn-route-up.log,就能看到脚本执行的每一步,比如是不是某个命令找不到,或者权限不足。

5. 验证配置是否生效

做完上面的步骤后,先检查服务状态:

systemctl status openvpn@myvpn.service

再看systemd的日志:

journalctl -u openvpn@myvpn.service -f

最后测试网络命名空间里的程序能不能正常走VPN:

ip netns exec 你的命名空间名称 curl https://example.com

如果能正常访问,说明问题解决了。

内容的提问来源于stack exchange,提问作者n0rd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:54:04