昨晚看到個 VPN 服務 IQLink,免費用戶每月有 100G 流量,測了下速度還不錯,可以留着以備不時之需。
用 VPN 當然得配置路由表,之前用 PPTP VPN 時就配置過 chnroutes,用來給國內 ip 添加路由表,用非 VPN 線路高速訪問國內網站,還能節省流量。
IQLink 提供的是 Cisco VPN,Linux 下要用 VPNC 連接,chnroutes 網站上提供了 PPTP 和 OpenVPN 的設置教程,唯獨沒有 VPNC,還好 VPNC 支持連接腳本,默認配置的 /etc/vpnc/vpnc-script
能在執行 pre-init
、connect
、post-connect
、disconnect
、post-disconnect
和 reconnect
六種 action 時調用自定義腳本,只要把 python chnroutes.py -p linux
生成的腳本 ip-pre-up
和 ip-down
分別放入 /etc/vpnc/pre-init.d
和 /etc/vpnc/post-disconnect.d
就能在連接 VPN 前後成功添加恢復路由表,但在使用 NetworkManager 連接 VPNC 時,發現這些腳本根本就沒有被執行,NM 的 VPNC 插件用自帶的 nm-vpnc-service-vpnc-helper
替代了 vpnc-script
,完全不讀取 /etc/vpnc
下的配置,而且這東西是二進制文件沒法改,試過直接替換成 vpnc-script
也不行,正準備放棄時突然想起 NetworkManager 也支持連接腳本,直接用 NetworkManager 配置的話就不用再爲每種 VPN 都設定路由表了。
把下面的腳本(根據自己實際情況修改)放入 /etc/NetworkManager/dispatcher.d
,腳本中在觸發 vpn-down
恢復路由表的操作中我排除了正在配置的 VPNC 連接的 UUID,因爲斷開連接時路由表已經被恢復,導致腳本返回一大串錯誤,這應該是 `nm-vpnc-service-vpnc-helper` 中有對路由表的操作的原因 是 VPN 服務端設置決定的,VPN 服務有添加網關的話會自動修改路由表,斷開連接後路由表被恢復,chnroutes 的條目也一起被清除,其實是個無傷大雅的問題。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
到此處還不能正常使用,chnroutes 生成的腳本是給 PPTP 用的,默認是要在 PPP 撥號前執行,在 VPN 鏈接前路由表就設置好了,而 NetworkManager 連接腳本中的 vpn-up
要在連接建立後才會被觸發,像我正在配置的 VPNC 因爲之前提到的 `nm-vpnc-service-vpnc-helper` 中有對路由表的操作 VPN 服務有修改路由表的話,腳本中的 OLDGW
得到的值會會是 VPN 網關的地址,路由表會被設成讓所有國內 ip 都走 VPN,解決方法是把 chnroutes 生成的設置腳本 ip-pre-up
(上面腳本中的 vpnup
)中的:
OLDGW=`ip route show | grep '^default' | sed -e 's/default via \([^ ]*\).*/\1/'`
修改爲:
OLDGW=`ip route show | sed '/tun*/d' | grep '^[^d].*proto static' | sed -e 's/.*via \([^ ]*\).*/\1/'`
重新連接,測試成功。現在用 NetworkManager 連接的 VPN 都會自動設置路由表,以前給 PPTP 設置的撥號腳本可以移除了。
其實沒必要像我一樣把 ip-pre-up
和 ip-down
改成 vpnup
和 vpndown
,只是這裏 vpnup
已經不是 pre-up 了,看着不爽而已。