Mac 路由表相關筆記

公司配發了 MacBook Air 做為我工作時的電腦,再加上固定每周會有一天的 remote work day。

因為工作時的需要,連接 VPN 是一件再正常不過的事情。不過,正式連上 VPN 之後,卻發現公司跳板機無法連接,更甭說要透過跳板機連線其他電腦。

原本以為是沒將 VPN 裡的「Send all traffic over VPN connection」選項打勾,但發現就算勾選之後,也無法連線跳板機,著實令我感到頭疼。讓我不得不往路由表的方向去想,但要怎麼在 MacOS 裡看路由表,又讓我再頭疼了一次。

幸好,最後還是有找到資訊,就順便記錄一下

顯示路由表

基本路由表顯示

同時顯示 IPv4 及 IPv6 的路由表,並進行 IP 反解,如果 DNS 查不到資料,/etc/hosts 也沒有相關記錄,則會直接顯示 IP,否則會以域名或 Host name 的方式呈現

netstat -r

不進行 IP 反解

如果不進行 IP 反解,則所有 IP 會以數字方式呈現

netstat -rn

僅顯示 IPv4 的路由表

netstat -rn -f inet

僅顯示 IPv6 的路由表

netstat -rn -f inet6

在公司 Telegram 群組裡,我叫了個幾聲,神救援同事出現了,問說是不是 VPN 順序問題,但我只有一個 VPN 呀,然後神救援同事,再丟出一張圖示意

這圖的意思,就是只要我把「OfficeVPN」的順序,用拖曳的方式,讓它變成第一個,那麼我就可以順利連上我們的跳板機。

事實證明,我只要讓「OfficeVPN」變成了第一個,那麼跳板機的確可以連入,完全沒有問題,而且屢試不爽。

理論上,問題到此可以告一段落了,但我最後的決定,是不變動服務的順序,而改用靜態路由的方式,來達到連入跳板機的目的。

雖然變動服務順序,是最簡單的,在一般使用情況下,也不會有太大的影響。但 VPN 線路,頻寬沒有很大,若我需要下載大檔案,或是觀看影片,需要較大頻寬或流量時,將會因為 VPN 線路頻寬,而受到影響,也因此我才決定改用寫入路由表的方式來達到我要的目的。

新增靜態路由

臨時路由(單一 IP,-host)

sudo route add -host 123.45.67.89 192.168.44.1
sudo route add 123.45.67.89 192.168.44.1

這是最基本的寫法,意思是連線到 123.45.67.89 這個 IP,會經由 192.168.44.1 這個閘道。兩種寫法的效果都是一樣的,唯一的差別在於有沒有加上 -host 這個參數。且都會回應如下訊息

add host 123.45.67.89: gateway 192.168.44.1

臨時路由(網段,-net)

sudo route add -net 123.45.67.89 192.168.44.1 255.255.255.0
sudo route add -net 123.45.67.89/24 192.168.44.1
sudo rounte add -net 123.45.67 192.168.44.1

雖然三種寫法不同,但都有一個相同重點參數:-net,主要是用來表明新增的路由規則,是要連到一個網段,而不是單一主機。根據例子來說,連線至 123.45.67.1~123.45.67.254 這些 IP 通通都會透過 192.168.44.1 這個閘道。

第一行是很完整的寫法,也就是 [目的地] [閘道] [子網路遮罩],如果沒有指 -net 這個參數,那麼會自動判定為 -host,這會失去意義。

第二種寫法,其格式就會變成 [目的地] [閘道]。也就是原本的 [子網路遮罩] 不寫,而 [目的地] 的部份則改用 CIDR 的方式來寫。

第三種寫法,其格式仍然是 [目的地] [閘道]。[目的地] 也不用 CIDR 的方式寫,而是更精簡的 123.45.67 的寫法,它會自動等於 123.45.67.0/24 這 IP 範圍。同理,如果目的地只寫成 123.45,那麼就會自動等於 123.45.0.0/16 這個 IP 範圍。

臨時路由,可以暫時解決掉問題,但是只要電腦重開機,臨時路由就會被清空。如果是長期的情況,每次都手動設定有點麻煩,雖然可以用 shell script 的方式來簡化手動設定,但每次都要執行,也是有點麻煩。

若就長遠需求的情況來看,設定永久路由,會是更好的方式。

永久路由(單一 IP)

sudo networksetup -setadditionalroutes "OfficeVPN" 123.45.67.89 255.255.255.255 192.168.44.1

這裡會用 networksetup 這個命令,並搭配 -setadditionalroutes 這個參數,其後面的格式會是:

[服務名稱] [目的地] [子網路遮罩] [閘道 IP]

服務名稱指的是前面那張圖裡顯示的名稱,或者也可以用 command-line 的方式來取得清單,以本例來說,OfficeVPN 就是服務名稱。

networksetup -listallnetworkservices

永久路由(單一網段)

sudo networksetup -setadditionalroutes "OfficeVPN" 123.45.67.89 255.255.255.0 192.168.44.1

永久路由(混合模式)

設定永久路由,有一個很大的缺點。以前面兩個例子,最後會生效的路由規則,只有單一網段那條規則會生效,更正確來說,是後面設定的路由規則,會覆蓋掉先前設定的路由規則。

更清楚一點,如果有多組 IP 或網段,或 IP 和網段的混合規則,就必須要一次性地設定。

sudo networksetup -setadditionalroutes "OfficeVPN" \
1.1.1.1 255.255.255.255 192.168.44.1 \
2.2.2.2 255.255.0.0 192.168.44.1 \
3.3.3.3 255.255.255.0 192.168.44.1

單純用 netstar -rn 比較不容易看出路由規則,到底是臨時路由或是永久路由,這也就可能會發生覆蓋掉先前的永久路由規則,那麼就可以利用下面的方式來取得資訊

networksetup -getadditionalroutes "OfficeVPN"

刪除靜態路由

臨時路由

要刪除臨時路由,就比較簡單一點,先顯示現在的路由表,會看到像這樣的結果

Internet:
Destination        Gateway            Flags        Netif Expire
default            192.168.88.254     UGSc           en0
1.2.3.4            192.168.88.254     UGHS           en0
3.0.0.3            192.168.88.254     UGHS           en0
8.8.8/24           192.168.88.254     UGSc           en0

重點擺在最後三行,這三行是我們等一下準備刪除的路由規則。它們分別對應的方式如下

sudo route delete 1.2.3.4
sudo route delete 3.0.0.0
sudo route delete 8.8.8/24

換言之,在路由表的 Destination 這欄位,看到什麼,就用下面的格式去刪就可以了

sudo route delete [Destination]

永久路由

永久路由沒有提供刪除的方式,但我們可以將永久路由設為空值,就可以達到刪除的目的

sudo networksetup -setadditionalroutes "OfficeVPN"

後記

調整服務順序,就可以連接上跳板機,其主要原因是把預設連線至 0.0.0.0/0 的閘道,設為我的 OfficeVPN 之故。這部份可以經由調整服務順序,並搭配路由表中的 default 看到不同處。

路由表裡 [Destination] 一欄顯示的 default 其實指的就是 0.0.0.0/0

route delete 也可以用來「暫時」刪除永久路由表裡的資訊,但因為只是暫時刪除,故下次開機時,永久路由表的設定,仍然會生效

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Google reCAPTCHA 保護機制,這項服務遵循 Google 隱私權政策服務條款