pfSense — VPN IPsec Site-to-Site
Cenário
192.168.1.0/24 ── pfSense A (WAN: 200.200.200.1)
│
==== INTERNET ====
│
192.168.2.0/24 ── pfSense B (WAN: 201.201.201.1)
Pré-requisitos
IP público nos dois lados · UDP 500 e 4500 (NAT-T) liberadas · ESP (protocolo IP 50) liberado · NTP sincronizado · redes locais sem sobreposição.
Configuração (GUI)
pfSense A → VPN → IPsec → + Add P1:
| Campo | Valor |
|---|---|
| Exchange Version | IKEv2 |
| Remote Gateway | 201.201.201.1 |
| Authentication | Mutual PSK |
| Pre-Shared Key | (senha forte) |
| Encryption / Hash | AES256 / SHA256 |
| DH Group | 14 |
| Lifetime | 28800 |
Show Phase 2 Entries → + Add P2:
| Campo | Valor |
|---|---|
| Mode | Tunnel IPv4 |
| Local Network | 192.168.1.0/24 |
| Remote Network | 192.168.2.0/24 |
| Protocol | ESP · AES256 · SHA256 |
| PFS | Group 14 |
| Lifetime | 3600 |
pfSense B: configure o inverso (Remote Gateway 200.200.200.1, redes trocadas), restante igual.
Firewall Rules: em Firewall → Rules → IPsec, adicione Pass / Any nos dois lados (em produção, restrinja a origem/destino). NAT em geral não é necessário.
Verificar: Status → IPsec deve mostrar ESTABLISHED (IKE SA e CHILD SA). Teste com Diagnostics → Ping para um host da rede remota.
CLI (strongSwan)
ipsec statusall # status completo das SAs
swanctl --list-sas # associações ativas
ipsec down all # derruba todos os túneis
ipsec up <nome_da_conexao> # sobe novamente
service strongswan restart # reinicia IPsec
/usr/local/etc/rc.restart_ipsec # idem, via script do pfSense
clog /var/log/ipsec.log # logs
setkey -DP # políticas (SPD)
setkey -D # SAs (SAD)
sockstat -4 -l | grep 500 # portas IKE
tcpdump -ni igb0 port 500 # captura IKE
tcpdump -ni igb0 port 4500 # captura NAT-T
tcpdump -ni igb0 proto 50 # captura ESP
Configuração fica em /cf/conf/config.xml; o strongSwan gera /var/etc/ipsec/* automaticamente — não edite esses arquivos diretamente.
Boas práticas
- IKEv2, AES-256, SHA-256+, DH Group 14+
- Ative DPD (Dead Peer Detection)
- NAT-T se um dos lados estiver atrás de NAT
- Regras de firewall específicas em vez de Any→Any em produção