Clash服务导致主机故障一例

故障现象

Clash在服务启动时会打断主机全部inbound连接。

日志显示:

level=error msg="Start Tun interface error: not found v4 address for interface eth0"

故障条件

本例故障仅在以下条件下触发:

  • 使用clash on a daemon页面提供的systemd service配置文件
  • 启用clash的tun特性
  • 启用clash的ebpf特性
  • 主机启动过快
  • 网卡IP地址生效不够快

故障逻辑

  1. systemd service配置文件显示服务仅依赖network.target
  2. network.target在网卡物理状态UP的时候就会触发
  3. clash的tun必须在网卡获取到地址时才能启动
  4. clash启动时网卡IP地址很有可能还没有生效,因此tun启动失败
  5. 因为tun无法启动,ebpf把inbound流量丢到了黑洞里

解决办法

利用systemd-networkd-wait-online监视网卡地址

新建并使能一个服务,基于systemd-networkd-wait-online服务监视网卡IPv4地址,当地址生效时服务启动:

$ sudo vim /etc/systemd/system/[email protected]

[Unit]
Description=Wait for Network to be Configured
Documentation=man:systemd-networkd-wait-online.service(8)
DefaultDependencies=no
Conflicts=shutdown.target
Requires=systemd-networkd.service
After=systemd-networkd.service
Before=network-online.target shutdown.target

[Service]
Type=oneshot
ExecStart=/lib/systemd/systemd-networkd-wait-online -i eth0 -4
RemainAfterExit=yes

[Install]
WantedBy=network-online.target

让clash的服务依赖上面的服务

$ sudo vim /etc/systemd/system/clash.service

[Unit]
Description=Clash daemon, A rule-based proxy in Go.
[email protected]
After=network.target [email protected]

[Service]
Type=simple
Restart=always
ExecStart=/usr/local/bin/clash -d /home/YOURUSERNAME/.config/clash

[Install]
WantedBy=multi-user.target

Leave a Reply

Your email address will not be published.