使用 NetworkManager 設置 VPNC 和路由表

2012年10月18日 , , (Shadow Ma)

昨晚看到個 VPN 服務 IQLink,免費用戶每月有 100G 流量,測了下速度還不錯,可以留着以備不時之需。

用 VPN 當然得配置路由表,之前用 PPTP VPN 時就配置過 chnroutes,用來給國內 ip 添加路由表,用非 VPN 線路高速訪問國內網站,還能節省流量。

IQLink 提供的是 Cisco VPN,Linux 下要用 VPNC 連接,chnroutes 網站上提供了 PPTP 和 OpenVPN 的設置教程,唯獨沒有 VPNC,還好 VPNC 支持連接腳本,默認配置的 /etc/vpnc/vpnc-script 能在執行 pre-initconnectpost-connectdisconnectpost-disconnectreconnect 六種 action 時調用自定義腳本,只要把 python chnroutes.py -p linux 生成的腳本 ip-pre-upip-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 的條目也一起被清除,其實是個無傷大雅的問題。

99-chnroutes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/sh

INTERFACE=$1
STATUS=$2

case "$STATUS" in
        'vpn-up')
                exec /etc/chnroutes/vpnup #chnroutes 生成的 ip-pre-up
                ;;
        'vpn-down')
                # if [ "$CONNECTION_UUID" != "1f2c647b-dd70-4f97-8300-0cf6cd4a2e4c" ]; then
                exec /etc/chnroutes/vpndown #chnroutes 生成的 ip-down
                # fi
                ;;
esac

到此處還不能正常使用,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-upip-down 改成 vpnupvpndown,只是這裏 vpnup 已經不是 pre-up 了,看着不爽而已。

參考資料

切換到了 systemd 自動更新 chnroutes 的腳本
點擊查看評論
返回首頁 返回頂部