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

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

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

Miktoik: CCR 1009, RouterOS 6.46.5

  • IP interno Eth0 10.0.0.2/30 do provedor. O IP NAT externo do provedor é dinâmico.
  • ipip-ipsec0 192.168.0.2/30 será nosso túnel

Criaremos um túnel IPsec em uma máquina Linux usando racoon. Não vou descrever os detalhes, há um bom artigo у vpoloskin.

Instale os pacotes necessários:

sudo install racoon ipsec-tools

Configuramos o racoon, ele atuará condicionalmente como um servidor ipsec. Como o mikrotik no modo principal não pode transmitir um identificador de cliente adicional, e o endereço IP externo através do qual ele se conecta ao Linux é dinâmico, usar uma chave pré-compartilhada (autorização de senha) não funcionará, pois a senha deve corresponder ao endereço IP do o host de conexão ou com identificador.

Usaremos autorização usando chaves RSA.

O daemon racoon usa chaves no formato RSA e o mikrotik usa o formato PEM. Se você gerar chaves usando o utilitário plainrsa-gen que vem com o racoon, não será possível converter a chave pública do Mikrotika para o formato PEM com sua ajuda - ele converte apenas em uma direção: PEM para RSA. Nem o openssl nem o ssh-keygen conseguiram ler a chave gerada pelo plainrsa-gen, portanto a conversão também não será possível utilizando-os.

Iremos gerar uma chave PEM usando openssl e depois convertê-la 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 as chaves recebidas na pasta: /etc/racoon/certs/server. Não se esqueça de definir o proprietário do usuário sob cujo nome o daemon racoon é iniciado (geralmente root) para 600 permissões.

Descreverei a configuração do mikrotik ao conectar via WinBox.

Faça upload da chave server-name.pub.pem para o mikrotik: Menu “Arquivos” - “Upload”.

Abra a seção “IP” - “IP sec” - guia “Chaves”. Agora geramos chaves - o botão “Gerar Chave”, depois exportamos a chave pública mikrotika “Expor Pub. Key", você pode baixá-lo na seção "Arquivos", clique com o botão direito no arquivo - "Download".

Importamos a chave pública racoon, “Importar”, na lista suspensa do campo “Nome do arquivo” procuramos o server-name.pub.pem que baixamos anteriormente.

A chave pública do mikrotik precisa ser convertida

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

e coloque-o na pasta /etc/racoon/certs, sem esquecer do proprietário e dos direitos.

configuração do racoon com comentários: /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; # Сжимать передаваемые данные, алгоритм сжатия предлагается только один.
}

configuração do mikrotik

Retorne à seção "IP" - "IPsec"

Guia "Perfis"
Parâmetro
Valor

Nome
A seu critério (por padrão)

Algoritmo de hash
sha512

Algoritmo de encriptação
aes-128

Grupo DH
modp2048

Proposta_check
reivindicar

Lifetime
1d 00:00:00

Percurso NAT
verdadeiro (marque a caixa)

DPD
120

Falha máxima do DPD
5

Guia Pares
Parâmetro
Valor

Nome
A seu critério (doravante denominado MyPeer)

Endereço
1.1.1.1 (máquinas IP Linux)

Endereço local
10.0.0.2 (Interface IP WAN mikrotik)

Perfil
omissão

Modo de Troca
principal

Renda
falso

Enviar INITIAL_CONTACT
verdadeiro

Guia Proposta
Parâmetro
Valor

Nome
A seu critério (doravante MyPeerProposal)

Autorização Algoritmos
sha512

Encr. Algoritmos
aes-128-cbc

Lifetime
08:00:00

Grupo PFS
modp2048

Guia "Identidades"
Parâmetro
Valor

Ponto
MeuPeer

Ah, sim. Método
chave rsa

Chave
mikrotik.privet.key

Chave remota
nome do servidor.pub.pem

Grupo de modelos de política
omissão

Corrente Notrack
está vazio

Meu tipo de identificação
auto

Tipo de ID remoto
auto

Corresponder por
id remoto

Configuração de Modo
está vazio

Gerar política
não

Aba "Políticas - Geral"
Parâmetro
Valor

Ponto
MeuPeer

Túnel
verdadeiro

Sr. Endereço
192.168.0.0/30

Dest. Endereço
192.168.0.0/30

Protocolo
255 (todos)

Modelo
falso

Aba "Políticas - Ação"
Parâmetro
Valor

Açao Social
criptografar

Nível
exigir

Protocolos IPsec
esp

Proposta
Proposta MyPeer

Muito provavelmente, como eu, você tem snat/masquerade configurado em sua interface WAN; esta regra precisa ser ajustada para que os pacotes ipsec de saída entrem em nosso túnel:
Vá para a seção "IP" - "Firewall".
Aba "NAT", abra nossa regra snat/masquerade.

Guia Avançado
Parâmetro
Valor

Política IPsec
fora: nenhum

Reiniciando o demônio guaxinim

sudo systemctl restart racoon

Se o racoon não iniciar na reinicialização, há um erro na configuração; no syslog, o racoon exibe informações sobre o número da linha na qual o erro foi detectado.

Quando o sistema operacional inicializa, o daemon racoon inicia antes que as interfaces de rede sejam ativadas e especificamos a opção strict_address na seção listen; você precisa adicionar a unidade racoon ao arquivo systemd
/lib/systemd/system/racoon.service, na seção [Unit], linha After=network.target.

Agora nossos túneis ipsec devem estar ativos, veja 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úneis não estiverem funcionando, consulte o syslog ou o journalctl -u racoon.

Agora você precisa configurar interfaces L3 para que o tráfego possa ser roteado. Existem diferentes opções, usaremos IPIP, já que o mikrotik suporta, eu usaria vti, mas, infelizmente, ainda não foi implementado no mikrotik. Ele difere do IPIP porque pode encapsular adicionalmente multicast e colocar fwmarks em pacotes pelos quais eles podem ser filtrados em iptables e iproute2 (roteamento baseado em políticas). Se você precisar de funcionalidade máxima, por exemplo, GRE. Mas não se esqueça de que pagamos por funcionalidades adicionais com uma grande sobrecarga.

Você pode ver a tradução de uma boa visão geral das interfaces de túnel aqui.

No 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 você pode adicionar rotas para redes atrás do mikrotik

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

Para que nossa interface e rotas sejam levantadas após uma reinicialização, precisamos descrever a interface em /etc/network/interfaces e adicionar rotas lá no post-up, ou escrever tudo em um arquivo, por exemplo, /etc/ ipip-ipsec0.conf e puxe-o através do post-up, não se esqueça do proprietário do arquivo, dos direitos e torne-o executável.

Abaixo está um arquivo 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

No Mikrotik:

Seção “Interfaces”, adicione uma nova interface “Túnel IP”:

Aba “Túnel IP” - “Geral”
Parâmetro
Valor

Nome
A seu critério (doravante denominado IPIP-IPsec0)

MTU
1480 (se não for especificado o mikrotik começa a cortar o mtu para 68)

Endereço local
192.168.0.2

Endereço Remoto
192.168.0.1

Segredo IPsec
Desative o campo (caso contrário será criado um novo Peer)

Mantenha vivo
Desative o campo (caso contrário a interface será desligada constantemente, pois o mikrotika possui formato próprio para esses pacotes e não funciona com Linux)

DSCP
herdar

Não fragmente
não

Fixação TCP MSS
verdadeiro

Permitir atalho
verdadeiro

Seção “IP” - “Endereços”, adicione o endereço:

Parâmetro
Valor

Endereço
192.168.0.2/30

Interface
IPIP-IPsec0

Agora você pode adicionar rotas à rede atrás de uma máquina Linux; ao adicionar uma rota, o gateway será nossa interface IPIP-IPsec0.

PS

Como nosso servidor Linux é transitivo, faz sentido definir o parâmetro Clamp TCP MSS para interfaces ipip nele:

crie um arquivo /etc/iptables.conf com o seguinte conteúdo:

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

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

Tenho o nginx rodando na rede atrás do mikrotik (ip 10.10.10.1), torne-o acessível pela Internet, adicione-o ao /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 

Não se esqueça de adicionar as permissões apropriadas ao iptables se você tiver filtros de pacotes habilitados.

Mantenha-se saudável!

Fonte: habr.com

Adicionar um comentário