启动非host网络模式Docker容器时Cisco AnyConnect断开重连问题咨询
触发原因
Cisco AnyConnect Linux客户端默认开启了网络变更检测机制,会持续监控系统所有网络接口的状态和路由表变动:
- 当你运行非host网络驱动的Docker容器、执行容器构建操作、或者绑定自定义网桥启动容器时,Docker会动态生成veth虚拟以太网接口并绑定到对应网桥,同时新增对应的路由表项,这个操作会被AnyConnect判定为网络环境发生变更
- 出于避免路由冲突、防范安全风险的默认策略,AnyConnect会主动断开当前VPN连接,重新发起认证并适配新的网络环境写入路由规则,就是你观测到的断开后自动重连的现象
- 单独执行
docker create network创建网桥不会触发问题,是因为该操作仅生成网桥设备,没有新增虚拟接口、也没有修改实际生效的路由规则,没有达到AnyConnect的检测阈值 - 用host网络驱动的容器不会触发问题,是因为该模式下容器直接复用宿主机的网络栈,不会产生新的网络接口和路由变动
规避方案
- 方案1:关闭AnyConnect的虚拟网络设备变更检测
编辑AnyConnect对应配置文件/opt/cisco/anyconnect/profile/[你的配置文件名].xml,找到字段<LinuxDetectTunDeviceChanges>,将其值修改为false,保存后重启AnyConnect服务即可生效。该配置仅关闭对虚拟接口变更的监控,不会影响VPN的正常使用和安全策略。 - 方案2:提前预留Docker网络接口
如果不想修改VPN配置,可以提前创建所有需要用到的Docker自定义网桥,并且提前启动几个闲置的小容器占用足够的veth接口,后续再启动/构建容器时不会产生新的网络接口变动,即可避免触发VPN重连。 - 方案3:替换为支持单点登录的openconnect客户端
目前新版openconnect已兼容绝大多数Cisco VPN的单点登录认证流程,配置对应参数后可完全替代AnyConnect使用,openconnect默认没有网络接口变更检测机制,不会出现同类断开重连问题。
内容的提问来源于stack exchange,提问作者eotfofiw
相关产品推荐
相关产品推荐

