logo头像
Snippet 博客主题

AWS上配置Cisco ASAv AnyConnect

本文于 740 天之前发表,文中内容可能已经过时。

这里演示了如何在AWS上搭建思科的SSLVPN,用来解决员工远程办公的需求。文章需要你有一定的AWS和SSLVPN基础。

1、实验简介

最近一直在研究思科防火墙的SSLVPN,用来解决员工远程办公的问题。传统上一般使用ASA55XX系列的硬件防火墙做SSLVPN,使用ASAv与使用硬件防火墙功能特性几乎没有区别。ASAv在vSphere和AWS环境都可以部署。这里主要介绍一下在AWS上使用ASAv配置SSLVPN的步骤。后续会继续深入去聊SSLVPN上的高级特性。

如果你有配置ASA SSLVPN的经验,需要注意的是AWS上的特殊场景,下面是整个实验的注意事项:

  • 中国区如果AWS账号未经过ICP备案则无法使用TCP 80/443端口,所以需要SSLVPN修改默认的443端口号。
  • AWS上ASAv为客户端分配的IP地址需要进过NAT转换后才能访问,因为服务器没有回包路由。
  • AWS上的Windows2016无法安装ASDM,建议使用Windows2019安装ASDM软件。
  • 如果ASAv未购买License会限速100k并且最大会话100个,用于做实验足够了但是无法用于生产环境。

2、环境介绍

  • 本次实验在VPC内需要使用2个子网,一个公共子网用于连接跳板机,用户可以先连接Windows2016之后,在Windows2016通过SSH和ASDM连接ASAv。这里不会详细介绍AWS相关基础知识,例如如何创建VPC、如何创建公有子网、私有子网。

AnyConnect

  • 这是实验将会用到的公有子网,默认路由指向了IGW。

AnyConnect


3、配置跳板机环境

  • 在公有子网启用一台window2016,用于之后通过SSH和ASDM访问ASAv,注意实例要选择windows 2016,经过测试windows 2019 无法安装ASDM。通过AWS的快速启动一台windows 2016,可以通过输入“windows 2016”过滤查找。注意,window 2019环境无法安装Cisco ASDM。

AnyConnect

  • Window2016放置在公有子网,并且开启分配公有IP功能。

AnyConnect

AnyConnect

AnyConnect

AnyConnect

AnyConnect

AnyConnect


4、创建ASAv实例

  • 在AWS Marketplace搜索asav,选择ami启用即可。需要注意的是,ASAv默认eth0是ciscoasa的管理接口,管理接口只能走网管流量,不能传输数据流量,所以至少需要再添加一个eth1作为outside接口。如果需要添加更多接口,例如inside和dmz接口,可以添加「网络接口」然后附加到实例。其实在AWS环境中一个outside接口就可以运行AnyConnect环境了。

AnyConnect

AnyConnect

AnyConnect

AnyConnect

AnyConnect

AnyConnect

AnyConnect

AnyConnect

AnyConnect

  • 实例创建成功之后,在AWS环境下需要对实例参数进行一下配置。在AWS接口上默认会丢弃目的IP不是本接口IP的流量,所以想要ASA转发流量,必须关闭outside接口的源/目标检查

AnyConnect

AnyConnect

AnyConnect

  • 如果客户端想要访问私有云内的服务器,那么不能直接使用ASAv分配的地址池去访问,否则服务器没有回包路由。解决方法是在ASAv做源NAT,将客户端的源IP地址转换成outside上的一个辅助IP地址(无法转换成outside接口地址)。如果是vSphere环境可以转换为outside接口地址。

AnyConnect

AnyConnect

  • 防火墙outside需要公网能直接访问,所以需要一个公网地址。

AnyConnect

AnyConnect

AnyConnect

  • 公网地址关联上防火墙的outside接口。

AnyConnect

AnyConnect

  • 启动之后,eth0是管理接口首次连接时只能连接管理接口,如果想要连接其他接口可以连接之后配置。

AnyConnect


5、ASAv基础配置

  • 首先通过SSH连接到ASAv的管理口进行一些基础配置,这里我使用MobaXterm作为SSH客户端,下载地址会放在最后。在AWS上启动的ASAv默认用户名是admin,使用对应的密钥登录即可。

AnyConnect

  • 首先需要设置enable密码
1
2
3
4
5
6
ciscoasa> enable
The enable password is not set. Please set it now.
Enter Password: ****
Repeat Password: ****
Note: Save your configuration so that the password persists across reboots
("write memory" or "copy running-config startup-config").
  • 添加的eth1接口默认是down状态
1
2
3
4
5
ciscoasa# show interface ip brief
Interface IP-Address OK? Method Status Protocol
Internal-Data0/0 169.254.1.1 YES unset up up
Management0/0 172.30.2.176 YES DHCP up up
TenGigabitEthernet0/0 172.30.1.7 YES CONFIG administratively down up
  • 开启eth1,配置名称为outside
1
2
3
interface TenGigabitEthernet0/0 
no shutdown
nameif outside
  • 想要通过ASDM连接ASAv,需要开启http服务器,并且允许http流量从管理口进入,0 0 表示不限制IP地址段,如果想要只允许192.168.1.0/24网段的http连接可以这么配置http 192.168.1.0 255.255.255.0。配置http的认证方式是本地认证,配置一个本地15级权限的用户名密码。
1
2
3
4
http server enable
http 0 0 management
aaa authentication http console LOCAL
username cisco password ciscoasa privilege 15
  • 通过网页访问ASAv的管理接口地址

AnyConnect

  • 先下载并且安装Java环境,然后下载安装ASDM软件。

AnyConnect

AnyConnect

AnyConnect

AnyConnect

  • 下载安装ASDM环境。

AnyConnect

  • 使用本地15级账号密码登录。

AnyConnect

  • ASAv未导入License的情况下,限速100Kbps,最大会话100个连接。

AnyConnect

  • 这里通过ASDM的文件管理功能导入AnyConnect文件。

AnyConnect

AnyConnect

  • 导入本地的AnyConnect客户端文件。

AnyConnect

  • 查看磁盘确认有客户端文件。
1
2
3
ciscoasa# dir
Directory of disk0:/
86 -rwx 41077110 08:00:10 Jan 12 2021 anyconnect-win-4.6.00362-webdeploy-k9.pkg

6、ASAv配置SSLVPN

  • 下面几乎是在AWS上ASAv的最小化配置了,这里对AnyConnect高级功能不做讨论。下面命令的含义:当客户端访问其他任何地址时,源地址转换为172.30.1.5。
1
2
3
4
5
object network asa_outside_address
host 172.30.1.5
object network anyconnect_pool_object
subnet 192.168.1.0 255.255.255.0
nat (outside,outside) source dynamic anyconnect_pool_object pat-pool asa_outside_address
  • 默认情况下ASAv相同安全级别不能访问流量不能从相同接口进出,这里需要开启这2个特性。
1
2
same-security-traffic permit inter-interface
same-security-traffic permit intra-interface
  • 创建客户端的地址池
1
ip local pool anyconnect_client_pool 192.168.1.1-192.168.1.254 mask 255.255.255.255
  • 定义隧道分隔地址段,只有当用户访问172.30.1.0/24时,流量才会通过SSL隧道到达ASAv,去往其他网段的流量客户端依然从本地网络出去。
1
access-list anyconnect_split standard permit 172.30.1.0 255.255.255.0
  • 开启webvpn功能,修改端口为8443(AWS中国区未经过ICP备案无法使用TCP80/443),激活anyconnect拨号功能。
1
2
3
4
5
webvpn
port 8443
enable outside
anyconnect enable
anyconnect image disk0:/anyconnect-win-4.6.00362-webdeploy-k9.pkg
  • 配置group-policy,允许通过网页和客户端拨入,定义流量为隧道分隔模式。
1
2
3
4
5
6
group-policy anyconnect internal
group-policy anyconnect attributes
vpn-tunnel-protocol ssl-client ssl-clientless
split-tunnel-policy tunnelspecified
split-tunnel-network-list value anyconnect_split
address-pools value anyconnect_client_pool
  • 创建一个本地账号,用于拨号测试。
1
2
3
username anyuser password ciscoasa
username anyuser attributes
vpn-group-policy anyconnect
  • 目前防火墙的默认路由是通过管理接口DHCP获取到的,需要将默认路由修改为outside出去。修改步骤如下:

    1. 开启outside ssh管理
    2. 将管理接口配置为静态IP,获取的默认路由会自动消失
    3. 重新通过outside接口连接ciscoasa
    4. 指定默认路由出口为outside
  • 查看现有默认路由通过mgmt接口出去

1
2
3
4
5
6
ciscoasa# show route
S* 0.0.0.0 0.0.0.0 [1/0] via 172.30.2.1, management
C 172.30.1.0 255.255.255.0 is directly connected, outside
L 172.30.1.7 255.255.255.255 is directly connected, outside
C 172.30.2.0 255.255.255.0 is directly connected, management
L 172.30.2.176 255.255.255.255 is directly connected, management
  • 允许ssh连接outside接口
1
ssh 0 0 outside
  • 将管理接口配置为静态地址,获取的默认路由会自动消失。
1
2
interface management 0/0
ip address 172.30.2.176 255.255.255.0
  • 重新通过SSH连接上outside接口之后,添加默认路由从outside接口出去。
1
route outside  0 0 172.30.1.1
  • 默认情况下AnyConnect不允许通过远程桌面拨号,需要创建一个AnyConnect Client Profile文件,编辑里面的参数。

AnyConnect

  • 允许通过远程桌面拨号。

AnyConnect

  • 如果未修改这个参数,通过远程桌面拨号后会有如下报错。

AnyConnect


7、测试AnyConnect拨号

  • 拨号成功后,通过SSL通道能访问到Windows2016的内网地址即可证明访问成功。Windows2016需要关闭防火墙才能ping通。

AnyConnect

  • 安全组也需要放行ICMP协议。

AnyConnect

  • 在公网上拨号成功。

AnyConnect

  • 去往172.30.1.0/24网段的流量会通过加密隧道访问。

AnyConnect

  • 测试访问内网Windows2016
1
2
3
4
5
6
7
C:\Users\Administrator>ping 172.30.1.131

正在 Ping 172.30.1.131 具有 32 字节的数据:
来自 172.30.1.131 的回复: 字节=32 时间=1ms TTL=128
来自 172.30.1.131 的回复: 字节=32 时间=1ms TTL=128
来自 172.30.1.131 的回复: 字节=32 时间=1ms TTL=128
来自 172.30.1.131 的回复: 字节=32 时间=1ms TTL=128
  • 这里协议默认是TLS,也就是TCP建立的连接,如果网络环境不太稳定,需要走语音和视频流量,建议使用DTLS通道,也就是UDP连接。

AnyConnect

  • 修改DTLS端口为8443
1
2
webvpn
dtls port 8443
  • 在group-policy下开启DTLS
1
2
3
group-policy anyconnect attributes
webvpn
anyconnect ssl dtls enable
  • 重新拨号查看协议。

AnyConnect

  • ASAv上查看客户端信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ciscoasa(config)#  show vpn-sessiondb anyconnect

Session Type: AnyConnect

Username : anyuser Index : 3
Assigned IP : 192.168.1.1 Public IP : 52.83.196.213
Protocol : AnyConnect-Parent SSL-Tunnel
License : AnyConnect Premium
Encryption : AnyConnect-Parent: (1)none SSL-Tunnel: (1)AES-GCM-256
Hashing : AnyConnect-Parent: (1)none SSL-Tunnel: (1)SHA384
Bytes Tx : 18613 Bytes Rx : 7928
Group Policy : anyconnect Tunnel Group : DefaultWEBVPNGroup
Login Time : 09:46:43 UTC Tue Jan 12 2021
Duration : 0h:01m:51s
Inactivity : 0h:00m:00s
VLAN Mapping : N/A VLAN : none
Audt Sess ID : ac1e02b0000030005ffd7003
Security Grp : none

附一(NAT相关)

tunnelall带来的问题

文章的NAT配置如下,配置是隧道分隔模式倒是没有问题,但是如果想要使用tunnelall模式,让所有流量都通过ASAv抵达互联网,那么使用下面的NAT配置客户端无法访问互联网,但是可以访问内网

1
nat (outside,outside) source dynamic anyconnect_pool_object pat-pool asa_outside_address

因为EIP在关联私有IP时,相当于做的是静态一对一映射,这里EIP关联上了ASAv的outside接口,所以客户端的地址转换为辅助IP地址之后是不能转换为EIP去访问公网的,但是访问所在子网有明细路由的网络时,是不需要转换为EIP的,所以无法访问公网,可以访问内网。

![AnyConnect](../image/AWS上配置Cisco ASAv SSLVPN/AWS-ASAv-AnyConnect-28.png)

tunnelall的解决方式

有两种解决方式,我更推荐第一种解决方式:

  1. 修改NAT配置,将客户端源地址转换为ASAv outside出接口地址。使用object nat的配置方式,在object下配置NAT。

    1
    2
    3
    object network sslvpn_client_pool_object
    subnet 172.30.0.0 255.255.254.0
    nat (outside,outside) dynamic interface
  2. 再添加一个EIP,将这个EIP关联到辅助IP上去。

两块网卡带来的问题

上面实验都是防火墙只有一块网卡outside的情况,如果防火墙有两块网卡,一个outside接口,一个inside接口,还需要加一个twice nat的配置。

如果只有上面object nat配置,那么客户端流量访问防火墙inside所在子网时,因为所在子网时防火墙直连接口,所以流量会从inside接口出去。但是无法在object nat上配置源自outside却去往不同方向的流量。此时只能借助twice nat的配置。

利用twice nat配置时,可以将客户端地址转换为防火墙inside接口地址,也可以转换为地址池,因为此时流量并不去访问互联网。

1
2
3
4
5
object network sslvpn_client_pool_object
subnet 172.30.0.0 255.255.254.0
nat (outside,outside) dynamic interface

nat (outside,inside) source dynamic sslvpn_client_pool_object anyconnect_pat_pool_inside

1、mobaxterm下载地址
2、Java环境下载地址