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 ~]$