Introducción
Este documento describe cómo configurar un dispositivo de seguridad adaptable (ASA) con configuraciones para excluir el tráfico destinado a Microsoft Office 365 (incluye equipos de Microsoft) y Cisco Webex de una conexión VPN. Incorpora exclusiones de direcciones de red y exclusiones dinámicas (basadas en 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 excluirán del túnel. Desafortunadamente, la lista de direcciones es dinámica y podría cambiar potencialmente. Consulte la sección Configuración para obtener una secuencia de comandos de Python y un enlace a un bucle de impresión de lectura (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 de exclusión dividida, se agregó 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 debe o no atravesar el túnel. El script 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 un REPL Python 3 o ejecútelo en un entorno REPL público como https://repl.it/@ministryofjay/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",
"128.0.0.0",
"192.0.0.0",
"224.0.0.0",
"240.0.0.0",
"248.0.0.0",
"252.0.0.0",
"254.0.0.0",
"255.0.0.0",
"255.128.0.0",
"255.192.0.0",
"255.224.0.0",
"255.240.0.0",
"255.248.0.0",
"255.252.0.0",
"255.254.0.0",
"255.255.0.0",
"255.255.128.0",
"255.255.192.0",
"255.255.224.0",
"255.255.240.0",
"255.255.248.0",
"255.255.252.0",
"255.255.254.0",
"255.255.255.0",
"255.255.255.128",
"255.255.255.192",
"255.255.255.224",
"255.255.255.240",
"255.255.255.248",
"255.255.255.252",
"255.255.255.254",
"255.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=["13.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 = [
"64.68.96.0/19",
"66.114.160.0/20",
"66.163.32.0/19",
"170.133.128.0/18",
"173.39.224.0/19",
"173.243.0.0/20",
"207.182.160.0/19",
"209.197.192.0/19",
"216.151.128.0/19",
"114.29.192.0/19",
"210.4.192.0/20",
"69.26.176.0/20",
"62.109.192.0/18",
"69.26.160.0/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 del alcance de la conexión VPN el tráfico destinado a los servicios clave de Office 365 mediante la configuración de la tunelización dividida mediante los rangos de direcciones IPv4 e IPv6 publicados. Para obtener el mejor rendimiento y el uso más eficiente de la capacidad de VPN, el tráfico a estos rangos de direcciones IP dedicados asociados con Office 365 Exchange Online, SharePoint Online y los equipos de Microsoft (denominados categoría Optimizar en la documentación de Microsoft) se debe enrutar directamente, fuera del túnel VPN. Consulte Optimización de la conectividad de Office 365 para usuarios remotos mediante tunelización dividida VPN para obtener información más detallada sobre esta recomendación.
Nota: A principios de abril de 2020, Microsoft Teams depende de que el rango de IP 13.107.60.1/32 se deba excluir del túnel. Consulte Configuración y seguridad del tráfico de medios de equipos para obtener más información.
Verificación
Una vez que un usuario está conectado, debe ver las "Rutas no seguras" rellenadas con las direcciones proporcionadas en la ACL así como la lista "Exclusión dinámica de túnel".

