Túnel IPIP IPsec VPN entre una máquina Linux y Mikrotik detrás del NAT del proveedor

Linux: Ubuntu 18.04.4 LTS (GNU/Linux 4.15.0-91-generic x86_64)

  • Eth0 1.1.1.1/32 IP externo
  • ipip-ipsec0 192.168.0.1/30 será nuestro túnel

Miktoik: CCR 1009, RouterOS 6.46.5

  • Eth0 10.0.0.2/30 IP interno del proveedor. La IP externa NAT del proveedor es dinámica.
  • ipip-ipsec0 192.168.0.2/30 será nuestro túnel

El túnel IPsec en la máquina Linux será levantado con racoon. No entraré en detalles, hay un buen Windows sa-logic-subsets-canary-vs.yaml vvpoloskin.

Instalamos los paquetes necesarios:

sudo install racoon ipsec-tools

Configuramos racoon, que actuará como servidor ipsec. Dado que Mikrotik en modo main no puede transmitir un identificador de cliente adicional, y la dirección IP externa a través de la cual se conecta a Linux es dinámica, no será posible utilizar una clave compartida previamente (autenticación por contraseña), ya que la contraseña debe coincidir ya sea con la dirección IP del host conectado o con el identificador.

Usaremos autenticación por claves RSA.

El demonio racoon utiliza claves en formato RSA, mientras que Mikrotik utiliza el formato PEM. Si generamos claves con la utilidad plainrsa-gen que viene con racoon, no podremos convertir la clave pública para Mikrotik en formato PEM utilizando esta herramienta, ya que solo convierte en una dirección: de PEM a RSA. La clave generada por plainrsa-gen no pudo ser leída ni por openssl ni por ssh-keygen, por lo que tampoco será posible realizar la conversión con ellos.

Generaremos una clave PEM usando openssl, y luego la convertiremos para racoon usando plainrsa-gen:

#  Генерируем ключ
openssl genrsa -out server-name.pem 1024
# Извлекаем публичный ключ
openssl rsa -in server-name.pem -pubout > server-name.pub.pem
# Конвертируем
plainrsa-gen -i server-name.pem -f server-name.privet.key
plainrsa-gen -i server-name.pub.pem -f server-name.pub.key

Colocaremos las claves obtenidas en la carpeta: /etc/racoon/certs/server. No olvidemos establecer como propietario al usuario bajo el cual se ejecuta el demonio racoon (normalmente root), con permisos 600.

Describiré la configuración de Mikrotik al conectarme a través de WinBox.

Cargaremos la clave server-name.pub.pem en Mikrotik: Menú «Files» — «Upload».

Abrimos la sección «IP» — «IP sec» — pestaña «Keys». Ahora generamos claves — botón «Generate Key», luego exportamos la clave pública de Mikrotik «Export Pub. Key», la cual se puede descargar desde la sección «Files», haciendo clic derecho en el archivo — «Download».

Importamos la clave pública de racoon, «Import», en la lista desplegable del campo «File name» buscamos la server-name.pub.pem que subimos anteriormente.

La clave pública de Mikrotik necesita ser convertida

plainrsa-gen -i mikrotik.pub.pem -f mikrotik.pub.key

y colocarla en la carpeta /etc/racoon/certs sin olvidar sobre el propietario y los permisos.

Configuración de racoon con comentarios: /etc/racoon/racoon.conf

log info; # Nivel de registro, durante la depuración usamos Debug o Debug2.

listen {

    isakmp 1.1.1.1 [500]; # Dirección y puerto en el que escuchará el demonio.
    isakmp_natt 1.1.1.1 [4500]; # Dirección y puerto en el que escuchará el demonio para clientes tras NAT.
    strict_address; # Realizar verificación obligatoria de vinculación a las IPs mencionadas anteriormente.
}

path certificate "\/etc\/racoon\/certs"; # Ruta hasta la carpeta con certificados.

remote anonymous { # Sección que establece parámetros para el funcionamiento del demonio con ISAKMP y la negociación de modos con los hosts conectados. Dado que la IP desde la que se conecta Mikrotik es dinámica, usamos anonymous, lo que permite la conexión desde cualquier dirección. Si la IP de los hosts es estática, se puede indicar una dirección y puerto específicos.

    passive on; # Establece el modo "servidor" del demonio, no intentará iniciar conexiones.
    nat_traversal on; # Activa el uso del modo NAT-T para clientes, si están tras NAT. 
    exchange_mode main; # Modo de intercambio de parámetros de conexión, en este caso ---negociación.
    my_identifier address 1.1.1.1; # Identificamos nuestro host Linux por su dirección IP.
    certificate_type plain_rsa "server\/server-name.priv.key"; # Clave privada del servidor.
    peers_certfile plain_rsa "mikrotik.pub.key"; # Clave pública de Mikrotik.

    proposal_check claim; # Modo de negociación de parámetros del túnel ISAKMP. Racoon utilizará los valores del host conectante (iniciador) para el tiempo de vida de la sesión y la longitud de la clave, si su tiempo de vida de la sesión es mayor, o la longitud de su clave es más corta que la del iniciador. Si el tiempo de vida de la sesión es más corto que el del iniciador, racoon utilizará su propio valor de tiempo de vida de la sesión y enviará un mensaje RESPONDER-LIFETIME.
    proposal { # Parámetros del túnel ISAKMP.

        encryption_algorithm aes; # Método de cifrado del túnel ISAKMP.
        hash_algorithm sha512; # Algoritmo de hash utilizado para el túnel ISAKMP.
        authentication_method rsasig; # Modo de autenticación para el túnel ISAKMP - mediante claves RSA.
        dh_group modp2048; # Longitud de clave para el algoritmo de Diffie-Hellman en la negociación del túnel ISAKMP.
        lifetime time 86400 sec; Tiempo de vida de la sesión.
    }

    generate_policy on; # Creación automática de túneles ESP a partir de la solicitud recibida del host conectante.
}

sainfo anonymous { # Parámetros de los túneles ESP, anonymous - los parámetros especificados se utilizarán como valores predeterminados. Para diferentes clientes, puertos, protocolos se pueden establecer diferentes parámetros, el mapeo se realiza por direcciones IP, puertos, protocolos.

    pfs_group modp2048; # Longitud de clave para el algoritmo de Diffie-Hellman para túneles ESP.
    lifetime time 28800 sec; # Tiempo de vida de los túneles ESP.
    encryption_algorithm aes; # Método de cifrado para los túneles ESP.
    authentication_algorithm hmac_sha512; # Algoritmo de hash utilizado para la autenticación de túneles ESP.
    compression_algorithm deflate; # Comprimir los datos transmitidos, se propone un único algoritmo de compresión.
}

Configuración de mikrotik

Regresamos a la sección "IP" — "IPsec"

Pestaña "Profiles"
Parámetro
Valor

Nombre
A su discreción (por defecto default)

Algoritmo de Hash
sha512

Encryption Algorithm
aes-128

DH-Group
modp2048

Proposhal_check
claim

Tiempo de vida
1d 00:00:00

NAT Traversal
true (marcar la casilla)

DPD
120

Fallo máximo DPD
5

Pestaña "Peers"
Parámetro
Valor

Nombre
A su discreción (a continuación MyPeer)

Address
1.1.1.1 (IP de la máquina linux)

Dirección local
10.0.0.2 (IP de la interfaz WAN de mikrotik)

Perfil
default

Modo de intercambio
main

Pasivo
false

Enviar INITIAL_CONTACT
true

Pestaña "Proposal"
Parámetro
Valor

Nombre
A su discreción (a continuación MyPeerProposal)

Algoritmos de autenticación
sha512

Algoritmos de cifrado
aes-128-cbc

Tiempo de vida
08:00:00

Grupo PFS
modp2048

Pestaña "Identities"
Parámetro
Valor

Peer
MyPeer

Método de Autenticación
rsa key

Clave
mikrotik.privet.key

Clave Remota
server-name.pub.pem

Grupo de Plantillas de Políticas
default

Cadena Notrack
vacío

Mi tipo de ID
auto

Tipo de ID Remoto
auto

Coincidir por
id remoto

Configuración del modo
vacío

Generar política
no

Pestaña "Policies — General"
Parámetro
Valor

Peer
MyPeer

Túnel
true

Dirección de origen
192.168.0.0/30

Dirección de destino
192.168.0.0/30

Protocolo
255 (todos)

Plantilla
false

Pestaña "Policies — Action"
Parámetro
Valor

Acción
encrypt

Nivel
requier

Protocolos IPsec
esp

Propuesta
MyPeerProposal

Lo más probable es que usted, al igual que yo, tenga configurado snat/masquerade en la interfaz WAN, esta regla debe ajustarse para que los paquetes salientes de ipsec vayan a nuestro túnel:
Pasamos a la sección "IP" — "Firewall".
Pestaña "NAT", abrimos nuestra regla snat/masquerade.

Pestaña "Advanced"
Parámetro
Valor

Política IPsec
salida: ninguno

Reiniciamos el demonio racoon

sudo systemctl restart racoon

Si al reiniciar racoon no se inicia, significa que hay un error en la configuración, en syslog racoon muestra información sobre el número de línea donde se encontró el error.

El demonio racoon se inicia al cargar el sistema operativo, antes de que se levanten las interfaces de red, y hemos especificado en la sección listen la opción strict_address, es necesario agregar en el archivo del unidad systemd de racoon
/lib/systemd/system/racoon.service, в секцию [Unit], строку After=network.target.

Ahora nuestros túneles ipsec deberían levantarse, veamos la salida:

sudo ip xfrm policy

src 192.168.255.0/30 dst 192.168.255.0/30 
    dir out priority 2147483648 
    tmpl src 1.1.1.1 dst "IP NAT a través de la que se conecta mikrotik"
        proto esp reqid 0 mode tunnel
src 192.168.255.0/30 dst 192.168.255.0/30 
    dir fwd priority 2147483648 
    tmpl src "IP NAT a través de la que se conecta mikrotik" dst 1.1.1.1
        proto esp reqid 0 mode tunnel
src 192.168.255.0/30 dst 192.168.255.0/30 
    dir in priority 2147483648 
    tmpl src "IP NAT a través de la que se conecta mikrotik" dst 1.1.1.1
        proto esp reqid 0 mode tunnel

Si los túneles no se levantaron, mire syslog, o journalctl -u racoon.

Ahora es necesario configurar las interfaces L3 para poder enrutar el tráfico. Hay diferentes opciones, vamos a usar IPIP, ya que es compatible con Mikrotik; habría usado vti, pero, desafortunadamente, todavía no está implementado en Mikrotik. Se diferencia de IPIP en que puede encapsular multicast y asignar etiquetas (fwmark) a los paquetes, que se pueden filtrar en iptables y iproute2 (enrutamiento basado en políticas). Si se necesita la máxima funcionalidad, entonces, por ejemplo, GRE. Pero no hay que olvidar que pagamos un gran overhead por funcionalidad adicional.

Puedes ver la traducción de una buena revisión de las interfaces de túnel aquí.

En Linux:

# Создаем интерфейс
sudo ip tunnel add ipip-ipsec0 local 192.168.255.1 remote 192.168.255.2 mode ipip
# Активируем
sudo ip link set ipip-ipsec0 up
# Назначаем адрес
sudo ip addr add 192.168.255.1/30 dev ipip-ipsec0

Ahora se pueden agregar rutas para las redes detrás de Mikrotik

sudo ip route add A.B.C.D/Prefijo via 192.168.255.2

Para que nuestra interfaz y rutas se levanten después del reinicio, es necesario describir la interfaz en /etc/network/interfaces y allí añadir las rutas en post-up, o escribir todo en un solo archivo, por ejemplo, /etc/ipip-ipsec0.conf y ejecutarlo a través de post-up; no olvides acerca del propietario del archivo, los permisos, y hacerlo ejecutable.

A continuación, un ejemplo de archivo

#!/bin/bash
ip tunnel add ipip-ipsec0 local 192.168.255.1 remote 192.168.255.2 mode ipip
ip link set ipip-ipsec0 up
ip addr add 192.168.255.1/30 dev ipip-ipsec0

ip route add A.B.C.D/Prefix via 192.168.255.2

En Mikrotik:

Sección 'Interfaces', agregamos una nueva interfaz 'IP tunnel':

Pestaña 'IP tunnel' — 'General'
Parámetro
Valor

Nombre
A tu criterio (luego IPIP-IPsec0)

MTU
1480 (si no se especifica, Mikrotik comienza a recortar mtu a 68)

Dirección local
192.168.0.2

Dirección remota
192.168.0.1

Secreto de Ipsec
Desactivamos el campo (de lo contrario, se creará un nuevo Peer)

Keepalive
Desactivamos el campo (de lo contrario, la interfaz se apagará constantemente, ya que Mikrotik tiene un formato diferente para estos paquetes que no funciona con Linux)

DSCP
heredar

No fragmentar
no

Ajustar TCP MSS
true

Permitir Fast Path
true

Sección 'IP' — 'Addresses', agregamos una dirección:

Parámetro
Valor

Address
192.168.0.2/30

Interfaz
IPIP-IPsec0

Ahora se pueden agregar rutas en las redes detrás de la máquina Linux; al agregar una ruta, la puerta de enlace será nuestra interfaz IPIP-IPsec0.

PS

Dado que nuestro servidor Linux es transitario, tiene sentido establecer el parámetro Ajustar TCP MSS para las interfaces ipip:

crea el archivo /etc/iptables.conf con el siguiente contenido:

*mangle
-A POSTROUTING -o ipip+ -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
COMMIT

y en /etc/network/interfaces
post-up iptables-restore < /etc/iptables.conf

En la red detrás de Mikrotik tengo nginx (ip 10.10.10.1), lo hacemos accesible desde Internet, añadimos en /etc/iptables.conf:

*nat
-A PREROUTING -d 1.1.1.1/32 -p tcp -m multiport --dports 80,443 -j DNAT --to-destination 10.10.10.1
#En Mikrotik, en la tabla mangle, se debe agregar la regla route con la dirección 192.168.0.1 para paquetes con dirección de origen 10.10.10.1 y puertos 80, 443.

# También en Linux funciona el servidor OpenVPN 172.16.0.1/24, para clientes que utilizan la conexión a él como puerta de enlace les damos acceso a internet
-A POSTROUTING -s 172.16.0.0/24 -o eth0 -j SNAT --to-source 1.1.1.1
COMMIT 

No olvide agregar los permisos correspondientes en iptables, si tiene filtros de paquetes activados.

¡Salud!

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster