OCI – Rede Hub Spoke + LibreSwan

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:

Sei que a ultima regra não é necessária mas isso foi durante os testes

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