A arquitetura Hub-and-Spoke é uma das sugeridas pela Oracle na hora de montar o seu ambiente no OCI, nela possuímos uma rede que fica a frente de outras redes e serve como concentrador(Hub) para redes mais internas, dessa forma podemos ter uma rede que entregue recursos de segurança(você pode por exemplo ter um Firewall na Hub e passar todas as outras subnets por ele) e facilita também o crescimento do seu ambiente(você pode fechar um Fastconnect com a Hub e criar rotas/regas na spoke), aqui nesse post vou mostrar como fechar uma VPN em um ambiente que possua a topologia Hub-and-Spoke e se comunicar com todas as redes que estão no OCI, abaixo a topologia que vamos ter ao final:
Para esse exemplo, vou rodar em dois tenants diferentes, um deles vai rodar o Libreswan e no outro vamos usar o VPNaaS (nesse que temos nossa Hub-and-Spoke configurada).
Ambiente Libreswan
Antes de usarmos o libreswan, precisamos fazer algumas configurações no nosso ambiente, nesse caso eu estou jogando todos os pacotes que trafegarem na nossa subnet para a interface de rede da VM do LibreSwan:
É importante também marcarmos a opção skip source/destination check da vnic do LibreSwan.
Também ajustei a Security List para que ela permita o tráfego que vem da nossa outra ponta:
Configuração LibreSwan
Existem diversos tutoriais na internet de como instalar e configurar um servidor LibreSwan, no nosso caso vou postar somente a configuração básica(lembre-se de ajustar ao seu ambiente e seguir o guia de VPNaaS):
conn hub authby=secret auto=start pfs=yes leftid=x.x.x.x #IP PUBLICO OCI left=x.x.x.x #IP PUBLICO OCI leftsubnets={192.168.0.0/16,172.18.0.0/16} #QUAIS REDES ESTAO NO HUB right=10.100.0.6 #IP DA MAQUINA LIBRESWAN rightid=y.y.y.y #IP PUBLICO LIBRESWAN rightsubnets={10.100.0.0/16} #REDES LIBRESWAN
A dica aqui é o uso dos parâmetros leftsubnets e rightsubnets que usamos para indicar que estamos trabalhando com mais de uma subnet em nosso setup, é importante notar que ao usar o “s” no final, precisamos ter ele dos dois lados(não funciona se tentar usar leftsubnets com rightsubnet por exemplo).
OCI
No OCI temos as seguintes subnets (que vão ser nossa Hub-and-Spoke):
Dentro da VCN-SUP-HUB temos a seguinte subnet:
As seguintes tabelas de rota:
E as seguintes regras:
Na VCN-SUP-INTERNA temos a seguinte subnet:
As seguintes tabelas de rota:
E as seguintes regras:
Local peering
O “segredo” da topologia Hub Spoke é o uso do local peering para que duas VCNs diferentes se comuniquem por dentro da infraestrutura do OCI, aqui temos nosso local peering “lpg” configurado e dentro deles colocamos uma tabela de rotas(RT-LPG), isso é feito dentro da subnet Hub:
VPNaaS
Depois que nossa configuração de rede está feita, vamos subir um VPNaaS apontando para o nosso Libreswan, aqui devemos apontar o DRG que está vinculado à rede HUB, o ponto importante aqui é mudar a VPN de Static Routing para Policy Based e nela colocar as redes que estamos entregando:
Testando
Libreswan para OCI
[opc@xxxxx ~]$ ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc pfifo_fast state UP group default qlen 1000 link/ether 02:00:17:00:24:03 brd ff:ff:ff:ff:ff:ff inet 10.100.0.2/24 brd 10.100.0.255 scope global dynamic ens3 valid_lft 78172sec preferred_lft 78172sec [opc@xxxxx ~]$ traceroute 192.168.92.2 traceroute to 192.168.92.2 (192.168.92.2), 30 hops max, 60 byte packets 1 openswan.subnetlibre.vcnlibre.oraclevcn.com (10.100.0.6) 0.355 ms 0.334 ms 0.307 ms 2 * * * 3 * * * 4 * * * 5 192.168.92.2 (192.168.92.2) 10.234 ms 10.187 ms 10.164 ms [opc@xxxxx ~]$ ping -c 4 192.168.92.2 PING 192.168.92.2 (192.168.92.2) 56(84) bytes of data. 64 bytes from 192.168.92.2: icmp_seq=1 ttl=61 time=2.58 ms 64 bytes from 192.168.92.2: icmp_seq=2 ttl=61 time=1.80 ms 64 bytes from 192.168.92.2: icmp_seq=3 ttl=61 time=1.80 ms 64 bytes from 192.168.92.2: icmp_seq=4 ttl=61 time=1.84 ms --- 192.168.92.2 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3005ms rtt min/avg/max/mdev = 1.800/2.009/2.582/0.334 ms [opc@xxxxx ~]$ traceroute 172.18.1.2 traceroute to 172.18.1.2 (172.18.1.2), 30 hops max, 60 byte packets 1 openswan.subnetlibre.vcnlibre.oraclevcn.com (10.100.0.6) 0.332 ms 0.292 ms 0.287 ms 2 * * * 3 * * * 4 172.18.1.2 (172.18.1.2) 1.503 ms !X 1.484 ms !X 1.462 ms !X [opc@xxxxx~]$ ping -c 4 172.18.1.2 PING 172.18.1.2 (172.18.1.2) 56(84) bytes of data. 64 bytes from 172.18.1.2: icmp_seq=1 ttl=61 time=1.98 ms 64 bytes from 172.18.1.2: icmp_seq=2 ttl=61 time=2.11 ms 64 bytes from 172.18.1.2: icmp_seq=3 ttl=61 time=1.92 ms 64 bytes from 172.18.1.2: icmp_seq=4 ttl=61 time=1.85 ms --- 172.18.1.2 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3004ms rtt min/avg/max/mdev = 1.858/1.971/2.112/0.098 ms [opc@xxxxx ~]$
VCN-SPOKE (a mais interna) para LibreSwan
[root@vm-interna opc]# ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc pfifo_fast state UP group default qlen 1000 link/ether 02:00:17:00:ee:e6 brd ff:ff:ff:ff:ff:ff inet 172.18.1.2/24 brd 172.18.1.255 scope global dynamic ens3 valid_lft 65244sec preferred_lft 65244sec [root@vm-interna opc]# ping -c4 10.100.0.2 PING 10.100.0.2 (10.100.0.2) 56(84) bytes of data. 64 bytes from 10.100.0.2: icmp_seq=1 ttl=60 time=1.74 ms 64 bytes from 10.100.0.2: icmp_seq=2 ttl=60 time=1.81 ms 64 bytes from 10.100.0.2: icmp_seq=3 ttl=60 time=1.83 ms 64 bytes from 10.100.0.2: icmp_seq=4 ttl=60 time=1.91 ms --- 10.100.0.2 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3005ms rtt min/avg/max/mdev = 1.741/1.828/1.917/0.081 ms [root@vm-interna opc]# traceroute 10.100.0.2 traceroute to 10.100.0.2 (10.100.0.2), 30 hops max, 60 byte packets 1 140.91.208.2 (140.91.208.2) 0.113 ms 140.91.208.1 (140.91.208.1) 0.127 ms 140.91.208.7 (140.91.208.7) 0.102 ms 2 * * * 3 10.100.0.6 (10.100.0.6) 1.262 ms 1.254 ms 1.230 ms 4 10.100.0.2 (10.100.0.2) 1.241 ms !X 1.241 ms !X 1.199 ms !X [root@vm-interna opc]#
VCN-HUB (a mais externa) para LibreSwan
opc@vm-hub ~]$ ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc pfifo_fast state UP group default qlen 1000 link/ether 02:00:17:00:93:38 brd ff:ff:ff:ff:ff:ff inet 192.168.92.2/24 brd 192.168.92.255 scope global dynamic ens3 valid_lft 65321sec preferred_lft 65321sec [opc@vm-hub ~]$ ping -c4 10.100.0.2 PING 10.100.0.2 (10.100.0.2) 56(84) bytes of data. 64 bytes from 10.100.0.2: icmp_seq=1 ttl=60 time=90.1 ms 64 bytes from 10.100.0.2: icmp_seq=2 ttl=60 time=1.86 ms 64 bytes from 10.100.0.2: icmp_seq=3 ttl=60 time=1.96 ms 64 bytes from 10.100.0.2: icmp_seq=4 ttl=60 time=2.95 ms --- 10.100.0.2 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3003ms rtt min/avg/max/mdev = 1.865/24.239/90.175/38.070 ms [opc@vm-hub ~]$ traceroute 10.100.0.2 traceroute to 10.100.0.2 (10.100.0.2), 30 hops max, 60 byte packets 1 140.91.208.29 (140.91.208.29) 0.142 ms 0.137 ms 140.91.208.26 (140.91.208.26) 0.105 ms 2 * * * 3 10.100.0.6 (10.100.0.6) 93.732 ms 93.720 ms 93.697 ms 4 10.100.0.2 (10.100.0.2) 93.672 ms !X 93.652 ms !X 93.610 ms !X [opc@vm-hub ~]$