Pacotes IPSEC de saída NAT usando pf no FreeBSD 11 e StrongSwan x FortiGATE

6

Estou trabalhando há mais de uma semana tentando obter pacotes de saída nat'ed para atender a uma associação de segurança.

Este é o meu cenário (exemplo):

  • LAN: 1.1.1.0/24
  • Interface do FreeBSD: xn0 (instância do Amazon EC2)
  • Endereço virtual para tráfego nat de: 2.2.2.2/32
  • Destino para alcançar: 3.3.3.3/32

Descrição do problema

Apesar de eu ter todos os SAs em execução na FreeBSD Box, tentando nat os pacotes usando pf ou ipfw, não funciona, o pacote nat'ed continua fluindo usando a interface de rota padrão e não funciona entre no túnel ipsec.

Aqui está um exemplo de SA usando:

$ ipsec status vpn
vpn{1}:  INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: cca608fa_i d74355dc_o vpn{1}:  AES_CBC_256/HMAC_SHA2_256_128, 2688 bytes_i (32 pkts, 32s ago), 4992 bytes_o (32 pkts, 32s ago), rekeying in 43 minutes vpn{1}:   2.2.2.2/32 === 3.3.3.3/32

esta é a minha regra nat sobre pf.conf :

nat on enc0 from 1.1.1.0/24 to 2.2.2.2/32 -> 3.3.3.3

Este é o meu ipsec0 interface status :

ipsec0:  flags=8011<UP,POINTOPOINT,MULTICAST> metric 0 mtu 1400     inet 3.3.3.3/32 --> 2.2.2.2/32 netmask 0xffffffff options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>     reqid: 0    groups: ipsec

Eu posso alcançar o 2.2.2.2 de 3.3.3.3 suavemente.

Esta é uma captura simples de pacotes no xn0 (interface física):

$ tcpdump -i xn0 -n -vvv host 2.2.2.2
1.1.1.10 > 2.2.2.2: ICMP echo request, id 15745, seq 818, length 64

e nenhum tráfego é visto no enc0.

Outra tentativa foi definir via sysctl :

net.inet.ipsec.filtertunnel=1

Mas não tenho certeza do que exatamente essa opção faz.

Eu vi muitas pessoas lutando para que esse tipo de nat funcionasse sem sucesso.

    
por Tiago Sampaio 23.07.2018 / 00:46

1 resposta

4

Depois de vários dias lutando, eu pude lidar com isso, fazendo os seguintes passos e postarei a solução aqui para ajudar os outros

Obtenha o ID exclusivo do SA desejado que você deseja que seja nat, por exemplo:

setkey -DP

e encontre o ID exclusivo do SA:

3.3.3.3[any] 2.2.2.2[any] any
    out ipsec
    esp/tunnel/REALIPLOCAL-REALIPREMOTE/unique:1
    created: Jul 22 22:29:34 2018  lastused: Jul 22 22:29:34 2018
    lifetime: 9223372036854775807(s) validtime: 0(s)
    spid=2715 seq=0 pid=13358 scope=global
    refcnt=1

neste caso: 1

adicione uma nova política:

setkey -v -c
spdadd -4 1.1.1.0/24 2.2.2.2/32 any -P out ipsec esp/tunnel/REALLOCALIP-REALREMOTEIP/unique:1;

Isso deve ser suficiente para rotear os pacotes dentro do túnel e obtê-los nat'ed para coincidir com o SA real instalado.

Lembre-se de que esse ID exclusivo deve corresponder ao SA instalado e, se você alterar a ordem de instalação do SA no StrongSwan, deverá alterar essa política para se ajustar ao novo UniqueID.

As regras nat devem ser aplicadas na interface enc0.

Referência:

link

Boa sorte.

    
por 23.07.2018 / 00:59