Túnel VPN IPIP IPSEC entre Linux Machine y Mikrotik detrás del proveedor NAT

Linux: Ubuntu 18.04.4 LTS (GNU/Linux 4.15.0-91-genérico x86_64)

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

micrófono: CCR 1009, enrutador OS 6.46.5

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

Crearemos un túnel IPsec en una máquina Linux usando racoon. No describiré los detalles, hay uno bueno. artículo у vvpoloskin.

Instale los paquetes necesarios:

sudo install racoon ipsec-tools

Configuramos racoon, actuará condicionalmente como un servidor ipsec. Dado que mikrotik en modo principal 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, el uso de una clave previamente compartida (autorización de contraseña) no funcionará, ya que la contraseña debe coincidir con la dirección IP de el host de conexión o con el identificador.

Usaremos la autorización mediante claves RSA.

El demonio mapache usa claves en formato RSA y mikrotik usa el formato PEM. Si genera claves usando la utilidad Plainrsa-gen que viene con racoon, entonces no podrá convertir la clave pública de Mikrotika al formato PEM con su ayuda; solo convierte en una dirección: PEM a RSA. Ni openssl ni ssh-keygen pudieron leer la clave generada por Plainrsa-gen, por lo que tampoco será posible la conversión utilizándolos.

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

Pondremos las claves recibidas en la carpeta: /etc/racoon/certs/server. No olvide configurar el propietario del usuario bajo cuyo nombre se inicia el demonio mapache (generalmente root) en 600 permisos.

Describiré la configuración de mikrotik cuando me conecte a través de WinBox.

Sube la clave server-name.pub.pem a mikrotik: Menú “Archivos” - “Cargar”.

Abra la sección "IP" - "IP seg" - pestaña "Claves". Ahora generamos claves: el botón "Generar clave", luego exportamos la clave pública de mikrotika "Expor Pub. Clave", puede descargarlo desde la sección "Archivos", haga clic derecho en el archivo - "Descargar".

Importamos la clave pública de racoon, “Importar”, en la lista desplegable del campo “Nombre de archivo” buscamos el nombre-servidor.pub.pem que descargamos anteriormente.

Es necesario convertir la clave pública de mikrotik.

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

y colóquelo en la carpeta /etc/racoon/certs, sin olvidar el propietario y los derechos.

configuración de mapache con comentarios: /etc/racoon/racoon.conf

log info; # Уровень логирования, при отладке используем Debug или Debug2.

listen {

    isakmp 1.1.1.1 [500]; # Адрес и порт, на котором будет слушать демон.
    isakmp_natt 1.1.1.1 [4500]; # Адрес и порт, на котором будет слушать демон для клиентов за NAT.
    strict_address; # Выполнять обязательную проверку привязки к указанным выше IP.
}

path certificate "/etc/racoon/certs"; # Путь до папки с сертификатами.

remote anonymous { # Секция, задающая параметры для работы демона с ISAKMP и согласования режимов с подключающимися хостами. Так как IP, с которого подключается Mikrotik, динамический, то используем anonymous, что разрешает подключение с любого адреса. Если IP у хостов статический, то можно указать конкретный адрес и порт.

    passive on; # Задает "серверный" режим работы демона, он не будет пытаться инициировать подключения.
    nat_traversal on; # Включает использование режима NAT-T для клиентов, если они за NAT. 
    exchange_mode main; # Режим обмена параметрами подключения, в данном случае ---согласование.
    my_identifier address 1.1.1.1; # Идентифицируем наш linux хост по его ip адресу.
    certificate_type plain_rsa "server/server-name.priv.key"; # Приватный ключ сервера.
    peers_certfile plain_rsa "mikrotik.pub.key"; # Публичный ключ Mikrotik.

    proposal_check claim; # Режим согласования параметров ISAKMP туннеля. Racoon будет использовать значения подключающегося хоста (инициатора) для срока действия сессии                   и длины ключа, если его срок действия сессии больше, или длина его ключа короче, чем у инициатора. Если срок действия сессии короче, чем у инициатора, racoon использует собственное значение срока действия сессии и будет отправлять сообщение RESPONDER-LIFETIME.
    proposal { # Параметры ISAKMP туннеля.

        encryption_algorithm aes; # Метод шифрования ISAKMP туннеля.
        hash_algorithm sha512; # Алгоритм хеширования, используемый для ISAKMP туннеля.
        authentication_method rsasig; # Режим аутентификации для ISAKMP туннеля - по RSA ключам.
        dh_group modp2048; # Длина ключа для алгоритма Диффи-Хеллмана при согласовании ISAKMP туннеля.
        lifetime time 86400 sec; Время действия сессии.
    }

    generate_policy on; # Автоматическое создание ESP туннелей из запроса, пришедшего от подключающегося хоста.
}

sainfo anonymous { # Параметры ESP туннелей, anonymous - указанные параметры будут использованы как параметры по умолчанию. Для разных клиентов, портов, протоколов можно              задавать разные параметры, сопоставление происходит по ip адресам, портам, протоколам.

    pfs_group modp2048; # Длина ключа для алгоритма Диффи-Хеллмана для ESP туннелей.
    lifetime time 28800 sec; # Срок действия ESP туннелей.
    encryption_algorithm aes; # Метод шифрования ESP туннелей.
    authentication_algorithm hmac_sha512; # Алгоритм хеширования, используемый для аутентификации ESP туннелей.
    compression_algorithm deflate; # Сжимать передаваемые данные, алгоритм сжатия предлагается только один.
}

configuración del micrófono

Volver a la sección "IP" - "IPsec"

Pestaña "Perfiles"
Parámetro
Valor

Nombre
A su discreción (por defecto predeterminado)

Algoritmo hash
sha512

Algoritmo de cifrado
aes-128

Grupo DH
modp2048

propuesta_check
reclamo

De por vida
1d 00:00:00

NAT transversal
verdadero (marque la casilla)

DPD
120

Fallo máximo de DPD
5

Pestaña de pares
Parámetro
Valor

Nombre
A su discreción (en adelante, MyPeer)

Dirección
1.1.1.1 (máquinas IP Linux)

Dirección local
10.0.0.2 (interfaz IP WAN micrófono)

Mi Perfil
tu préstamo estudiantil

Modo de intercambio
principal

Ingresos pasivos
false

Enviar INITIAL_CONTACT
verdadero

Pestaña de propuesta
Parámetro
Valor

Nombre
A su discreción (en adelante, MyPeerProposal)

Autenticación. Algoritmos
sha512

Enc. Algoritmos
aes-128-cbc

De por vida
08:00:00

Grupo PFS
modp2048

Pestaña "Identidades"
Parámetro
Valor

Peer
Mi compañero

Atuh. Método
clave rsa

Clave
mikrotik.privet.key

Clave remota
nombre-servidor.pub.pem

Grupo de plantillas de políticas
tu préstamo estudiantil

Cadena Notrack
esta vacio

Mi tipo de identificación
auto

Tipo de identificación remota
auto

Coincidir por
identificación remota

Configuración de modo
esta vacio

Generar política
no

Pestaña "Políticas - General"
Parámetro
Valor

Peer
Mi compañero

Túnel
verdadero

Src. DIRECCIÓN
192.168.0.0/30

Destino DIRECCIÓN
192.168.0.0/30

Protocolo
255 (todos)

Plantilla
false

Pestaña "Políticas - Acción"
Parámetro
Valor

la columna Acción
cifrar

Nivel
solicitante

Protocolos IPsec
esp

Propuesta
Mi propuesta de pares

Lo más probable es que, como yo, tengas configurado snat/masquerade en tu interfaz WAN; esta regla debe ajustarse para que los paquetes ipsec salientes entren en nuestro túnel:
Vaya a la sección "IP" - "Firewall".
Pestaña "NAT", abre nuestra regla snat/masquerade.

Lengüeta avanzada
Parámetro
Valor

Política IPsec
fuera: ninguno

Reiniciando el demonio mapache

sudo systemctl restart racoon

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

Cuando se inicia el sistema operativo, el demonio racoon se inicia antes de que se activen las interfaces de red, y especificamos la opción estricto_address en la sección de escucha; debe agregar la unidad racoon al archivo systemd
/lib/systemd/system/racoon.service, en la sección [Unidad], línea After=network.target.

Ahora nuestros túneles ipsec deberían estar activos, mire el resultado:

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 через который подключается 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 через который подключается 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 через который подключается mikrotik" dst 1.1.1.1
        proto esp reqid 0 mode tunnel

Si los túneles no están activos, mire syslog o journalctl -u racoon.

Ahora necesita configurar las interfaces L3 para que se pueda enrutar el tráfico. Hay diferentes opciones, usaremos IPIP, ya que mikrotik lo admite, yo usaría vti, pero lamentablemente aún no se ha implementado en mikrotik. Se diferencia de IPIP en que además puede encapsular multidifusión y colocar marcas de seguridad en los paquetes, mediante las cuales se pueden filtrar en iptables e iproute2 (enrutamiento basado en políticas). Si necesita la máxima funcionalidad, entonces, por ejemplo, GRE. Pero no olvide que pagamos por una funcionalidad adicional con un gran cabezal superior.

Podéis ver la traducción de una buena reseña de interfaces de túneles. 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 puedes agregar rutas para redes detrás de mikrotik

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

Para que nuestra interfaz y rutas se generen después de un reinicio, debemos describir la interfaz en /etc/network/interfaces y agregar rutas allí en la publicación, o escribir todo en un archivo, por ejemplo, /etc/ ipip-ipsec0.conf y páselo por post-up, no te olvides del propietario del archivo, los derechos y hazlo ejecutable.

A continuación se muestra un archivo de ejemplo.

#!/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 Microtik:

En la sección “Interfaces”, agregue una nueva interfaz “túnel IP”:

Pestaña “Túnel IP” - “General”
Parámetro
Valor

Nombre
A su discreción (en adelante IPIP-IPsec0)

MTU
1480 (si no se especifica, mikrotik comienza a cortar mtu a 68)

Dirección local
192.168.0.2

Dirección remota
192.168.0.1

Secreto IPsec
Desactive el campo (de lo contrario se creará un nuevo Peer)

Mantener viva
Desactive el campo (de lo contrario la interfaz se apagará constantemente, ya que mikrotika tiene su propio formato para estos paquetes y no funciona con Linux)

DSCP
heredar

No fragmentar
no

Abrazar TCP MSS
verdadero

Permitir ruta rápida
verdadero

Sección “IP” - “Direcciones”, agregue la dirección:

Parámetro
Valor

Dirección
192.168.0.2/30

Interfaz
IPIP-IPsec0

Ahora puede agregar rutas a la red detrás de una máquina Linux; al agregar una ruta, la puerta de enlace será nuestra interfaz IPIP-IPsec0.

PS

Dado que nuestro servidor Linux es transitivo, tiene sentido configurar en él el parámetro Clamp TCP MSS para las interfaces ipip:

cree un 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

Tengo nginx ejecutándose en la red detrás de mikrotik (ip 10.10.10.1), lo hago accesible desde Internet, lo agrego a /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
#На mikrotik, в таблице mangle, надо добавить правило route с назначением 192.168.0.1 для пакетов с адресом источника 10.10.10.1 и портов 80, 443.

# Так же на linux работает OpenVPN сервер 172.16.0.1/24, для клиентов которые используют подключение к нему в качестве шлюза даем доступ в интернет
-A POSTROUTING -s 172.16.0.0/24 -o eth0 -j SNAT --to-source 1.1.1.1
COMMIT 

No olvide agregar los permisos apropiados a iptables si tiene habilitados los filtros de paquetes.

Estar sano!

Fuente: habr.com

Añadir un comentario