環境
macOS Catalina(10.15.5)
はじめに
macOSでStatic Routeを設定するのにroute addコマンドを使用します。
例)デフォルトゲートウェイが100.1.2.254であるネットワークで
10.0.0.0/8を192.168.1.254のルータに向ける場合
#Static Routeの追加
$ sudo route add -net 10.0.0.0/8 192.168.1.254
#ちなみに削除する場合は以下
$ sudo route delete -net 10.0.0.0/8 192.168.1.254
#確認
$ netstat -rn
default 100.1.2.254 UGSc en0
10 192.168.1.254 UGSc en0
しかし、再起動すると追加したStatic Routeは消えてしまいます。
ネットワーク設定の永続化のためにWindowsは-Pオプション、ubuntuだとnetplanに書くなどして対処しますが、macOSはありません(ガーン)。スクリプトで対応とかダサい。
networksetupコマンド
ではどうするかというと、networksetup -setadditionalroutesで設定できます。
一旦ヘルプを見ます
$ networksetup --help | grep setadditionalroute
networksetup -setadditionalroutes <networkservice> [ <dest> <mask> <gateway> ]*
設定にはnetworkservice名が必要なので調べます。これもnetworksetupコマンドでできます。
$ networksetup -listallnetworkservices
An asterisk (*) denotes that a network service is disabled.
Wi-Fi
Bluetooth PAN
Thunderbolt Bridge
無線LANのnetworkservice名は「Wi-Fi」ということがわかりました。
ルーティングを追加
さきほどrouteコマンドで設定したものと同じルーティングを追加します。
これは再起動でも消えません。
例)デフォルトゲートウェイが100.1.2.254であるネットワークで
10.0.0.0/8を192.168.1.254のルータに向ける
$ networksetup -setadditionalroutes Wi-Fi 10.0.0.0 255.0.0.0 192.168.1.254
#netstatで確認
$ netstat -rn | grep 10
default 100.1.2.254 UGSc en0
10 192.168.1.254 UGSc en0
削除する場合
networkserviceに引数をつけないと、今まで設定した静的ルーティングが削除されます。
$ networksetup -setadditionalroutes Wi-Fi
注意点
ここで注意点ですが、networksetup -setadditionalroutesは一番最新のコマンドが優先されます。
例えば、以下のように連続して異なるルーティングの設定をしてしまうと後の172.16.0.0しか有効になりません。
$ networksetup -setadditionalroutes Wi-Fi 10.0.0.0 255.0.0.0 192.168.1.254
$ networksetup -setadditionalroutes Wi-Fi 172.16.0.0 255.255.0.0 192.168.2.254
##確認(172.16.0.0のルーティングしか追加されていない)
netstat -rn | grep 192.168
172.16 192.168.2.254 UGSc en0
複数のルーティングを設定する場合
ヘルプで見てみると複数のルーティングが設定できることがわかります。
$ networksetup -setadditionalroutes <networkservice> [ <dest> <mask> <gateway> ]*
$ networksetup -setadditionalroutes Wi-Fi 10.0.0.0 255.0.0.0 192.168.1.254 172.16.0.0 255.255.0.0 192.168.2.254
## 確認(複数のルーティングが追加された)
netstat -rn | grep 192.168
10 192.168.1.254 UGSc en0
172.16 192.168.2.254 UGSc en0
の文字列を複数列挙する必要があります。
ヘルプのように配列リテラルのように記載してもNGです。
### 以下はNGの例です。
$ networksetup -setadditionalroutes Wi-Fi [172.16.0.0 255.255.0.0 192.168.2.254] [10.0.0.0 255.0.0.0 192.168.2.254]
zsh: bad pattern: [172.16.0.0
また、CIDR表記(10.0.0.0/8)のようにしたい場合もNGになります。
###これはsyntax errorとなります
$ networksetup -setadditionalroutes Wi-Fi 10.0.0.0/8 192.168.2.254
Route syntax: <dest> <mask> <gateway>
参考
networksetupコマンドの使い方:ヘルプのみかた
Mac OS Xのターミナル上でWi-Fiの設定を追加・削除する