Então, eu consegui descobrir isso depois de muita pesquisa, eu posso usar a funcionalidade nativa de VPN Site-to-Site do Azure com o OpenSwan que roda em uma caixa Linux (Raspberry Pi / Arch Linux) atrás roteador NAT da minha rede doméstica.
Topologia de rede:
- 192.168.0.0/24 - Rede doméstica
- 192.168.1.0/24 - rede do Azure
- 192.168.0.1 - IP privado do roteador residencial
- 192.168.0.2 - Caixa Linux atuando como servidor VPN e gatewat da rede doméstica
Primeiramente, eu configuro o Azure com:
- Sua rede remota é normal
- Minha rede local com o endereço VPN como meu IP público
- Habilitou a caixa de seleção Site a Site na rede do Azure, vinculando-a à minha rede local
- Criado um gateway static para que o IKEv1 seja usado
No roteador da minha rede doméstica, encaminhei o seguinte para o meu gateway Linux executando o Openswan (192.168.0.2):
- UDP 500
- UDP 4500
- Protocolo 50 (GRE)
Meu ipsec.conf se parece com isto:
version 2.0
config setup
nat_traversal=yes
virtual_private=%4:192.168.0.0/24
protostack=auto
interfaces="ipsec0=eth0"
conn azure
authby=secret
auto=start
type=tunnel
left=192.168.0.2
leftsubnet=192.168.0.0/24
leftnexthop=192.168.0.1
right=<azure's VPN gateway IP>
rightsubnet=192.168.1.0/24
ike=3des-sha1-modp1024,aes128-sha1-modp1024
esp=3des-sha1,aes128-sha1
pfs=no
ipsec.secrets:
192.168.0.2 <azure vpn gateway> : PSK "Azure's PSK"
Isso colocou o link em funcionamento, para permitir o roteamento entre sites (nos dois casos após muita frustração):
/etc/sysctl.conf:
net.ipv4.ip_forward = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.icmp_ignore_bogus_error_responses = 1
Um script bash que é executado na inicialização para manter "ipsec verify" feliz:
#!/bin/bash
for vpn in /proc/sys/net/ipv4/conf/*; do
echo 0 > $vpn/accept_redirects;
echo 0 > $vpn/send_redirects;
done
sysctl -p
Finalmente, minhas regras do iptables, que levaram o maior número possível de brincadeiras:
tabela de filtros, isso permite que a rede doméstica se conecte ao Azure e permita que a conexão seja estabelecida, mas as VMs do Azure ainda não conseguem se conectar a servidores de rede domésticos:
-A FORWARD -s 192.168.1.0/24 -m policy --dir in --pol ipsec -j ACCEPT
-A FORWARD -s 192.168.0.0/24 -m policy --dir out --pol ipsec -j ACCEPT
-A INPUT -p udp -m udp --dport 500 -j ACCEPT
-A INPUT -p udp -m udp --dport 4500 -j ACCEPT
-A INPUT -m policy --dir in --pol ipsec -j ACCEPT
-A INPUT -p esp -j ACCEPT
nat table, isso permite que as VMs do Azure se conectem a qualquer máquina na minha rede doméstica:
-A PREROUTING -i eth0 -p udp -m udp --dport 4500 -j DNAT --to-destination <azure public vpn ip>:4500
-A PREROUTING -i eth0 -p udp -m udp --dport 500 -j DNAT --to-destination <azure public vpn ip>:500
-A POSTROUTING -o eth0 -j MASQUERADE
Com tudo isso, posso fazer ping e comunicar em ambas as direções, todas as VMs do Azure podem ver minha rede doméstica, todas as máquinas da rede doméstica podem ver minhas VMs do Azure.
O lado do Azure roteia corretamente sozinho, para minha rede doméstica, configurei uma rota estática em meu roteador para enviar 192.168.1.0/24 a 192.168.0.2, mas, para testar em minha máquina, acabei de criar uma rota estática:
route -p ADD 192.168.1.0 MASK 255.255.255.0 192.168.0.2 METRIC 100
Espero que, pelo menos, alguém ache isso útil, fazer com que essa configuração demore muito e não exista um bom guia completo, apenas uma mistura de soluções que funcionam parcialmente.