某知名正向代理软件和SSH这种Socks5代理工具最常用的一种使用方法是在浏览器上配置代理端口,然后指向该工具监听的1080端口的方式进行代理,这是Windows系统用户最常见的方式,这样无法进行全局代理和UDP代理。而且部署起来也稍显麻烦,需要下载客户端配置服务器地址等等步骤。其实通过SS-libev自带的透明代理组件ss-redir或者使用第三方的透明代理工具比如redsocks2完全可以实现透明代理并转换为虚拟专用网使用,下面介绍在Ubuntu系统中将SS客户端代理转为PPTP的方法。
先介绍一下原理:
虚拟专用网的原理就是在服务端虚拟一个网卡,一般叫ppp0,然后通过这块虚拟网卡给接入设备分配一个IP地址,这个IP地址可以很随意,比如我分配192.168.0.2-254给客户端,给服务端Ubuntu电脑分配192.168.0.1,而我Ubuntu电脑公网地址是192.168.1.81.
既然有这样一块虚拟网卡,那么事情就非常好办了,我之前做过在一台Ubuntu笔记本上,具备有线网卡和无线网卡两块硬件网卡,让无线网卡分享一个wifi出来,然后通过有线网卡进行上网,这样客户端设备只需要连接上Ubuntu电脑分配出来的Wifi就可以通过SS的透明代理进行科学上网的方法。而虚拟专用网的改造方法和这个一模一样,只不过把笔记本上无线网卡换成了现在的虚拟网卡,像原来的无线网卡一样配置SS和NAT就可以,客户端的请求还是会像以前一样经过PREROUTING表,可以截获进行路由。配置无线网卡的方式可以参考我之前的文章《Ubuntu编译运行ss-redir打造透明代理Wifi环境》
下面介绍一下具体的实现步骤
首先我们搭建一个普通的PPTP服务器,在Ubuntu上搭建PPTP服务器非常简单,有很多文章介绍过,Openwrt就比较复杂了,下面介绍我的搭建方法
首先下载安装pptpd
sudo apt-get install pptpd
编辑/etc/pptpd.conf文件,寻找如下内容前面的#去掉并做修改
debug ppp /usr/sbin/pppd #指向pppd程序的地址,默认即可 option /etc/ppp/pptpd-options #指定DNS配置文件的地址,默认即可 localip 192.168.0.1 #本机虚拟网卡的内网地址 remoteip 192.168.0.2-254 #准备分配给客户端的内网地址段
2、编辑 /etc/ppp/chap-secrets,这里增加客户端虚拟专用网的帐号密码和绑定的IP,*为自动分配IP如:
# Secrets for authentication using CHAP # client server secret IP addresses 用户名1 pptpd 密码1 * 用户名2 pptpd 密码2 192.168.0.1 用户名3 pptpd 密码3 192.168.0.2
ms-dns 192.168.1.81我这里配置192.168.1.81的原因是我这台电脑上的53端口开启的pdnsd来防止DNS污染,所以设置本机为DNS服务器
ms-dns 114.114.114.114
4、开启Linux的内核转发,打开/etc/sysctl.conf这个文件,取消掉 net.ipv4.ip_forward=1 这一行的注释.
然后执行
sudo sysctl -p
使修改后的文件配置立即生效。
5、开启NAT转发,让虚拟专用网内网192.168.0.1/24这些用户通过192.168.1.81的IP地址进行上网,相当于把本机做成了一个路由器,原理和分享Wifi上网一样,只需执行下面一句话就够了
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
6、开启我们的PPTP服务
sudo service pptpd restart
好了,现在一个普通的PPTP服务端已经搭建完毕,现在可以让内网的设备设置这台Ubuntu电脑的地址为PPTP服务器的地址进行普通的虚拟专用网上网了,你可以看到你的外网地址已经变成了这台Ubuntu电脑的地址。同时,如果你使用tcpdump监控ppp0这块虚拟网卡,会看到很多192.168.0.x的数据包进入
使用sudo tcpdump -i ppp0 可以看到客户端发来的请求,均以192.168.0开头的ip地址
下面可以像之前配置Wifi无线网卡那样配置这块虚拟网卡的PREROUTING表了,不过在这之前,你需要开启ss-redir服务,我们这里让ss-redir监听在12345端口,注意这里的local_address必须是0.0.0.0,或者192.168.0.1,不然端口转发没法从别的网卡转发过来,然后像下面一样配置路由表,就实现了所有PPTP服务端流量都通过透明代理发送到远程SS服务器了。如果你的SS服务器放在国外,现在就相当于连接国内的PPTP服务器,但是收到的数据却来自国外的效果了,可以有效避免国外PPTP协议的虚拟专用网被G\F\W给掐断事情的发生。
iptables -t nat -A PREROUTING -d 127.0.0.0/24 -j RETURN
iptables -t nat -A PREROUTING -d 192.168.0.0/16 -j RETURN
iptables -t nat -A PREROUTING -d 10.42.0.0/16 -j RETURN
iptables -t nat -A PREROUTING -d 0.0.0.0/8 -j RETURN
iptables -t nat -A PREROUTING -d 10.0.0.0/8 -j RETURN
iptables -t nat -A PREROUTING -d 172.16.0.0/12 -j RETURN
iptables -t nat -A PREROUTING -d 224.0.0.0/4 -j RETURN
iptables -t nat -A PREROUTING -d 240.0.0.0/4 -j RETURN
iptables -t nat -A PREROUTING -d 169.254.0.0/16 -j RETURN
iptables -t nat -A PREROUTING -p tcp -s 192.168.0.1/8 -j REDIRECT --to-ports 12345
原理和安装部署ss-redir可以参考我之前的文章《Ubuntu编译运行ss-redir打造透明代理Wifi环境》这里就不占篇幅了
同样的方法适用于OpenV\P\N或者其他的虚拟专用网协议,亲测有效,原理都是一样的。
你还可以使用HAProxy对多个SS服务端进行负载均衡,然后通过单个虚拟专用网整合这些SS服务端,这一点是普通虚拟专用网做不到的,如果你在国外搭建一个虚拟专用网服务端,如果网络不好你就只能换个虚拟专用网连接了,而通过SS转虚拟专用网的方式添加高可用和负载均衡,你的虚拟专用网就不会轻易掉线了,因为有多个SS服务器同时提供服务。
关于负载均衡环境的搭建可以参考我的另一篇文章《OpenWrt基于HAProxy的透明代理负载均衡和高可用部署》