仕事をしてリソースに安全にアクセスするためにFortiClient経由でVPNに接続する必要がある。2021年3月に会社で働き始めたとき、M1 MacBookProが支給された。M1 MacBookProは新しいCPUアーキテクチャを搭載しているため、他のものとは異なる。以前AppleはIntelベースのCPUを使用していたが、現在はARMベースのCPUでmacOSを実行することを決定し、今のところM1と呼ばれている。

多くのソフトウェアがARMと互換性がない。「このコンポーネントはお使いのCPUと互換性がありません」といった問題に時々遭遇する。

FortiClient v6.4.3.1325経由でVPNに接続すると、接続されているように見えるが、インターネット速度が極端に遅くなる。通常、100MB/秒のインターネット速度がある。同僚に「VPNやVPN速度に問題はないか?」と尋ねたところ、「いいえ!」と言われた。彼らは私より少し古いIntelベースのCPUを搭載したMacBookProを使用しており、Intelベースのバージョンは問題なく安定しているので、これは普通の状況だと思った。

根本原因を見つけるためにデバッグを開始し、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 !

ルートテーブルは問題なさそうだ。192.168.31.1はワイヤレスルーターで、デフォルトルートはワイヤレスルーターに向いている。問題ない。

この後、FortiClient経由でVPNに接続し、ルートテーブルを再確認した。10.212.134.152はFortiClientによって割り当てられたローカルIPアドレスだ。

➜  ~ 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 !

VPNサービスはスプリットトンネリングを使用しておらず、link#19または10.212.134.152がデフォルトルートのネクストホップであり、同時にワイヤレスルーターもデフォルトルートであるべきだ。

デフォルトルートを削除する!

そう、手動でルーティングテーブルを操作することにした。

➜  ~ sudo route delete default
Password:
delete net default

これでネクストホップはFortiClientのローカルIPアドレスになるはずだ。私の場合10.212.134.152だ。このローカルIPアドレスは動的で、DHCPがこのIPを割り当てるため接続ごとに変わる。

ルートテーブルはどうなっているか?デフォルトルートはもうないはずだ...

➜  ~ 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がデフォルトルートから消えた。いいね!でも今はインターネットにアクセスできない。デフォルトルートとしてワイヤレスルーターはまだルートテーブルにあるが、FortiClientはVPN接続を維持するためにそれを使っている。つまり、まだインターネットに接続されているが、ネクストホップがない。

➜  ~ 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

新しいデフォルトルートを追加しよう...

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

新しいデフォルトルートを追加した後、8.8.8.8にpingできるようになった。

➜  ~ 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

クロスチェック

デフォルトルートの削除と追加後の違いを確認するために、最後にもう一度ルートテーブルをチェックした。

➜  ~ 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 !

これですべてが完璧に動作している。VPN接続は安定して高速だ!

ボーナス

VPNに接続する必要があるたびにデフォルトルートを削除して追加する必要があり、毎日接続する必要がある。手動でルートを削除・追加したくないので、このルーティンのために小さなbashスクリプトを書いた。

スクリプトを/usr/local/bin/パスにsudo vimで保存できる。その後、スクリプトにchmodパーミッションを追加するのを忘れずに。

#!/bin/bash

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

sudo route delete default sudo route add default $FortiIP

最初から読んでくれたなら、ありがとうと言わなければ!: )