在此之前先解释一下ss-client和ss-redir。
- 两者都要和ss-server通信。
- ss-client本质是一个sock5代理,需要软件支持sock5代理,比如chrome,或是用tsock这种软件转换一下。
- ss-redir是透明代理,配合iptables,本机所有软件可以都走代理,而不需要一定支持sock5代理。
因为要在其他软件上翻墙所以我选择ss-redir做透明代理.
言归正传
作为一名Ubuntu用户,首先我们可以登录ss的github的官网去下载相关c源代码,然后编译成deb包,因为创造ss的大神 clowwindy已经退隐江湖,所以我们可以从还在更新着的其他人的分支上去clone,比如这个https://github.com/madeye/shadowsocks-libev
编译SSLibev
mkdir -p ~/build-area/
cp ./scripts/build_deb.sh ~/build-area/
cd ~/build-area
./build_deb.sh
编译出来的deb
继续编译
cd shadowsocks-libev
sudo apt-get install --no-install-recommends devscripts equivs
mk-build-deps --root-cmd sudo --install --tool "apt-get -o Debug::pkgProblemResolver=yes --no-install-recommends -y"
./autogen.sh && dpkg-buildpackage -b -us -uc
cd ..
sudo dpkg -i shadowsocks-libev*.deb
遇到包依赖问题 请执行apt-get -f install
这是我编译 好的包
b6e5eda443b94f419b3918218d069885-shadowsockslibev3.0.31amd64.deb
然后我们需要写一个文本文件,里面是个json字符串,写明服务器地址,密码,监听端口等信息,如下
注意这里的“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转发,如果你的服务器支持那么推荐开启
如果出现如下报错
那说明json中配置的1081端口已经被别的程序占用了,这时我们可以通过netstat -ntl检查端口占用情况,然后选一个没有被占用过的端口
下面是最重要的一步,开启iptables端口转发,其作用就是将无线网卡收集到的数据包转发给ss走代理,所以要写一点iptables路由规则,如下
[python] view plain copy
- 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去
可以用
sudo iptables -t nat -L -n
来检查iptables路由规则,正确的情况应该如下图
另外,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版里是实现不了的。
这里要注意一下,使用如上配置之后是可以将TCP流量代理到SS服务器的,但是有些网站如Facebook,google还是打不开,原因是DNS目前仍然从本机发出,使用UDP协议且不经过代理,所以对于这些网站会被DNS投毒解析到一个错误的IP,访问这个错误的服务器当然不会成功,所以下一步我们要解决DNS的问题
此时需要使用Pdnsd或者ss-tunnel服务,用来防止DNS污染
然后修改修改系统默认的DNS服务器地址为上面我们开启的pdnsd或ss-tunnel的监听地址
sudo nano /etc/resolv.conf
这一步的详情请参考我之前写的两边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命令检查ss是否正在运行
关于编译:
编译ss-libev库其实很简单,根据github上的说明两行代码就可以搞定,记得要执行apt-get update就好
git clone https://github.com/shadowsocks/shadowsocks-libev.git
sudo apt-get update
cd shadowsocks-libev
sudo apt-get install –no-install-recommends build-essential autoconf libtool libssl-dev \
gawk debhelper dh-systemd init-system-helpers pkg-config asciidoc xmlto apg libpcre3-dev
dpkg-buildpackage -b -us -uc -i
cd ..
sudo dpkg -i shadowsocks-libev*.deb