VPN IPIP IPsec entre máquina Linux e Mikrotik por NAT do provedor

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á nosso túnel

Miktoik: CCR 1009, RouterOS 6.46.5

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

Vamos levantar o túnel IPsec na máquina Linux usando racoon. Não vou descrever os detalhes, existe um bom artigo u vvpoloskin.

Instalamos os pacotes necessários:

sudo install racoon ipsec-tools

Configuramos o racoon, que atuará como o servidor ipsec. Como o mikrotik no modo principal não pode transmitir um identificador adicional do cliente, e o endereço IP externo pelo qual ele se conecta ao Linux é dinâmico, não será possível usar a chave pré-compartilhada (autenticação por senha), pois a senha deve corresponder ao endereço IP do host que se conecta ou ao identificador.

Usaremos a autenticação por chaves RSA.

O daemon racoon usa chaves no formato RSA, e o mikrotik usa no formato PEM. Se gerarmos chaves com a ferramenta plainrsa-gen que vem junto com o racoon, não será possível converter a chave pública para o formato PEM com ela, pois ela converte apenas em uma direção: PEM para RSA. A chave gerada pelo plainrsa-gen não pôde ser lida nem pelo openssl, nem pelo ssh-keygen, portanto, também não será possível fazer a conversão com eles.

Geraremos a chave PEM usando openssl e, em seguida, a converteremos para o 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 obtidas na pasta: /etc/racoon/certs/server. Não esquecemos de definir o proprietário como o usuário sob o qual o daemon racoon é executado (geralmente root), permissões 600.

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

Carregaremos a chave server-name.pub.pem no mikrotik: Menu "Files" — "Upload."

Abrimos a seção "IP" — "IP sec" — aba "Keys". Agora geramos chaves — botão "Generate Key", em seguida exportamos a chave pública do mikrotik "Export Pub. Key", que pode ser baixada na seção "Files", clicando com o botão direito do mouse no arquivo — "Download."

Importamos a chave pública do racoon, "Import", no menu suspenso do campo "File name" buscamos a previously uploaded server-name.pub.pem.

A chave pública do mikrotik precisa ser convertida

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

e colocada na pasta /etc/racoon/certs não esquecendo do proprietário e permissões.

Configuração do racoon com comentários: /etc/racoon/racoon.conf

info de log; # Nível de log, ao depurar usamos Debug ou Debug2.

listen {

    isakmp 1.1.1.1 [500]; # Endereço e porta onde o daemon irá escutar.
    isakmp_natt 1.1.1.1 [4500]; # Endereço e porta onde o daemon irá escutar para clientes por trás de NAT.
    strict_address; # Realiza a verificação obrigatória de vínculo ao IP especificado acima.
}

path certificate "/etc/racoon/certs"; # Caminho para a pasta com certificados.

remote anonymous { # Seção que define os parâmetros para o funcionamento do daemon com ISAKMP e a negociação de modos com os hosts conectados. Como o IP do Mikrotik é dinâmico, usamos anonymous, o que permite a conexão a partir de qualquer endereço. Se os IPs dos hosts forem estáticos, um endereço e porta específicos podem ser indicados.

    passive on; # Define o modo de operação "servidor" do daemon, ele não tentará iniciar conexões.
    nat_traversal on; # Ativa o uso do modo NAT-T para clientes, caso estejam por trás de NAT. 
    exchange_mode main; # Modo de troca de parâmetros de conexão, neste caso --- negociação.
    my_identifier address 1.1.1.1; # Identificamos nosso host Linux pelo seu endereço IP.
    certificate_type plain_rsa "server/server-name.priv.key"; # Chave privada do servidor.
    peers_certfile plain_rsa "mikrotik.pub.key"; # Chave pública do Mikrotik.

    proposal_check claim; # Modo de negociação dos parâmetros do túnel ISAKMP. Racoon usará os valores do host conectado (iniciador) quanto ao tempo de vida da sessão e comprimento da chave, se o tempo de vida da sessão for maior, ou se o comprimento da chave for menor do que o do iniciador. Se o tempo de vida da sessão for menor que o do iniciador, racoon usará seu próprio valor de tempo de vida da sessão e enviará a mensagem RESPONDER-LIFETIME.
    proposal { # Parâmetros do túnel ISAKMP.

        encryption_algorithm aes; # Método de criptografia do túnel ISAKMP.
        hash_algorithm sha512; # Algoritmo de hash usado para o túnel ISAKMP.
        authentication_method rsasig; # Modo de autenticação para o túnel ISAKMP - por chaves RSA.
        dh_group modp2048; # Comprimento da chave para o algoritmo Diffie-Hellman na negociação do túnel ISAKMP.
        lifetime time 86400 sec; # Tempo de vida da sessão.
    }

    generate_policy on; # Criação automática de túneis ESP a partir do pedido recebido do host conectado.
}

sainfo anonymous { # Parâmetros dos túneis ESP, anonymous - os parâmetros indicados serão usados como padrão. Para diferentes clientes, portas, protocolos, parâmetros diversos podem ser definidos, a correspondência ocorre por endereços IP, portas, protocolos.

    pfs_group modp2048; # Comprimento da chave para o algoritmo Diffie-Hellman para túneis ESP.
    lifetime time 28800 sec; # Tempo de vida dos túneis ESP.
    encryption_algorithm aes; # Método de criptografia dos túneis ESP.
    authentication_algorithm hmac_sha512; # Algoritmo de hash usado para a autenticação dos túneis ESP.
    compression_algorithm deflate; # Compactar os dados transmitidos, apenas um algoritmo de compressão é sugerido.
}

Configuração mikrotik

Retornando à seção "IP" — "IPsec"

Aba "Profiles"
Parâmetro
O valor

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

Algoritmo de Hash
sha512

Algoritmo de Criptografia
aes-128

Grupo DH
modp2048

Proposhal_check
reivindicação

Tempo de Vida
1d 00:00:00

NAT Traversal
verdadeiro (marque a caixa)

DPD
120

Falha máxima do DPD
5

Aba "Peers"
Parâmetro
O valor

Nome
A seu critério (daqui em diante MyPeer)

Endereço
1.1.1.1 (IP da máquina Linux)

Endereço Local
10.0.0.2 (IP da interface WAN do mikrotik)

Perfil
padrão

Modo de Troca
main

Passivo
falso

Enviar INITIAL_CONTACT
verdadeiro

Aba "Proposal"
Parâmetro
O valor

Nome
A seu critério (daqui em diante MyPeerProposal)

Algoritmos de Autenticação
sha512

Algoritmos de Criptografia
aes-128-cbc

Tempo de Vida
08:00:00

Grupo PFS
modp2048

Aba "Identities"
Parâmetro
O valor

Peer
MyPeer

Método de Autenticação
chave rsa

Chave
mikrotik.privet.key

Chave Remota
server-name.pub.pem

Grupo de Modelo de Políticas
padrão

Cadena Notrack
vazio

Meu Tipo de ID
auto

Tipo de ID Remoto
auto

Correspondência Por
id remoto

Configuração de Modo
vazio

Gerar Política
não

Aba "Policies — General"
Parâmetro
O valor

Peer
MyPeer

Túnel
verdadeiro

Endereço Src.
192.168.0.0/30

Endereço Dest.
192.168.0.0/30

Protocol
255 (todos)

Modelo
falso

Aba "Policies — Action"
Parâmetro
O valor

Ações
encrypt

Nível
requer

Protocolos IPsec
esp

Proposta
MyPeerProposal

Provavelmente você tem, como eu, no interface WAN configurado snat/masquerade, essa regra precisa ser corrigida para que os pacotes de saída ipsec sejam enviados pelo nosso túnel:
Vamos à seção "IP" — "Firewall".
Aba "NAT", abra nossa regra snat/masquerade.

Aba "Advanced"
Parâmetro
O valor

Política IPsec
out: nenhum

Reinicie o demônio racoon

sudo systemctl restart racoon

Se ao reiniciar o racoon não iniciar, significa que há um erro na configuração, no syslog, o racoon fornece informações sobre o número da linha em que o erro foi encontrado.

O demônio racoon ao iniciar o sistema operacional começa antes da ativação das interfaces de rede, e nós especificamos na seção de escuta a opção strict_address, é necessário adicionar ao arquivo do unit systemd do racoon
/lib/systemd/system/racoon.service, в секцию [Unit], строку 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 através do qual o mikrotik se conecta"
        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 através do qual o mikrotik se conecta" 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 através do qual o mikrotik se conecta" dst 1.1.1.1
        proto esp reqid 0 mode tunnel

Se os túneis não subirem, verifique no syslog, ou journalctl -u racoon.

Agora é necessário configurar as interfaces L3 para que possamos rotear o tráfego. Existem várias opções, vamos usar IPIP, pois o Mikrotik suporta, eu usaria VTI, mas, infelizmente, o Mikrotik ainda não implementou isso. Diferente do IPIP, ele pode encapsular multicast adicionalmente e marcar pacotes (fwmark), que podem ser filtrados no iptables e iproute2 (roteamento baseado em política). Se você precisa da máxima funcionalidade — então, por exemplo, GRE. Mas não devemos esquecer que essa funcionalidade adicional vem com um overhead significativo.

Uma boa revisão das interfaces de túnel pode ser vista aqui. 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 podemos adicionar rotas para as 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 subam após a reinicialização, é necessário descrever a interface em /etc/network/interfaces e lá mesmo, no post-up, adicionar as rotas, ou podemos colocar tudo em um único arquivo, por exemplo, /etc/ipip-ipsec0.conf e chamá-lo através de post-up. Não esqueça sobre o proprietário do arquivo, permissões e torná-lo executável.

Abaixo está um exemplo de arquivo.

#!/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", adicionamos uma nova interface "IP tunnel":

Aba "IP tunnel" — "Geral"
Parâmetro
O valor

Nome
A seu critério (daqui em diante IPIP-IPsec0)

MTU
1480 (se não especificado, o Mikrotik começa a reduzir 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, um novo Peer será criado)

Keepalive
Desative o campo (senão, a interface será constantemente desligada, pois o Mikrotik tem algum formato próprio desses pacotes que não funciona com o Linux)

DSCP
herdar

Não Fragmentar
não

Ajustar TCP MSS
verdadeiro

Permitir Caminho Rápido
verdadeiro

Seção "IP" — "Endereços", adicionamos o endereço:

Parâmetro
O valor

Endereço
192.168.0.2/30

Interface
IPIP-IPsec0

Agora podemos adicionar rotas para as redes atrás da máquina Linux, ao adicionar uma rota, o gateway será nossa interface IPIP-IPsec0.

PS

Como nosso servidor Linux é transitório, vale a pena definir o parâmetro Ajustar TCP MSS para interfaces IPIP:

crie o 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

Na rede atrás do Mikrotik, tenho um nginx (ip 10.10.10.1), tornando-o acessível pela internet, vamos adicionar em /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
#No Mikrotik, na tabela mangle, é necessário adicionar uma regra de rota com o destino 192.168.0.1 para pacotes com o endereço de origem 10.10.10.1 e nas portas 80, 443.

# Também no Linux está funcionando o servidor OpenVPN 172.16.0.1/24, para os clientes que utilizam a conexão com ele como gateway, damos acesso à internet
-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 necessárias no iptables, se você tiver filtros de pacotes ativados.

Fique saudável!

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster