
strongswan v6.1.0
strongSwan - VPN baseada em IPsec
Configuração do strongSwan
Visão Geral
O strongSwan é uma solução de VPN OpenSource baseada em IPsec.
Este documento é apenas uma breve introdução ao comando swanctl do strongSwan, que utiliza a moderna vici Versatile IKE Configuration Interface. O comando ipsec, obsoleto, que usa a interface de configuração stroke legada, é descrito aqui. Para informações mais detalhadas, consulte as páginas de manual, o novo site de documentação e o wiki legado.
Quickstart
Certificados para usuários, hosts e gateways são emitidos por uma CA strongSwan
fictícia. Em nossos cenários de exemplo, o certificado da CA strongswanCert.pem
precisa estar presente em todos os endpoints VPN para que os pares possam ser
autenticados. Para sua aplicação VPN específica, você pode usar certificados de
qualquer CA de terceiros ou gerar você mesmo as chaves privadas e certificados
necessários com a ferramenta pki do strongSwan, cujo uso será explicado em
uma das seções a seguir.
Caso Site a Site
Neste cenário, dois gateways de segurança, moon e sun, conectarão as duas sub-redes moon-net e sun-net entre si por meio de um túnel VPN estabelecido entre os dois gateways:
10.1.0.0/16 -- | 192.168.0.1 | === | 192.168.0.2 | -- 10.2.0.0/16
moon-net moon sun sun-net
Configuração no gateway moon:
/etc/swanctl/x509ca/strongswanCert.pem
/etc/swanctl/x509/moonCert.pem
/etc/swanctl/private/moonKey.pem
/etc/swanctl/swanctl.conf:
connections {
net-net {
remote_addrs = 192.168.0.2
local {
auth = pubkey
certs = moonCert.pem
}
remote {
auth = pubkey
id = "C=CH, O=strongSwan, CN=sun.strongswan.org"
}
children {
net-net {
local_ts = 10.1.0.0/16
remote_ts = 10.2.0.0/16
start_action = trap
}
}
}
}
Configuração no gateway sun:
/etc/swanctl/x509ca/strongswanCert.pem
/etc/swanctl/x509/sunCert.pem
/etc/swanctl/private/sunKey.pem
/etc/swanctl/swanctl.conf:
connections {
net-net {
remote_addrs = 192.168.0.1
local {
auth = pubkey
certs = sunCert.pem
}
remote {
auth = pubkey
id = "C=CH, O=strongSwan, CN=moon.strongswan.org"
}
children {
net-net {
local_ts = 10.2.0.0/16
remote_ts = 10.1.0.0/16
start_action = trap
}
}
}
}
As identidades locais e remotas usadas neste cenário são os subjectDistinguishedNames contidos nos certificados de entidade final. Os certificados e as chaves privadas são carregados no daemon charon com o comando
swanctl --load-creds
enquanto
swanctl --load-conns
carrega as conexões definidas em swanctl.conf. Com start_action = trap, a
conexão IPsec é estabelecida automaticamente com o primeiro pacote IP de payload
em texto claro que quiser passar pelo túnel.
Caso Host a Host
Esta é uma configuração entre dois hosts únicos que não possuem uma sub-rede atrás deles. Embora o modo de transporte IPsec fosse suficiente para conexões host a host, usaremos o modo túnel IPsec padrão.
| 192.168.0.1 | === | 192.168.0.2 |
moon sun
Configuração no host moon:
/etc/swanctl/x509ca/strongswanCert.pem
/etc/swanctl/x509/moonCert.pem
/etc/swanctl/private/moonKey.pem
/etc/swanctl/swanctl.conf:
connections {
host-host {
remote_addrs = 192.168.0.2
local {
auth=pubkey
certs = moonCert.pem
}
remote {
auth = pubkey
id = "C=CH, O=strongSwan, CN=sun.strongswan.org"
}
children {
net-net {
start_action = trap
}
}
}
}
Configuração no host sun:
/etc/swanctl/x509ca/strongswanCert.pem
/etc/swanctl/x509/sunCert.pem
/etc/swanctl/private/sunKey.pem
/etc/swanctl/swanctl.conf:
connections {
host-host {
remote_addrs = 192.168.0.1
local {
auth = pubkey
certs = sunCert.pem
}
remote {
auth = pubkey
id = "C=CH, O=strongSwan, CN=moon.strongswan.org"
}
children {
host-host {
start_action = trap
}
}
}
}
Caso Roadwarrior
Este é um caso muito comum em que um gateway strongSwan atende a um número arbitrário de clientes VPN remotos, geralmente com endereços IP dinâmicos.
10.1.0.0/16 -- | 192.168.0.1 | === | x.x.x.x |
moon-net moon carol
Configuração no gateway moon:
/etc/swanctl/x509ca/strongswanCert.pem
/etc/swanctl/x509/moonCert.pem
/etc/swanctl/private/moonKey.pem
/etc/swanctl/swanctl.conf:
connections {
rw {
local {
auth = pubkey
certs = moonCert.pem
id = moon.strongswan.org
}
remote {
auth = pubkey
}
children {
net-net {
local_ts = 10.1.0.0/16
}
}
}
}
Configuração no roadwarrior carol:
/etc/swanctl/x509ca/strongswanCert.pem
/etc/swanctl/x509/carolCert.pem
/etc/swanctl/private/carolKey.pem
/etc/swanctl/swanctl.conf:
connections {
home {
remote_addrs = moon.strongswan.org
local {
auth = pubkey
certs = carolCert.pem
id = [email protected]
}
remote {
auth = pubkey
id = moon.strongswan.org
}
children {
home {
local_ts = 10.1.0.0/16
start_action = start
}
}
}
}
Para remote_addrs, foi escolhido o nome de host moon.strongswan.org, que
será resolvido por DNS em tempo de execução para o endereço IP de destino
correspondente. Neste cenário, a identidade do roadwarrior carol é o endereço
de e-mail [email protected], que deve ser incluído como
subjectAlternativeName no certificado do roadwarrior carolCert.pem.
Caso Roadwarrior com IP Virtual
Os roadwarriors geralmente têm endereços IP dinâmicos atribuídos pelo ISP ao qual estão conectados no momento. Para simplificar o roteamento de moon-net de volta ao cliente de acesso remoto carol, seria desejável que o roadwarrior tivesse um endereço IP interno escolhido de um pool predefinido.
10.1.0.0/16 -- | 192.168.0.1 | === | x.x.x.x | -- 10.3.0.1
moon-net moon carol virtual IP