背景

贝壳自己的vps蒙难,不能正常工作了。所以贝壳买了一个vpn。是pptp/l2tp系列的。用起来很好用,但是这类ip-based vpn有几个不便。

  • 不能自动设定客户端路由表,实现智能翻墙选择。
  • 每个需要翻墙的设备均需要拨号,而目标设备有容量极限。
  • 不能实现非侵入式翻墙,打开之后连p2p都翻了。

与此相反,代理式翻墙可以比较有效的解决这些问题。一个点拨号,其他点可以共享代理。不需要翻墙的直接访问不设定代理就好。唯路由表没有办法。实际上,为了使得代理可以使用路由表选择,贝壳还是花了一番功夫做了antigfw项目的。

闲话少说。这次贝壳就展示一下如何在debian下设定pptp vpn,并且利用代理无缝共享的。

linux下的vpn设定

安装pptp-linux这个包,然后按照说明使用即可。

pptpsetup --create <TUNNEL> --server <SERVER> [--domain <DOMAIN>] --username <USERNAME> [--password <PASSWORD>] [--encrypt] [--start]

自己填充用户名密码服务器,就会在/etc/ppp/peers/下面生成对应的文件。使用pon tunnelname就可以拨号了。

路由设定

初始设定好的vpn不具有智能路由,因此必须添加一些内容。

首先使用chnroutes.py这个程序,得到ovpn下常规用的路由表。当然,我们可以用linux下的路由表,但是他的old gateway存放在了/tmp下面,对此我并不是很喜欢。所以我只用了他的路由 表信息,其余自己处理。如果你不确定自己执行时的默认路由,理论上也应当需要下面的一些配置。

使用下面这个topptp.sh,可以将输出的routes.txt转换为pptpup和pptpdown两个文件。

#!/bin/bash

ETHGW=192.168.1.1

cat > pptpup <<EOF
#!/bin/bash
export PATH="/bin:/sbin:/usr/sbin:/usr/bin"

EOF

cat > pptpdown <<EOF
#!/bin/bash
export PATH="/bin:/sbin:/usr/sbin:/usr/bin"

EOF

sed "s:route (S*) (S*) net_gateway 5:route add -net 1 netmask 2 gw $ETHGW:g" routes.txt >> pptpup
sed "s:route (S*) (S*) net_gateway 5:route del -net 1 netmask 2:g" routes.txt >> pptpdown

chmod 755 pptpup pptpdown

再将这两个文件复制到/etc/ppp下面,然后将如下内容添加到/etc/ppp/peers/xxx文件,具体就是你刚刚生成的配置。

defaultroute
replacedefaultroute
connect /etc/ppp/pptpup
disconnect /etc/ppp/pptpdown

第一二行,配置了替代默认路由。三四行,配置了启动时某些路由表项使用直连。

代理

什么废话都不用多说,直接在设备上安装polipo。然后加入以下两行,赋予其他用户访问权限。

proxyAddress = "0.0.0.0" # IPv4 only
allowedClients = 192.168.1.0/24

这就齐活了。

如果你开了防火墙,不要忘记打开8123端口。

效果

在其他设备上,设定代理,然后直接访问,发现是不是国内外的网站都可以直接使用了?

当然,这个的缺陷就是需要一台机器始终开启翻墙,而且这台机器不能用做p2p下载了。因为上面的流量会被翻掉。