高度な使い方 · 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 レベルのログを確認してください。