工控网络基础入门篇之route命令

既然 GFW 可以通过静态路由丢弃我们的网络请求,那么我们自己可以用静态路由表来绕过 GFW 吗?当然可以,这就是 route 命令的一个重要作用了。Route 命令的 Man Pange 在这里,有时间一定要多去看看这些命令的 man page,我不可能把每一条都很详细的给你翻译过来。我们说了 traceroute 是检查两个 IP 之间实际的路由状况,而 route 命令就是查看当前主机上已有的路由表的命令。

直接输入 route,我们就会看到类似如下的信息 (VPN IP 隐去):

分栏解释:Destination 是目标地址,default 就是默认的所有地址。Gateway 是网关Gen-Mask 是掩码Iface 是对应的接口名,Metric,Ref 和 Use 在很多内核中都不使用,我们不用管。

Flags 里的字母含义分别如下:

1. U,表示这个路由活着 (Up)

2. H,表示这货是台主机 (Host),在网络中主机和路由是不同的

3. G,表示要通过网关访问 (Use Gateway)

上面这个例子中,10.1.1.1 是我路由接入的默认网关,我默认的所有网络 (default) 都是通过这个网关访问的,这个网关对应的接口是 “eth0.2”。而 192.168.199.0/24 是我路由后面分配出来的内网网络,我在这个内网里互访主机是不需要经过网关的,所以这里没有 G。

当然我们主要的目的不是查看路由表,而是修改路由表。我们可以看到上面的 “10.10.10.1” 是 VPN 服务器对应的网关,我们到 VPN 服务器的网络是通畅的,VPN 服务器到 twitter 的网络也是通畅的,那么我们就可以通过 VPN 网关来访问 twitter 了。最简单粗暴的做法是直接把我们的默认接口改成 VPN 接口,这样我们所有的网络请求都会通过 VPN 接口进行了,只要 GFW 不拦截我们到 VPN 的通路,那就没什么可以阻拦我们了。

这里的 pptp-VPN 要根据实际情况来确定,我们在前面说过可以通过 ifconfig 命令来查看各个接口的名称,但我们也可以通过一些脚本来自动提取这个信息,这个可以用后面提到的 SED 配合正则表达式很轻松的实现。如果我们不需要让所有网络都走 VPN 了,只要删除这条路由表就行了,命令很简单只要把 “add” 改成 “del 就行了”。

 如果让路由上的所有网络访问都走 VPN,其实和我们直接在本机挂全局 VPN 也没什么区别,唯一的区别就是可能方便了一些不能拨 VPN 的设备使用,节约了一些连 VPN 的动作时间而已。一种更精确的做法,是指针对被 GFW 屏蔽的 IP 走 VPN,这也是FreeRouter V1的做法。例如我们假定 twitter.com 的 IP 是5.5.5.5,只需要执行如下命令即可:

这个 -host 是默认选项,不写也可以,指的是添加一个 IP 作为目标地址。有的时候一些网站有很多个 IP,但一般都是处于同一个网段内,例如我们假设 google 的 IP 范围是 6.6.6.1∼6.6.6.6.254,我们就用 -net 选项表示添加一个网段作为目标地址:

具体的掩码要写多少可以根据实际情况调整,但很多时候我们不知道确切的范围,只好把整个 C 地址网段全部加入 VPN 路由表了。由此可以看出,FreeRouter V1 一个很大的问题就是 IP 的搜集非常困难,如果发生 IP 变动的话更是难上加难。多加了关系,顶多是多消耗一点 VPN 的流量; 如果漏加了就非常麻烦了,对于 dropbox 这些靠客户端形式工作的东西来说,除了抓包都没有直观的方式可以获取服务器的 IP。这也就是为什么我会最终停止 V1 的更新,全力投入 V2 的维护的主要原因。