고급 사용법 · 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 수준의 로그를 확인하세요.