進階用法 · Clash文件

依規則分流的 OpenConnect

說明如何將 OpenConnect 介面納入 Clash 規則分流,核對介面名稱、路由表、DIRECT 策略和目標規則,避免預設路由遭 VPN 設定覆蓋。

  • OpenConnect
  • vpn-slice
  • systemd
  • interface-name
  • DOMAIN-SUFFIX
進階用法

支援以下 OpenConnect:

  • Cisco AnyConnect SSL VPN
  • Juniper Network Connect
  • Palo Alto Networks (PAN) GlobalProtect SSL VPN
  • Pulse Connect Secure SSL VPN
  • F5 BIG-IP SSL VPN
  • FortiGate SSL VPN
  • Array Networks SSL VPN

例如,您的公司使用 Cisco AnyConnect 作為內部網路存取的方式。這裡我將向您展示如何使用 Clash 提供的策略路由來使用 OpenConnect。

首先,安裝 vpn-slice。此工具會覆寫 OpenConnect 的預設路由表行為;簡單來說,它可防止 VPN 覆寫您的預設路由。

接著需要準備一個指令碼,例如 tun0.sh,內容如下:

sh
#!/bin/bash
ANYCONNECT_HOST="vpn.example.com"
ANYCONNECT_USER="john"
ANYCONNECT_PASSWORD="foobar"
ROUTING_TABLE_ID="6667"
TUN_INTERFACE="tun0"

# 如果服务器在中国大陆, 请添加 --no-dtls. 中国大陆的 UDP 会很卡.
echo "$ANYCONNECT_PASSWORD" | \
  openconnect \
    --non-inter \
    --passwd-on-stdin \
    --protocol=anyconnect \
    --interface $TUN_INTERFACE \
    --script "vpn-slice
if [ \"\$reason\" = 'connect' ]; then
  ip rule add from \$INTERNAL_IP4_ADDRESS table $ROUTING_TABLE_ID
  ip route add default dev \$TUNDEV scope link table $ROUTING_TABLE_ID
elif [ \"\$reason\" = 'disconnect' ]; then
  ip rule del from \$INTERNAL_IP4_ADDRESS table $ROUTING_TABLE_ID
  ip route del default dev \$TUNDEV scope link table $ROUTING_TABLE_ID
fi" \
    --user $ANYCONNECT_USER \
    https://$ANYCONNECT_HOST

接著將其設定為 systemd 服務。請建立 /etc/systemd/system/tun0.service

ini
[Unit]
Description=Cisco AnyConnect VPN
After=network-online.target
Conflicts=shutdown.target sleep.target

[Service]
Type=simple
ExecStart=/path/to/tun0.sh
KillSignal=SIGINT
Restart=always
RestartSec=3
StartLimitIntervalSec=0

[Install]
WantedBy=multi-user.target

然後我們啟用並啟動服務。

shell
chmod +x /path/to/tun0.sh
systemctl daemon-reload
systemctl enable tun0
systemctl start tun0

您可以查看日誌以確認服務是否正常運作;最簡單的方式,是檢查 tun0 介面是否已建立。

和 Wireguard 類似,將 TUN 裝置作為出站很簡單,只需要新增一個策略群組:

yaml
proxy-groups:
  - name: Cisco AnyConnect VPN
    type: select
    interface-name: tun0
    proxies:
      - DIRECT

…… 然後就可以使用了!

新增您想要的規則:

yaml
rules:
  - DOMAIN-SUFFIX,internal.company.com,Cisco AnyConnect VPN

當您發現有問題時,您應該查看 debug 級別的日誌。