Devo connettermi alla VPN tramite FortiClient per lavorare e accedere ad alcune risorse in modo sicuro. Quando ho iniziato a lavorare per la mia azienda a marzo 2021, mi hanno dato un M1 MacBookPro. L'M1 MacBookPro è diverso dagli altri perché arriva con una nuova architettura CPU. Precedentemente, Apple utilizzava una CPU basata su Intel ma ora ha deciso di far funzionare macOS con una CPU basata su ARM e Apple l'ha chiamata M1 per ora.

Molti software non sono compatibili con ARM. A volte ho alcuni problemi come "Questo componente non è compatibile con la tua CPU".

Quando mi connettevo alla VPN tramite FortiClient v6.4.3.1325, sembrava connesso ma la mia velocità internet diventava troppo lenta. Normalmente, ho una velocità internet di 100MB/sec. Ho chiesto ai miei colleghi "avete problemi con la VPN e/o la velocità della VPN?" e mi hanno detto "NO!" Loro usano un MacBookPro un po' più vecchio del mio con una CPU basata su Intel e ho pensato fosse una situazione normale perché le versioni basate su Intel sono okay e stabili.

Ho iniziato a debuggare per trovare la causa radice e ho controllato la tabella di routing prima di connettermi alla VPN.

➜  ~ netstat -rn
Routing tables

Internet: Destination Gateway Flags Netif Expire default 192.168.31.1 UGScg en0 127 127.0.0.1 UCS lo0 127.0.0.1 127.0.0.1 UH lo0 169.254 link#14 UCS en0 ! 192.168.31 link#14 UCS en0 ! 192.168.31.1/32 link#14 UCS en0 ! 192.168.31.1 ec:41:18:ec:c6:bc UHLWIir en0 1189 192.168.31.147/32 link#14 UCS en0 ! 192.168.31.147 a0:78:17:87:b4:88 UHLWI lo0 192.168.31.171 b8:bc:5b:6:28:18 UHLWI en0 1165 192.168.31.255 ff:ff:ff:ff:ff:ff UHLWbI en0 ! 224.0.0/4 link#14 UmCS en0 ! 224.0.0.251 1:0:5e:0:0:fb UHmLWI en0 239.255.255.250 1:0:5e:7f:ff:fa UHmLWI en0 255.255.255.255/32 link#14 UCS en0 !

La mia tabella di routing sembra a posto. 192.168.31.1 è il mio router wireless e la rotta predefinita punta al mio router wireless. Va bene.

Dopo di che, mi sono connesso alla VPN tramite FortiClient e ho ricontrollato la mia tabella di routing. 10.212.134.152 è il mio indirizzo IP locale assegnato da FortiClient.

➜  ~ netstat -rn
Routing tables

Internet: Destination Gateway Flags Netif Expire default link#19 UCSg ppp0 default 192.168.31.1 UGScIg en0 8.8.8.8 link#19 UHWIig ppp0 13.224.58.179 link#19 UHWIig ppp0 31.XXX.XX.XX/32 192.168.31.1 UGSc en0 34.XXX.XX.XXX link#19 UHWIig ppp0 34.XXX.XXX.xxx link#19 UHWIig ppp0 35.XXX.XXX.XX link#19 UHWIig ppp0 35.XXX.XXX.XXX link#19 UHWIig ppp0 80.80.80.80 link#19 UHW3Ig ppp0 3597 127 127.0.0.1 UCS lo0 127.0.0.1 127.0.0.1 UH lo0 169.254 link#14 UCS en0 ! 169.254.38.179 10.212.134.152 UH ppp0 192.168.31 link#14 UCS en0 ! 192.168.31.1/32 link#14 UCS en0 ! 192.168.31.1 ec:41:18:ec:c6:bc UHLWIir en0 1181 192.168.31.147/32 link#14 UCS en0 ! 192.168.31.147 a0:78:17:87:b4:88 UHLWI lo0 192.168.31.171 b8:bc:5b:6:28:18 UHLWIi en0 1139 192.168.31.255 ff:ff:ff:ff:ff:ff UHLWbI en0 ! 224.0.0/4 link#19 UmCS ppp0 224.0.0/4 link#14 UmCSI en0 ! 224.0.0.251 link#19 UHmW3I ppp0 3599 239.255.255.250 1:0:5e:7f:ff:fa UHmLWI en0 239.255.255.250 link#19 UHmW3I ppp0 3599 255.255.255.255/32 link#19 UCS ppp0 255.255.255.255/32 link#14 UCSI en0 !

Il nostro servizio VPN non utilizza split-tunneling e link#19 o 10.212.134.152 dovrebbe essere il next hop per la rotta predefinita insieme al mio router wireless contemporaneamente.

Cancello la mia rotta predefinita!

Sì, ho deciso di manipolare manualmente la mia tabella di routing.

➜  ~ sudo route delete default
Password:
delete net default

Ora, il next hop dovrebbe essere il mio indirizzo ip locale FortiClient. È 10.212.134.152 nel mio caso. Questo indirizzo ip locale è dinamico e cambia ad ogni connessione perché DHCP assegna questo indirizzo ip.

Ora, come appare la mia tabella di routing? La rotta predefinita non dovrebbe esserci...

➜  ~ netstat -rn
Routing tables

Internet: Destination Gateway Flags Netif Expire default 192.168.31.1 UGScIg en0 31.XXX.XX.XX/32 192.168.31.1 UGSc en0 127 127.0.0.1 UCS lo0 127.0.0.1 127.0.0.1 UH lo0 169.254 link#14 UCS en0 ! 169.254.38.179 10.212.134.152 UH ppp0 192.168.31 link#14 UCS en0 ! 192.168.31.1/32 link#14 UCS en0 ! 192.168.31.1 ec:41:18:ec:c6:bc UHLWIir en0 1178 192.168.31.147/32 link#14 UCS en0 ! 192.168.31.147 a0:78:17:87:b4:88 UHLWI lo0 192.168.31.171 b8:bc:5b:6:28:18 UHLWIi en0 586 192.168.31.222 c:2c:54:e4:67:81 UHLWI en0 1156 192.168.31.255 ff:ff:ff:ff:ff:ff UHLWbI en0 ! 224.0.0/4 link#19 UmCS ppp0 224.0.0/4 link#14 UmCSI en0 ! 224.0.0.251 link#19 UHmW3I ppp0 3589 239.255.255.250 1:0:5e:7f:ff:fa UHmLWI en0 239.255.255.250 link#19 UHmW3I ppp0 3588 255.255.255.255/32 link#19 UCS ppp0 255.255.255.255/32 link#14 UCSI en0 !

link#19 è sparito dalla rotta predefinita. Bene! E ora, non posso accedere a internet. Come rotta predefinita, il mio router wireless è ancora nella tabella di routing ma FortiClient lo sta usando per rimanere connesso alla VPN. Sì, sono ancora connesso a internet ma non ho un next hop.

➜  ~ ping -c 4 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
ping: sendto: No route to host
ping: sendto: No route to host
Request timeout for icmp_seq 0
ping: sendto: No route to host
Request timeout for icmp_seq 1
ping: sendto: No route to host
Request timeout for icmp_seq 2

— 8.8.8.8 ping statistics — 4 packets transmitted, 0 packets received, 100.0% packet loss

Aggiungiamo una nuova rotta predefinita...

➜  ~ sudo route add default 10.212.134.152
add net default: gateway 10.212.134.152

Ora, posso fare ping a 8.8.8.8 dopo aver aggiunto una nuova rotta predefinita.

➜  ~ ping -c 4 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=114 time=99.007 ms
64 bytes from 8.8.8.8: icmp_seq=1 ttl=114 time=98.277 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=114 time=103.634 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=114 time=104.365 ms

— 8.8.8.8 ping statistics — 4 packets transmitted, 4 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 98.277/101.321/104.365/2.704 ms

Verifica incrociata

Ho controllato la tabella di routing per l'ultima volta per vedere qual è la differenza dopo aver cancellato e aggiunto la rotta predefinita.

➜  ~ netstat -rn
Routing tables

Internet: Destination Gateway Flags Netif Expire default 10.212.134.152 UGScg ppp0 default 192.168.31.1 UGScIg en0 31.145.77.18/32 192.168.31.1 UGSc en0 127 127.0.0.1 UCS lo0 127.0.0.1 127.0.0.1 UH lo0 169.254 link#14 UCS en0 ! 169.254.38.179 10.212.134.152 UH ppp0 192.168.31 link#14 UCS en0 ! 192.168.31.1/32 link#14 UCS en0 ! 192.168.31.1 ec:41:18:ec:c6:bc UHLWIir en0 1179 192.168.31.147/32 link#14 UCS en0 ! 192.168.31.147 a0:78:17:87:b4:88 UHLWI lo0 192.168.31.171 b8:bc:5b:6:28:18 UHLWI en0 1146 192.168.31.222 c:2c:54:e4:67:81 UHLWI en0 1163 192.168.31.255 ff:ff:ff:ff:ff:ff UHLWbI en0 ! 224.0.0/4 link#19 UmCS ppp0 224.0.0/4 link#14 UmCSI en0 ! 224.0.0.251 link#19 UHmW3I ppp0 3582 239.255.255.250 1:0:5e:7f:ff:fa UHmLWI en0 239.255.255.250 link#19 UHmW3I ppp0 3557 255.255.255.255/32 link#19 UCS ppp0 255.255.255.255/32 link#14 UCSI en0 !

Ora, tutto funziona perfettamente. La mia connessione VPN è stabile e veloce!

Bonus

Devo cancellare e aggiungere una nuova rotta predefinita ogni volta che devo connettermi alla VPN e ogni giorno devo connettermi. Non voglio cancellare e aggiungere manualmente una nuova rotta e ho scritto un piccolo script bash per questa routine.

Puoi salvare lo script nel percorso /usr/local/bin/ con sudo vim. Dopodiché, non dimenticare di aggiungere i permessi chmod per lo script.

#!/bin/bash

FortiIP=$(netstat -rn | grep “10.212.134” | awk ‘{print $2}’)

sudo route delete default sudo route add default $FortiIP

Se hai letto dall'inizio, dovrei dirti grazie! : )