github.com/igoogolx/clash@v1.19.8/docs/zh_CN/advanced-usages/openconnect.md (about)

     1  ---
     2  sidebarTitle: 基于规则的 OpenConnect
     3  sidebarOrder: 2
     4  ---
     5  
     6  # 基于规则的 OpenConnect
     7  
     8  支持以下 OpenConnect:
     9  
    10  - Cisco AnyConnect SSL VPN
    11  - Juniper Network Connect
    12  - Palo Alto Networks (PAN) GlobalProtect SSL VPN
    13  - Pulse Connect Secure SSL VPN
    14  - F5 BIG-IP SSL VPN
    15  - FortiGate SSL VPN
    16  - Array Networks SSL VPN
    17  
    18  例如, 您的公司使用 Cisco AnyConnect 作为内部网络访问的方式. 这里我将向您展示如何使用 Clash 提供的策略路由来使用 OpenConnect.
    19  
    20  首先, [安装 vpn-slice](https://github.com/dlenski/vpn-slice#requirements). 这个工具会覆写 OpenConnect 的默认路由表行为. 简单来说, 它会阻止 VPN 覆写您的默认路由.
    21  
    22  接下来您需要一个脚本 (比如 `tun0.sh`) 类似于这样:
    23  
    24  ```sh
    25  #!/bin/bash
    26  ANYCONNECT_HOST="vpn.example.com"
    27  ANYCONNECT_USER="john"
    28  ANYCONNECT_PASSWORD="foobar"
    29  ROUTING_TABLE_ID="6667"
    30  TUN_INTERFACE="tun0"
    31  
    32  # 如果服务器在中国大陆, 请添加 --no-dtls. 中国大陆的 UDP 会很卡.
    33  echo "$ANYCONNECT_PASSWORD" | \
    34    openconnect \
    35      --non-inter \
    36      --passwd-on-stdin \
    37      --protocol=anyconnect \
    38      --interface $TUN_INTERFACE \
    39      --script "vpn-slice
    40  if [ \"\$reason\" = 'connect' ]; then
    41    ip rule add from \$INTERNAL_IP4_ADDRESS table $ROUTING_TABLE_ID
    42    ip route add default dev \$TUNDEV scope link table $ROUTING_TABLE_ID
    43  elif [ \"\$reason\" = 'disconnect' ]; then
    44    ip rule del from \$INTERNAL_IP4_ADDRESS table $ROUTING_TABLE_ID
    45    ip route del default dev \$TUNDEV scope link table $ROUTING_TABLE_ID
    46  fi" \
    47      --user $ANYCONNECT_USER \
    48      https://$ANYCONNECT_HOST
    49  ```
    50  
    51  之后, 我们将其配置成一个 systemd 服务. 创建 `/etc/systemd/system/tun0.service`:
    52  
    53  ```ini
    54  [Unit]
    55  Description=Cisco AnyConnect VPN
    56  After=network-online.target
    57  Conflicts=shutdown.target sleep.target
    58  
    59  [Service]
    60  Type=simple
    61  ExecStart=/path/to/tun0.sh
    62  KillSignal=SIGINT
    63  Restart=always
    64  RestartSec=3
    65  StartLimitIntervalSec=0
    66  
    67  [Install]
    68  WantedBy=multi-user.target
    69  ```
    70  
    71  然后我们启用并启动服务.
    72  
    73  ```shell
    74  chmod +x /path/to/tun0.sh
    75  systemctl daemon-reload
    76  systemctl enable tun0
    77  systemctl start tun0
    78  ```
    79  
    80  这里您可以查看日志来查看它是否正常运行. 简单的方法是查看 `tun0` 接口是否已经创建.
    81  
    82  和 Wireguard 类似, 将 TUN 设备作为出站很简单, 只需要添加一个策略组:
    83  
    84  ```yaml
    85  proxy-groups:
    86    - name: Cisco AnyConnect VPN
    87      type: select
    88      interface-name: tun0
    89      proxies:
    90        - DIRECT
    91  ```
    92  
    93  ... 然后就可以使用了!
    94  
    95  添加您想要的规则:
    96  
    97  ```yaml
    98  rules:
    99    - DOMAIN-SUFFIX,internal.company.com,Cisco AnyConnect VPN
   100  ```
   101  
   102  当您发现有问题时, 您应该查看 debug 级别的日志.