在此之前先解释一下ss-client和ss-redir。

    1. 两者都要和ss-server通信。
    2. ss-client本质是一个sock5代理,需要软件支持sock5代理,比如chrome,或是用tsock这种软件转换一下。
    3. 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
    17ef1d983db54de1b96e8d1c3866982f-20170820213204.png

    继续编译

    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
    c623accd1ee1420aa51d18db28fd2eea-20170820215315.png

    这是我编译 好的包
    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

    1. iptables -t nat -A PREROUTING -d 127.0.0.0/24 -j RETURN
    2. iptables -t nat -A PREROUTING -d 192.168.0.0/16 -j RETURN
    3. iptables -t nat -A PREROUTING -d 10.42.0.0/16 -j RETURN
    4. iptables -t nat -A PREROUTING -d 0.0.0.0/8 -j RETURN
    5. iptables -t nat -A PREROUTING -d 10.0.0.0/8 -j RETURN
    6. iptables -t nat -A PREROUTING -d 172.16.0.0/12 -j RETURN
    7. iptables -t nat -A PREROUTING -d 224.0.0.0/4 -j RETURN
    8. iptables -t nat -A PREROUTING -d 240.0.0.0/4 -j RETURN
    9. iptables -t nat -A PREROUTING -d 169.254.0.0/16 -j RETURN
    10. 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