Túnel VPN IPIP IPsec entre a máquina Linux e Mikrotik detrás do provedor NAT

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

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

Miktoik: CCR 1009, RouterOS 6.46.5

  • Eth0 10.0.0.2/30 IP interna do provedor. A IP NAT externa do provedor é dinámica.
  • ipip-ipsec0 192.168.0.2/30 será o noso túnel

Crearemos un túnel IPsec nunha máquina Linux usando racoon. Non vou describir os detalles, hai un bo artigo у vvpoloskin.

Instala os paquetes necesarios:

sudo install racoon ipsec-tools

Configuramos racoon, actuará condicionalmente como servidor ipsec. Dado que mikrotik no modo principal non pode transmitir un identificador de cliente adicional e o enderezo IP externo a través do cal se conecta a Linux é dinámico, o uso dunha clave previamente compartida (autorización de contrasinal) non funcionará, xa que o contrasinal debe coincidir co enderezo IP de o host de conexión ou con identificador.

Usaremos a autorización mediante claves RSA.

O daemon racoon usa claves no formato RSA e mikrotik usa o formato PEM. Se xeras claves usando a utilidade plainrsa-gen que vén con racoon, non poderás converter a chave pública de Mikrotika a formato PEM coa súa axuda; só convértese nunha dirección: PEM en RSA. Nin openssl nin ssh-keygen puideron ler a clave xerada por plainrsa-gen, polo que tampouco será posible a conversión utilizándoas.

Xeraremos unha clave PEM usando openssl e despois convertémola 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

Poñeremos as claves recibidas no cartafol: /etc/racoon/certs/server. Non esquezas establecer o propietario do usuario baixo cuxo nome se inicia o daemon racoon (normalmente root) con 600 permisos.

Vou describir a configuración de mikrotik cando me conecte a través de WinBox.

Cargue a chave server-name.pub.pem en mikrotik: Menú "Ficheiros" - "Cargar".

Abra a sección "IP" - "IP sec" - pestana "Chaves". Agora xeramos claves: o botón "Xerar chave", despois exportamos a chave pública mikrotika "Expor Pub. Chave", podes descargalo desde a sección "Ficheiros", fai clic co botón dereito no ficheiro - "Descargar".

Importamos a chave pública de racoon, "Importar", na lista despregable do campo "Nome do ficheiro" buscamos o nome do servidor.pub.pem que descargamos anteriormente.

Hai que converter a chave pública mikrotik

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

e méteo no cartafol /etc/racoon/certs, sen esquecer o propietario e os dereitos.

configuración de racoon 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 de mikrotik

Volver á sección "IP" - "IPsec"

Pestana "Perfís".
Parámetro
Valor

nome
Ao teu criterio (por defecto)

Algoritmo Hash
sha512

Algoritmo de cifrado
aes-128

Grupo DH
modp2048

Comprobación_de propostas
reclamar

Vida
1d 00:00:00

Travesía NAT
verdadeiro (marca a caixa)

DPD
120

Fallo máximo DPD
5

Pestana Peers
Parámetro
Valor

nome
Ao seu criterio (en diante MyPeer)

dirección
1.1.1.1 (máquinas IP Linux)

Enderezo local
10.0.0.2 (IP WAN interface mikrotik)

Perfil
defecto

Modo de intercambio
Inicio

Pasiva
teito

Enviar INITIAL_CONTACT
certo

Pestana de propostas
Parámetro
Valor

nome
Ao seu criterio (en diante, MyPeerProposal)

Auth. Algoritmos
sha512

Encr. Algoritmos
aes-128-cbc

Vida
08:00:00

Grupo PFS
modp2048

Pestana "Identidades".
Parámetro
Valor

Pera
MyPeer

Atuh. Método
clave rsa

Clave
mikrotik.privet.key

Chave remota
nome-servidor.pub.pem

Grupo de modelos de políticas
defecto

Cadea Notrack
baleiro

O meu tipo de identificación
automático

Tipo de ID remoto
automático

Partido por
ID remoto

Configuración do modo
baleiro

Xerar política
non

Pestana "Políticas - Xeral"
Parámetro
Valor

Pera
MyPeer

túnel
certo

Sr. Enderezo
192.168.0.0/30

Dest. Enderezo
192.168.0.0/30

Protocolo
255 (todos)

Modelo
teito

Pestana "Políticas - Acción"
Parámetro
Valor

acción
cifrar

Nivel
requirir

Protocolos IPsec
esp

Proposta
MyPeerProposal

O máis probable é que, coma min, teñas configurado snat/masquerade na túa interface WAN; esta regra debe ser axustada para que os paquetes ipsec saíntes entren no noso túnel:
Vaia á sección "IP" - "Firewall".
Pestana "NAT", abra a nosa regra snat/masquerade.

Ficha Avanzadas
Parámetro
Valor

Política IPsec
fóra: ningún

Reiniciando o demo mapache

sudo systemctl restart racoon

Se racoon non se inicia ao reiniciar, entón hai un erro na configuración; en syslog, racoon mostra información sobre o número de liña na que se detectou o erro.

Cando se inicia o SO, o daemon racoon comeza antes de que aparezan as interfaces de rede, e especificamos a opción strict_address na sección de escoitar; cómpre engadir a unidade racoon ao ficheiro systemd.
/lib/systemd/system/racoon.service, na sección [Unidade], liña After=network.target.

Agora os nosos túneles ipsec deberían estar activos, mira a saída:

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

Se os túneles non están funcionando, mira o syslog ou journalctl -u racoon.

Agora cómpre configurar as interfaces L3 para que o tráfico poida ser encamiñado. Hai diferentes opcións, usaremos IPIP, xa que mikrotik o admite, eu usaría vti, pero, por desgraza, aínda non se implementou en mikrotik. Diferénciase de IPIP en que ademais pode encapsular multicast e poñer fwmarks nos paquetes, polo que poden filtrarse en iptables e iproute2 (enrutamento baseado en políticas). Se precisa a máxima funcionalidade, entón, por exemplo, GRE. Pero non esquezas que pagamos unha funcionalidade adicional cunha gran sobrecarga.

Podes ver a tradución dunha boa visión xeral das interfaces do 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

Agora podes engadir rutas para redes detrás de mikrotik

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

Para que a nosa interface e as rutas aparezan despois dun reinicio, necesitamos describir a interface en /etc/network/interfaces e engadir rutas alí no post-up, ou escribir todo nun ficheiro, por exemplo, /etc/ ipip-ipsec0.conf e tírao a través do post-up, non te esquezas do propietario do ficheiro, dereitos e faino executable.

A continuación móstrase un ficheiro de exemplo

#!/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", engade unha nova interface "túnel IP":

Pestana "Túnel IP" - "Xeral"
Parámetro
Valor

nome
Ao seu criterio (en diante IPIP-IPsec0)

MTU
1480 (se non se especifica, mikrotik comeza a cortar mtu a 68)

Enderezo local
192.168.0.2

Enderezo remoto
192.168.0.1

Segredo IPsec
Desactiva o campo (se non, crearase un novo Peer)

Manter vivo
Desactive o campo (se non, a interface apagarase constantemente, xa que mikrotika ten o seu propio formato para estes paquetes e non funciona con Linux)

DSCP
herdar

Non fragmentar
non

Clamp TCP MSS
certo

Permitir o camiño rápido
certo

Sección "IP" - "Enderezos", engade o enderezo:

Parámetro
Valor

dirección
192.168.0.2/30

Interface
IPIP-IPsec0

Agora podes engadir rutas á rede detrás dunha máquina Linux; ao engadir unha ruta, a pasarela será a nosa interface IPIP-IPsec0.

PS

Dado que o noso servidor Linux é transitivo, ten sentido configurar o parámetro Clamp TCP MSS para interfaces ipip:

cree un ficheiro /etc/iptables.conf co seguinte contido:

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

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

Teño nginx funcionando na rede detrás de mikrotik (ip 10.10.10.1), faino accesible desde Internet, engádeo 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 

Non esquezas engadir os permisos axeitados a iptables se tes activados os filtros de paquetes.

Sexa saudable

Fonte: www.habr.com

Engadir un comentario