红联Linux门户
Linux帮助

把Ubuntu笔记本打造成Fan wall无线路由器

发布时间:2016-10-24 14:42:10来源:blog.csdn.net/lvshaorong作者:lvshaorong
研究了一阵子的Openwrt路由器,主要是让Shadowsocks作为一个服务跑在openwrt路由器上,然后该路由器就实现了透明代理功能,连入该路由器Wifi的设备都实现了代理,达到了科学上网的效果。后来又一想,既然Openwrt可以,那Ubuntu应该也没啥问题,于是着手开始研究。
 
首先Openwrt用的Shadowsocks是libev的版本,也就是C语言直接编译过来的版本,其源代码可以从这里(https://github.com/shadowsocks/shadowsocks-libev)下载到。libev版本包含ss-server,ss-local,ss-redir,ss-tunnel,其中ss-redir是做透明代理用的服务程序,需要配合iptables使用。但是,网上多数的Ubuntu+shadowsocks文章都是介绍的Python版本和Shadowsocks Linux版本,而这两个版本都是只有ss-server和ss-local 两个服务,ss-local只能开放一个代理端口,然后让浏览器使用类似swichysharp类似的软件设置代理,这样的方式虽然安装容易但是只能让浏览器走代理,不能实现全局的透明代理。
把Ubuntu笔记本打造成Fan wall无线路由器
针对python版的sslocal客户端,可以使用redsocks进行透明代理,这种方法在我之前的一篇博客《WiFi热点分享ShadowSocks流量实现全局透明代理》中写过
 
不过这种方式有几个弊端:
1、redsocks服务只能代理tcp流量,不能代理udp流量
2、redsocks有bug,不能关闭已建立的连接,一旦超越linux的最大限制,就会报“Too many open files”异常,导致服务瘫痪,需要每隔一段时间进行重启
3、在我的使用还发现这种方式经常会让NetworkManager对无线网卡的管理崩溃,导致搜索不到wifi信号,需要经常重启NetworkManager
 
所以我们要安装Shadowsocks-libev这个库并开启ss-redir服务进行全局代理。
这样做的好处有很多:
1、Shadowsocks-libev版占用内存比python版更小,在30块钱路由器上都能跑很溜的程序在Ubuntu上肯定没什么问题
2、可以随时下载最新源码编译最新的软件包,比如在Ubuntu16.04上,直接使用apt-get install shadowsocks 安装的版本很旧,连rc4-md5的加密都不支持
3、无需借助其他第三方程序如redsocks,大大提高了系统稳定性
4、deb包安装完成后会自动加入环境变量,而python版是没有环境变量的
 
好了进入正题,如何安装部署Shadowsocks-libev版呢
作为一名Ubuntu用户,首先我们可以登录Shadowsocks的github的官网去下载相关c源代码,然后编译成deb包,因为创造Shadowsocks的大神 clowwindy已经退隐江湖,所以我们可以从还在更新着的其他人的分支上去clone,比如这个https://github.com/shadowsocks/shadowsocks-libev
当然目前我已经把Ubuntu常见的版本已经编译出来了,大家可以直接下载使用
使用dpkg命令可以直接安装该deb包
sudo dpkg -i ./shadowsocks-libev_2.5.5-1_amd64.deb
Ubuntu 16.04及以上版本下载地址:http://download.csdn.net/detail/lvshaorong/9662213
安装完成之后可以使用ss-redir -h命令来检查是否安装成功
把Ubuntu笔记本打造成Fan wall无线路由器
然后我们需要写一个文本文件,里面是个json字符串,写明服务器地址,密码,监听端口等信息,如下
把Ubuntu笔记本打造成Fan wall无线路由器
注意这里的“local_address”一定要填写0.0.0.0,默认是127.0.0.1,但是默认是无法使用iptables进行端口转发的,所以要设置为0.0.0.0,其他的内网地址也不行,比如192.168.1.81,我试过
配置好用户名密码之后就可以开启ss服务了,方法很简单
sudo ss-redir -c <上面json配置文件路径> -v -u
上面的-v是指开启罗嗦模式,也就是把端口转发情况全部打印出来,方便我们调试错误
-u 是指开启udp转发,如果你的服务器支持那么推荐开启
如果出现如下报错
把Ubuntu笔记本打造成Fan wall无线路由器
那说明json中配置的1081端口已经被别的程序占用了,这时我们可以通过netstat -ntl检查端口占用情况,然后选一个没有被占用过的端口
 
下面是最重要的一步,开启iptables端口转发,其作用就是将无线网卡收集到的数据包转发给Shadowsocks走代理,所以要写一点iptables路由规则,如下
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 10.42.0.0/16 -j REDIRECT --to-ports 1081
其中修改的是PREROUTING表,这样只会对Wifi网卡的流量起作用,而不会对本机起作用,如果想让本机起作用,可以把相同的规则加上server的ip return加到OUTPUT表上
上面的10.42.0.0/16是Ubuntu系统分享wifi后,wifi子网连入设备的IP地址,上面最后一句话的意思就是把所有来自Wifi的数据包都发送到ss-redir的监听端口1081去
 
另外,ss-redir还支持udp转发,方法是在上面路由规则上再加一句
iptables -t nat -A PREROUTING -p udp -s 10.42.0.0/16 -j REDIRECT --to-ports 1081
在开启了UDP转发之后,Shdowsocks就彻底可以当VPN使用了,因为全部的流量都已经得到转发,这在python版里是实现不了的。
还有关键的一步是修改DNS服务器地址,防止被dns污染。
sudo nano /etc/resolv.conf
如下修改为阿里的DNS,我这边测试没有被DNS污染
把Ubuntu笔记本打造成Fan wall无线路由器
 
在这里其实我又一个很大的疑问,我之前使用redsocks转发tcp流量的时候,不管设置什么DNS服务器地址都会被污染,而使用ss-redir仅进行tcp转发的时候居然没有被污染,原因不明。
如果如此设置仍然无法避免被DNS污染,请参考我之前写的两边DNS文章《Ubuntu16.04用Pdnsd替换dnsmasq防止DNS污染》《一分钟快速搭建Windows防污染DNS服务器——Pcap_DNSProxy》搭建自己的DNS服务器
好了,现在可以开启wifi功能让手机连入,然后开心的fan wall了,Ubuntu16.04开启Wifi分享功能网上说的很多,我这里就不浪费篇幅了
http://jingyan.baidu.com/article/363872ecd8f35d6e4ba16f97.html
 
附图:通过netstat命令检查Shadowsocks是否正在运行
把Ubuntu笔记本打造成Fan wall无线路由器
 
本文永久更新地址:http://www.linuxdiyf.com/linux/25350.html