VPN下如何使用SSH连接(greenVPN)

环境:ubunut14.04

一直用greenVPN做代理,但是有一个问题,就是green把SSH给封了,导致连接VPN的时候,SSH无法连接远程服务器,那可如何是好,恐怕只有一条路了,就是让这些IP绕过VPN。

绕之前我们先route一下,看看使用VPN前后的网络变化:

before

Destination Gateway Genmask Flags Metric Ref Use Iface
default localhost 0.0.0.0 UG 0 0 0 wlan0
192.168.1.0 * 255.255.255.0 U 9 0 0 wlan0

连接VPN前默认路由均由wlan0接管

after

Destination Gateway Genmask Flags Metric Ref Use Iface
default * 0.0.0.0 U 0 0 0 ppp0
10.0.6.4 * 255.255.255.255 UH 0 0 0 ppp0
119.81.158.84-s 192.168.1.1 255.255.255.255 UGH 0 0 0 wlan0
119.81.158.84-s 192.168.1.1 255.255.255.255 UGH 0 0 0 wlan0
192.168.1.0 * 255.255.255.0 U 9 0 0 wlan0

连接VPN后默认路由均由ppp0(VPN网络)接管,但是指定规则静态路由不走VPN,且路由规则里静态路由优先级高于默认路由

所以,我们可以通过设置一条静态路由,来使SSH连接的IP通过指定网络转发:

sudo route add -net *.*.*.* netmask 255.255.255.255 gw 192.168.1.1 dev wlan0
  • dev wlan 0可以不写,程序会自动匹配正在是用的非VPN网路

上面的路由规则只是临时生效,重启电脑或者重启网络,甚至断开VPN都会被清除。当然你可以说通过配置永久路有的方式,来避免重启电脑造成的路由配置丢失(具体参考搜索引擎),但是我在实际操作中却发现,当断开VPN时,会刷新路由,依然会造成配置的永久路由丢失。

于是,我就采取了另一种方式,就是监控VPN连接,一旦VPN连接,即触发如下代码,将代码置于/etc/ppp/ip-up.d/setStaticRoute内,我的文件名是 setStaticRoute,自己随便取:

1
2
3
4
5
6
#!/bin/sh
if [ "$IFNAME" = "ppp0" ]
then
route add -net *.*.*.* netmask 255.255.255.255 gw 192.168.1.1
route add -net *.*.*.* netmask 255.255.255.255 gw 192.168.1.1
fi

最后路由结果是这样(*.*.*.*部分是SSH要连接的服务器地址):

Destination Gateway Genmask Flags Metric Ref Use Iface
default * 0.0.0.0 U 0 0 0 ppp0
10.0.6.4 * 255.255.255.255 UH 0 0 0 ppp0
*.*.*.* 192.168.1.1 255.255.255.255 UGH 0 0 0 wlan0
119.81.158.84-s 192.168.1.1 255.255.255.255 UGH 0 0 0 wlan0
119.81.158.84-s 192.168.1.1 255.255.255.255 UGH 0 0 0 wlan0
*.*.*.* 192.168.1.1 255.255.255.255 UGH 0 0 0 wlan0
192.168.1.0 * 255.255.255.0 U 9 0 0 wlan0