內容目錄
公司配發了 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 route 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 也可以用來「暫時」刪除永久路由表裡的資訊,但因為只是暫時刪除,故下次開機時,永久路由表的設定,仍然會生效
謝謝您,寫得超詳細,幫助很大