AnyConnect

AnyConnect 是为数不多的国区 Apple Store 上能下载到的正经 VPN 软件。虽然我更倾向于用 IPSec,但是 好像 IPSec 在 IVI 下 MTU 不太正常(存疑), 且 Windows 上比较好部署,所以还是有价值维护的。

1. Server: OpenConnect

ocserv 是一款开源的、支持 Cisco AnyConnect 和 Juniper Pulse Connect 的服务器。 我觉得能兼容这些奇怪私有协议非常难,还是很厉害的。

目前用的配置:

auth = "plain[passwd=/etc/ocserv/ocpasswd]"
tcp-port = 8080
udp-port = 8080
# Lets encrypt 申请
server-cert = /etc/ocserv/example.com.pem
server-key = /etc/ocserv/example.com.key
isolate-workers = false
# 同名账户允许三地登录
max-same-clients = 3
try-mtu-discovery = true
default-domain = example.com
ipv4-network = 172.31.4.0
ipv4-netmask = 255.255.255.0
ipv6-network = fdff:ffff:ffff:fff0:0:2:1::/112
ipv6-subnet-prefix = 128
dns = 172.31.4.1
# 我觉得 1500 应该也没问题,但是小心点好
mtu = 1400
route = default

# 下面是默认配置里的默认值
run-as-user = nobody
run-as-group = daemon
socket-file = /run/ocserv.socket
max-clients = 128
server-stats-reset-time = 604800
keepalive = 300
dpd = 60
mobile-dpd = 300
switch-to-tcp-timeout = 25
# 证书认证的话这个有用
cert-user-oid = 0.9.2342.19200300.100.1.1
compression = true
no-compress-limit = 256
tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-RSA:-VERS-SSL3.0:-ARCFOUR-128"
auth-timeout = 240
idle-timeout = 1200
mobile-idle-timeout = 1800
min-reauth-time = 300
max-ban-score = 80
ban-reset-time = 300
cookie-timeout = 300
deny-roaming = false
rekey-time = 172800
rekey-method = ssl
use-occtl = true
pid-file = /run/ocserv.pid
device = vpns
predictable-ips = true
ping-leases = false
cisco-client-compat = true
dtls-legacy = true

一些注意事项:

  • DNS Server IP 不要和 VPN Server IP 相同,Android 的 AnyConnect 没问题,但是 iOS 上的 AnyConnect 会完全不把 DNS 请求发到 VPN Server 上,导致几乎没有流量过来,我猜是因为它会额外加一条路由强制让 VPN Server 的 IP 不经过 tunnel, 毕竟我看到还有其他类似的 Apple 路由 hack。 最初排查的时候还以为是 MTU 问题。实际上应该早点想到 DNS 有可能是原因的。一个简单的 trick 是把 DNS 指向 IP Pool 的第一个地址, ocserv 会用这个地址 作为本地每个 tunnel netif("vps*")的本地地址,很神奇。

Updated: 2025-12-04 Thu 02:42