Introducción
Este documento describe cómo configurar un ASA con configuraciones para excluir el tráfico destinado a Microsoft Office 365 (Microsoft Teams) y Cisco Webex de la conexión VPN.
Antecedentes
La configuración de Adaptive Security Appliance (ASA) también incorpora exclusiones de direcciones de red y exclusiones dinámicas basadas en el nombre de dominio completo (FQDN) para los clientes de AnyConnect que lo admiten.
Tunelización dividida
El ASA debe configurarse para excluir la lista especificada de destinos IPv4 e IPv6 que se deben excluir del túnel. Desafortunadamente, la lista de direcciones es dinámica y podría cambiar. Consulte la sección Configuración para ver un script python y un enlace a un bucle de lectura-evaluación-impresión (REPL) de python en línea que se puede utilizar para recuperar la lista y generar una configuración de ejemplo.
Tunelización dividida dinámica
Además de la lista de direcciones de red excluidas divididas, se añadió la tunelización dividida dinámica en AnyConnect 4.6 para Windows y Mac. La tunelización dividida dinámica utiliza el FQDN para determinar si la conexión puede o no atravesar el túnel. La secuencia de comandos de Python también determina los FQDN de los terminales que se agregarán a los atributos personalizados de AnyConnect.
Configuración
Ejecute este script en una REPL de Python 3 o ejecútelo en un entorno de REPL público como AnyConnectO365DynamicExclude
import urllib.request
import uuid
import json
import re
def print_acl_lines(acl_name, ips, section_comment):
slash_to_mask = (
"0.0.0.0",
"192.0.2.1",
"192.0.2.1",
"10.224.0.0",
"10.240.0.0",
"10.248.0.0",
"10.252.0.0",
"10.254.0.0",
"10.255.0.0",
"10.255.128.0",
"10.255.192.0",
"10.255.224.0",
"10.255.240.0",
"10.255.248.0",
"10.255.252.0",
"10.255.254.0",
"10.255.255.0",
"10.255.255.128",
"10.255.255.192",
"10.255.255.224",
"10.255.255.240",
"10.255.255.248",
"10.255.255.252",
"10.255.255.254",
"10.255.255.255",
"10.255.255.255",
"10.255.255.255",
"10.255.255.255",
"10.255.255.240",
"10.255.255.248",
"10.255.255.252",
"10.255.255.254",
"10.255.255.255",
)
print(
"access-list {acl_name} remark {comment}".format(
acl_name=acl_name, comment=section_comment
)
)
for ip in sorted(ips):
if ":" in ip:
# IPv6 address
print(
"access-list {acl_name} extended permit ip {ip} any6".format(
acl_name=acl_name, ip=ip
)
)
else:
# IPv4 address. Convert to a mask
addr, slash = ip.split("/")
slash_mask = slash_to_mask[int(slash)]
print(
"access-list {acl_name} extended permit ip {addr} {mask} any4".format(
acl_name=acl_name, addr=addr, mask=slash_mask
)
)
# Fetch the current endpoints for O365
http_res = urllib.request.urlopen(
url="https://endpoints.office.com/endpoints/worldwide?clientrequestid={}".format(
uuid.uuid4()
)
)
res = json.loads(http_res.read())
o365_ips = set()
o365_fqdns = set()
for service in res:
if service["category"] == "Optimize":
for ip in service.get("ips", []):
o365_ips.add(ip)
for fqdn in service.get("urls", []):
o365_fqdns.add(fqdn)
# Generate an acl for split excluding For instance
print("##### Step 1: Create an access-list to include the split-exclude networks\n")
acl_name = "ExcludeSass"
# O365 networks
print_acl_lines(
acl_name=acl_name,
ips=o365_ips,
section_comment="v4 and v6 networks for Microsoft Office 365",
)
# Microsoft Teams
# https://docs.microsoft.com/en-us/office365/enterprise/office-365-vpn-implement-split-tunnel#configuring-and-securing-teams-media-traffic
print_acl_lines(
acl_name=acl_name,
ips=["10.107.60.1/32"],
section_comment="v4 address for Microsoft Teams"
)
# Cisco Webex - Per https://help.webex.com/en-us/WBX000028782/Network-Requirements-for-Webex-Teams-Services
webex_ips = [
"10.68.96.1/19",
"10.114.160.1/20",
"10.163.32.1/19",
"192.0.2.1/18",
"192.0.2.2/19",
"198.51.100.1/20",
"203.0.113.1/19",
"203.0.113.254/19",
"203.0.113.2/19",
"172.29.192.1/19",
"203.0.113.1/20",
"10.26.176.1/20",
"10.109.192.1/18",
"10.26.160.1/19",
]
print_acl_lines(
acl_name=acl_name,
ips=webex_ips,
section_comment="IPv4 and IPv6 destinations for Cisco Webex",
)
# Edited. April 1st 2020
# Per advice from Microsoft they do NOT advise using dynamic split tunneling for their properties related to Office 365
#
print(
"\n\n##### Step 2: Create an Anyconnect custom attribute for dynamic split excludes\n"
)
print("SKIP. Per Microsoft as of April 2020 they advise not to dynamically split fqdn related to Office365")
#print(
# """
#webvpn
# anyconnect-custom-attr dynamic-split-exclude-domains description dynamic-split-exclude-domains
#
#anyconnect-custom-data dynamic-split-exclude-domains saas {}
#""".format(
# ",".join([re.sub(r"^\*\.", "", f) for f in o365_fqdns])
# )
#)
#
print("\n##### Step 3: Configure the split exclude in the group-policy\n")
print(
"""
group-policy GP1 attributes
split-tunnel-policy excludespecified
ipv6-split-tunnel-policy excludespecified
split-tunnel-network-list value {acl_name}
""".format(
acl_name=acl_name
)
)
Nota: Microsoft recomienda excluir el tráfico destinado a los servicios clave de Office 365 del ámbito de la conexión VPN mediante la configuración de la tunelización dividida mediante intervalos de direcciones IPv4 e IPv6 publicados. Para obtener el mejor rendimiento y el uso más eficaz de la capacidad VPN, el tráfico a estos intervalos de direcciones IP dedicadas asociados con Office 365 Exchange Online, SharePoint Online y Microsoft Teams (denominados la categoría Optimizar en la documentación de Microsoft) se puede enrutar directamente, fuera del túnel VPN. Consulte Optimización de la conectividad de Office 365 para usuarios remotos que utilizan la tunelización VPN dividida para obtener información más detallada sobre esta recomendación.
Nota: a principios de abril de 2020, Microsoft Teams dependía de que el intervalo IP 10.107.60.1/32 se excluyera del túnel. Para obtener más información, consulte Configuración y protección del tráfico multimedia de Teams.
Verificación
Una vez conectado un usuario, verá las rutas no seguras rellenadas con las direcciones proporcionadas en la ACL, así como la lista de exclusión de túnel dinámico.