为什么在 Ubuntu 上常选 TUN 加 systemd
与仅开「系统代理」相比,TUN 模式在 Linux 上更接近「透明代理」:由内核虚拟网卡接管流量,再交给 Clash 按规则分流,不依赖每个应用是否尊重 HTTP_PROXY。这对浏览器、命令行工具、部分不走环境变量的程序更一致。代价是:进程必须具备创建 TUN、改路由表的能力,这在 Ubuntu 上通常表现为对 /dev/net/tun 的访问与 CAP_NET_ADMIN 等权能,否则日志里会出现权限拒绝或接口创建失败。
systemd 的价值在于把「手动 cd 再启动」变成可重复的服务:固定工作目录、环境变量、重启策略,并与开机自启或用户会话登录挂钩。服务器场景下,你还希望崩溃后自动拉起、日志进 journal,便于和防火墙、Docker 网桥等问题对照。若你仍在图形客户端与纯命令行之间犹豫,可先读 如何选择适合自己的 Clash 客户端,再决定是否在 Linux 上采用无 UI 的 Mihomo 加 systemd 组合。
mihomo 或发行版打包名;配置键与日志前缀随版本略有差异,但 TUN 与 systemd 的权限逻辑在 Ubuntu 上相通。
安装内核二进制与目录约定
常见做法是从上游 Release 获取对应 linux-amd64(或 arm64)压缩包,解压得到单个可执行文件,再放入固定路径,例如 /usr/local/bin/mihomo,并赋予可执行权限。若使用发行版或第三方打包,路径可能变为 /usr/bin/mihomo,下文命令需按实际位置替换。安装完成后,用 mihomo -v 或等价参数确认版本,避免混用旧版内核导致 TUN 字段不兼容。
不建议把二进制放在每次会变动权限的临时目录;与 systemd 绑定时,固定路径有利于 ExecStart= 与安全审计。若你从源码或脚本构建,记得在升级时同步更新 unit 里的路径,或统一用 /usr/local/bin 下的符号链接指向当前版本。
配置文件路径:config.yaml 与资源目录
Mihomo 默认会在用户主目录下查找配置,最常见布局是 ~/.config/mihomo/config.yaml,同目录可放 Country.mmdb、规则集缓存、providers 子目录等。若你希望服务以特定系统用户运行,必须把上述目录与文件的所有者设为该用户,否则会出现「能手动启动、service 却读不到订阅」的差异。另一种做法是把配置集中放到 /etc/mihomo/,再通过 -d 或 -f 显式指定目录与主配置路径——这对多用户机器更清晰,但要同步处理只读与日志路径。
订阅链接、规则集 URL 等敏感信息仍建议限制文件权限(例如 chmod 600 config.yaml),并避免把 token 贴进公开仓库。关于订阅更新与节点健康,可与 订阅管理与节点维护 中的习惯结合:先保证「拉配置成功」,再谈 TUN 是否生效。
Ubuntu 上若使用 snap 或沙箱化安装,真实可读写的配置目录可能被重定向;排障时以进程实际 cwd 与日志里打印的路径为准。纯二进制部署时,最稳妥是显式在启动参数里写 -d /path/to/configdir,减少默认值随版本变化带来的困惑。
在配置中启用 TUN(透明代理)
在 config.yaml 中开启 TUN,一般需要 tun 段,并设置 enable: true。不同版本支持的键名包括 stack(如 system、gvisor)、auto-route、auto-detect-interface、strict-route 等,用于自动添加路由与选择出口网卡。开启 auto-route 后,内核会写入策略路由;若与公司 VPN、Docker、虚拟机等同时存在,可能出现路由竞争,需要按环境收窄或关闭自动路由,再手动补规则。
DNS 方面,TUN 常与 fake-ip 或 redir-host 等模式联动;若你发现「网页能开、部分域名间歇失败」,要对照 规则分流最佳实践 与 常见问题中的 DNS 说明,避免把 DNS 问题误判为 TUN 未启动。更偏原理的对比仍建议结合 TUN 模式深度解析 一文。
Illustrative YAML fragment (adapt keys to your core version)tun:
enable: true
stack: system
auto-route: true
auto-detect-interface: true
dns-hijack:
- any:53
上述片段仅为示意:你使用的内核版本可能对 dns-hijack、接口名称或 MTU 有额外要求,升级后应查阅对应 Release Note。生产环境修改 TUN 相关项时,建议先备份整份配置,再在低峰期重载,避免路由瞬间抖动影响 SSH 会话。
权限实测:/dev/net/tun 与 CAP_NET_ADMIN
检查 tun 设备与模块
多数 Ubuntu 桌面与服务器已自带 TUN 支持,可用 ls -l /dev/net/tun 查看设备节点;若不存在,需确认内核模块是否加载(如 modprobe tun,具体以发行版文档为准)。若日志提示无法打开 TUN,首先核对该设备是否对运行用户可见,以及是否被安全模块拒绝。
权能:setcap 与 systemd 赋予
以非 root 用户跑 Mihomo 时,常见两种做法:其一,对二进制设置文件权能,例如使用 setcap cap_net_admin,cap_net_bind_service=+ep /usr/local/bin/mihomo(路径替换为你的二进制);其二,在 systemd 单元里声明 AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE 与 CapabilityBoundingSet=,让服务管理器在启动时注入权能。两者不要混用导致困惑时,保留一种并记录版本。任意赋予权能都意味着该程序若被利用,影响面大于普通用户进程,应保持二进制来源可信并及时更新。
auto-route 时,建议保留带外控制台(云厂商 VNC)或使用 networkd 快照,并先在测试机验证。
systemd 单元:用户服务与开机自启
对用户级服务,可将 unit 放在 ~/.config/systemd/user/mihomo.service,内容包含 [Unit] 描述与依赖网络目标;[Service] 中设置 Type=simple 或文档推荐类型、ExecStart 指向二进制与参数(含配置目录)、Restart=on-failure、环境变量等;[Install] 中 WantedBy=default.target。执行 systemctl --user daemon-reload 后 enable --now。若希望「登录前」即启动,需要使用系统级 service(/etc/systemd/system/)并指定专用用户,或启用 linger(loginctl enable-linger)让用户级服务在无会话时仍运行——按你的安全策略选择。
[Unit]
Description=Mihomo (Clash Meta)
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
WorkingDirectory=%h/.config/mihomo
ExecStart=/usr/local/bin/mihomo -d %h/.config/mihomo
Restart=on-failure
RestartSec=3
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
[Install]
WantedBy=default.target
若你更倾向用 root 运行(不推荐),则权能行可省略,但攻击面与误操作风险更大。无论哪种方式,WorkingDirectory 与 -d 指向的目录应一致,否则相对路径的 provider 与日志会写到非预期位置。
启动后如何验证 TUN 与路由
服务启动成功后,用 ip tuntap 或 ip link 查看是否出现 clash/mihomo 相关接口(名称因版本而异);再用 ip rule 与 ip route show table 观察是否写入预期策略路由。若使用 curl 测试出口 IP,请同时测直连域名与走代理域名,确认分流与 规则命中一致。浏览器侧可配合开发者工具查看连接是否仍绕过代理。
若仅部分应用不走 TUN,优先核对是否仍存在 SOCKS5 直连、静态路由优先级更高,或容器网络独立。与 Windows/macOS 图形界面不同,Linux 上这些问题更常暴露在 ip route 与防火墙规则里,需要耐心对照。
排障:journalctl 与常见报错
systemd 管理时,应优先 journalctl --user -u mihomo -e(用户服务)或带 -b 查看本次启动,定位首条 ERROR。常见线索包括:打开 TUN 失败(权限)、绑定端口失败(已被占用或权能不足)、加载配置失败(YAML 语法或路径)、DNS 监听与 systemd 的 IPAddressDeny 冲突等。若需对比「手动能跑、服务不能跑」,在同一用户下分别执行,并统一环境变量与 -d。
与连通性相关的超时、TLS 报错,可继续用 从日志读懂 timeout 与 TLS 的分层思路:先区分是本地路由未生效,还是远端节点问题。若修改 TUN 后立刻断 SSH,先在控制台关闭服务或撤销 auto-route,再恢复会话。
结语:把 Linux 代理从「能跑」变成「能长期跑」
在 Ubuntu 上用好 Clash Linux 方案,关键不是复制一段神秘配置,而是把二进制位置、配置目录、TUN 权限、systemd 生命周期四件事对齐:任何一处漂移,都会表现为「我明明开了 TUN,却只有一半应用生效」或「重启后订阅不见了」。把路径写死、权能授予方式写进文档、用 journal 保留证据,你在升级内核或换机时才不必从头猜。
相比依赖临时终端窗口,用 systemd 托管的 Mihomo 在透明代理场景里更稳定:崩溃可自动重启,开机可按策略拉起,日志可检索。对同时需要图形界面与内核后端的用户,也可在桌面发行版保留 GUI 客户端作编辑,在后台仍用同一套配置目录——但务必确认不会两个进程争用同一端口与 TUN。整体体验上,成熟客户端在日志与规则编辑上的优势仍然明显。
→ 立即免费下载 Clash,开启流畅上网新体验,在桌面端获得与本文命令行思路相匹配的可视化配置与更新节奏,把 Ubuntu 上验证过的 TUN 与分流策略无缝带到日常设备。