从 ASA 的设计来看,AnyConnect 隧道不像是一个传统的 Point-to-Point 或 Site-to-Site VPN 隧道,而更像是一个 IPSec Transform 规则。每个客户端建立起隧道以后,ASA 会为其动态生成一条路由,该路由具有如下特征:
- 类型为静态(STATIC)
- CIDR 为/32
- 接口为用户连入流量的来源接口,例如用户从公网访问则为 outsite
- 网关地址为接口对应的网关
动态路由协议
ASA 和另一台路由器之间有一个 BGP 会话,现在想让另一台路由器能访问 ASA 上的 AnyConnect 客户端。那么有两种实现方法:
为每一个客户端宣告一条路由
这样很简单,BGP 重分发静态路由即可。但是经过实验,ASA 对动态生成的静态路由的重分发并不是十分靠谱:延迟严重,有的时候甚至根本不向 BGP 邻居推送更新消息。所以不是很建议使用这种方法。
至于大量/32 条目污染路由表的问题,可以用 auto-summary 来解决。
预先宣告整个 AnyConnect IP 池
创建一条 metric 为 254 的静态路由,然后加入 BGP 的宣告列表即可。(注意 ASA 的 metric 255 等效于 blackhole)
|
route outside 192.168.1.1 255.255.255.0 8.8.8.8 254 router bgp 205610 address-family ipv4 unicast network 100.102.11.0 mask 255.255.255.0 |
NAT 规则
如果你的运营商出口(outside)需要做 PAT(masquerade),并且你为了偷懒设置了一条 nat (any,outsite) after-auto source dynamic any interface
的话,那么恭喜你中招了。AynConnect 用户的源接口和目标接口都是 outside,于是它是无论如何都无法主动建立连接的。
解决方法是把 NAT 规则拆成 inside->outside 和 outside->outside(仅 AnyConnect 客户端地址)。
|
nat (inside,outside) after-auto source dynamic any interface nat (outside,outside) after-auto source dynamic AnyConnect_IP_RANGE interface |
Packet Tracer
不要用活跃的 AnyConnect 客户端 IP 作为 Packet Tracer 测试的源或者目标 IP。你会看到它莫名其妙被 DROP。
|
Phase: 7 Type: WEBVPN-SVC Subtype: in Result: DROP Config: Additional Information: Result: input-interface: provider input-status: up input-line-status: up output-interface: backbone output-status: up output-line-status: up Action: drop Drop-reason: (acl-drop) Flow is denied by configured rule |
或者
|
Phase: 9 Type: VPN Subtype: ipsec-tunnel-flow Result: DROP Config: Additional Information: Result: input-interface: provider input-status: up input-line-status: up output-interface: backbone output-status: up output-line-status: up Action: drop Drop-reason: (acl-drop) Flow is denied by configured rule |
正确的方法是,使用 AnyConnect 地址池里面未被分配的 IP。
参考:
Pingback 引用通告: 把 ASA 配置为单臂 VPN 接入点 | Drown in Codes