一半君的总结纸

听话只听一半君

如何使用shadowsocks透明代理反向翻墙(回国内)使用虾米音乐教程 – 简洁整理版

上篇折腾文是备忘录形式的,不利于大家照着操作,这里特此整理一份简明教程版,以供同学们参考

updates:
2017/01/14:
更新ss版本到2.6.1

2016/09/12:
更新ss版本到2.5.3

2016/09/17:
更新ss版本到2.5.2,从2.5.1开始增加了对pcre的依赖,所以在travis ci里build的时候先自行编译了pcre,因为不知道为何从repo安装libpcre3-dev不行,此外运行时候也需要libpcre.so.1,lz测试了下发现在低版本的tomato shibby v130里没有带这个文件,但是新一些的版本如v132里有此文件,如果无法升级tomato,可以试着在编译ss的时候configure后面加上 –without-libpcre 或者 –with-libpcre=no

2016/08/26:
更新ss版本到2.4.8,由于此版本增加了对asciidoc和xmlto的依赖,所以lz的travis ci的.travis.yml里也加上了这两个package

2016/03/20:
lz编译的tomato k26RT-N适用的shadowsocks在这里下载 http://oglopss.github.io/ctng-ss-jekyll/,可执行文件应该都是100k左右,如果你下的很大,1mb多,说明lz当时在做测试,没有strip以及upx,可以稍后再来下一次

目的

虾米于前几年剥夺了在国外的同学们的听音乐福利,lz照搬无数教程后,最后试验出下面这个基于shadowsocks透明代理的解决方案,最终效果是,只要你连到此路由器的wifi,你就能上虾米了,手机和电脑上无需做任何附加设置(是所谓自动逆翻墙路由器),

实质

其实就是自动翻墙路由器反着设置。和网上常见的教程不同之处在于,这里shadowsocks的服务端不是放在买来的vps上,而是直接放在了tomato路由器上,lz编译了磊科q3可用的shadowsocks-libev,因为这个版本比较小,只有100kb左右

xiami_before

需要准备的软硬件

  • tomato的路由器一台(位于国内,当然也可以是dd-wrt,openwrt的路由器),这里lz使用的是屌丝路由器磊科Q3,京东69元,下文中用Q3代替他的地址
  • tomato的路由器另一台(位于国外你的身边,当然也可以是dd-wrt,openwrt的路由器),这里lz使用的是asus rt-n66u,下文中用N66代替他的地址
  • shadowsocks 2.34 (lz已经交叉编译好了最新版的静态和动态版本,下载地址在文末)

* lz在此文中使用的是tomato shibby版本 v131, 其中磊科q3刷的是max版本,6.7mb,jffs空余1.4mb, rt-n66刷的是aio版本,jffs还有1xmb空余,(不过lz还在上面插了优盘,拆机装了tf卡,装了entware,此处暂且不表,见此文

设置步骤

  1. shadowsocks服务端设置

    在国内的q3路由器上开启jffs存储空间,并将ss-server复制上去

    # 创建必要的文件夹
    ssh root@router-in-China  "mkdir -p /jffs/ss"
    ssh root@router-in-China  "mkdir -p /jffs/etc/config"
    
    # 把ss-server拷上去
    scp ss-server root@router-in-China:/jffs/ss
    
    # 创建配置文件
    ssh root@router-in-China
    vi /jffs/ss/ss-server-config.json
    
    # 配置文件内容如下,按i键进入编辑模式,然后中键贴入,按Esc,输入:wq保存退出
    {
        "server":"my_server_ip",
        "server_port":8388,
        "local_address": "127.0.0.1",
        "local_port":1080,
        "password":"mypassword",
        "timeout":300,
        "method":"aes-256-cfb",
        "fast_open": false,
        "workers": 3
    }
    
    # 确保他能运行
    chmod +x /jffs/ss/ss-server
    
    # 创建自动启动运行script
    vi /jffs/etc/config/ss-server.fire
    
    # 文件内容如下
    #!/bin/sh
    /jffs/ss/ss-server -c /jffs/ss/ss-server-config.json -f /tmp/ss-server.pid
    
    # 确保他能运行
    chmod +x /jffs/etc/config/ss-server.fire
    
    jffs设置

    Admistration->JFFS
    tomato的设置如图所示:
    jffs_tomato

    firewall设置

    Admistration->scripts

    iptables -A INPUT -p tcp --dport 8388 -j ACCEPT
    

    firewall_tomato

    # 验证ss-server已启动
    root@unknown:/tmp/home/root# ps | grep ss
     6236 root      2680 S    /jffs/ss/ss-server -c /jffs/ss/ss-server-config.json -f /tmp/ss-server.pid
    
    # 验证ss-server已监听8388端口
    root@unknown:/tmp/home/root# netstat -lnt
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       
    tcp        0      0 xx.xx.xxx.xxx:8388      0.0.0.0:*               LISTEN 
    

    至此服务器端已经设置完成,你可以重启路由器,使用上面的方法验证服务器端是否正常运行

  2. shadowsocks客户端设置

    这里使用的是ss-redir透明代理客户端

    # 创建必要的文件夹
    ssh root@router-beside-me  "mkdir -p /jffs/ss"
    ssh root@router-beside-me  "mkdir -p /jffs/etc/config"
    
    # 把ss-redir拷上去
    scp ss-redir root@router-beside-me:/jffs/ss
    
    # 创建配置文件
    ssh root@router-beside-me
    vi /jffs/ss/ss-redir-config.json
    
    # 配置文件内容如下,按i键进入编辑模式,然后中键贴入,按Esc,输入:wq保存退出
    {
        "server":"my_server_ip_in_China",
        "server_port":8388,
        "local_address": "0.0.0.0",
        "local_port":1080,
        "password":"mypassword",
        "method":"aes-256-cfb",
    }
    
    
    # 确保他能运行
    chmod +x /jffs/ss/ss-redir
    
    # 创建自动启动运行script
    vi /jffs/etc/config/ss-redir.fire
    
    # 文件内容如下
    #!/bin/sh
    /jffs/ss/ss-redir -c /jffs/ss/ss-redir-config.json -f /tmp/ss-redir.pid
    
    # 确保他能运行
    chmod +x /jffs/etc/config/ss-redir.fire
    

    tomato的设置如图所示:

    dns和dnsmasq设置

    Advanced->DHCP/DNS 确保圈中的部分已勾选

    # 这些是dnsmasq的配置文件,意思是把xiami.com加到gfwlist的ipset里,你可以添加更多
    server=/.xiami.com/127.0.0.1#53
    ipset=/.xiami.com/gfwlist
    

    dnsmasq

    firewall script设置
    # 8388 1080都打开把,说不定你以后会给国内朋友当服务器的
    iptables -A INPUT -p tcp --dport 8388 -j ACCEPT
    iptables -A INPUT -p tcp --dport 1080 -j ACCEPT
    
    # gfwlist set
    modprobe ipt_REDIRECT
    modprobe ipt_set
    
    ipset -N gfwlist iphash
    # iptables -t nat -A PREROUTING -p tcp -m set --set gfwlist dst -j REDIRECT --to-port 1080
    
    # ss-redir chain
    iptables -t nat -N SHADOWSOCKS
    iptables -t nat -A SHADOWSOCKS -d router-in-China -j RETURN
    
    iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN
    iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN
    iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN
    iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN
    iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN
    iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN
    iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN
    iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN
    
    
    iptables -t nat -A SHADOWSOCKS -p tcp -m set --set gfwlist dst -j REDIRECT --to-port 1080
    iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS
    

    firewall

  3. 好了,到这一步,你应该拥有了一台“自动逆翻墙”路由器,所有连到此路由器的手机电脑将能够访问虾米网站,你可以在tomato webui里的dnsmasq配置处添加更多的国内网站

  4. vpn设置

    不在路由器wifi范围内的时候,可以用vpn连到路由器,从而达到在公司或是外面行动使用4g上网的时候,同样可以翻回墙内的效果,为了简略起见,使用设置最简单但是不安全的pptp vpn(更安全的方式比如openvpn,l2tp/ipsec等也许会另开一篇)
    在tomato webui的VPN Tunneling->PPTP Server里勾上启动pptp server,并添加一组用户名密码即可
    tomato_pptp

    在Iphone上添加相应的帐号地址即可使用vpn连回此路由器,达到翻回国内的效果
    iphone_add_pptp

翻回墙内,觉得世界一片美好~~~ 凡是连到这个路由器的设备,不管你是直接在家连的,还是在外面用vpn连的,你都能无障碍的访问虾米了,同理其他网站如果说你不在国内不能用的话,去dnsmasq custom configuration那里加上就行了
xiami_after

File 2-10-15, 10 44 16 AM

文件下载:(在墙外的dropbox上)最新版的ss下载看本文顶部,lz后来使用travis ci做了自动build
shadowsocks-libev_2.3.1_mipsel_OpenSSL_static.tar.gz
shadowsocks-libev_2.3.1_mipsel_OpenSSL_dynamic.tar.gz
openssl-1.0.2d_dynamic.tar.gz

perp-2.07.tar.gz

tomato-K26-1.28.RT-N5x-MIPSR2-131-netcore-q3-Max.trx
tomato-K26-1.28.RT-N5x-MIPSR2-132-netcore-q3-Max.trx

编译教程:
CentOS 7下交叉编译tomato 1.2.8 v131路由器(磊科Q3)可以使用的shadowsocks 2.3.1 – 正/逆翻墙用

Advertisements

20 responses to “如何使用shadowsocks透明代理反向翻墙(回国内)使用虾米音乐教程 – 简洁整理版

  1. Karl 十一月 20, 2015 @ 5:48 上午

    你好,我看了你的文章觉得是exactly what I need,Thank you!
    我去读了一些ss的介绍,发现它就是ss客户端到ss服务器端去传加密的包,以此来穿过墙。我的需求主要是看腾讯NBA,我不知道你这个方法音频可以,视频是否存在带宽不够的问题?国内家中如果是20M的网,看视频当然是绰绰有余,但是相当于还要把这些数据都转发到我在国外的这个ss客户端,家里的带宽,以及国际出口的带宽,是否都可能会不够呢?

    • 一半君 十一月 20, 2015 @ 7:22 上午

      我感觉足够了啊 你试试呗

      • Karl 十一月 20, 2015 @ 9:46 上午

        你能不能试一下看youku,或者腾讯直播什么的,我现在不回国,没办法在家里架起服务器来。但是可以做好准备以后回国的时候弄

      • Karl 十一月 24, 2015 @ 2:37 下午

        你好,我用你的方法在国外DDWRT路由器上弄好了ss-server,用你的方法检查也都是对的。但我让国内的人用Mac ss客户端连接,连上没有报什么错,但是什么网站都打不开,无论国内国外。”server”:”my_server_ip”,这一个我填的是我路由器的外网ip,但是我看到有些教程写的是0.0.0.0,不知这个是否有影响?如何确定是服务器端的问题还是客户端设置问题(客户端其实只有几个可以填的地方应该也不会有什么问题)。。。从外部ping我的路由器ip:8388是应该要能够ping通的吗?望帮助,谢谢!

      • 一半君 十一月 24, 2015 @ 2:44 下午

        “server” 在server端填0.0.0.0,客户端当然填ip了,我服务器路由器用的是tomato,可以ping啊,默认的设置是不让ping,dd我不知道哪里设我没用过,拿qt5那个客户端试试,连上以后要看timeout是不是有数值,如果没有说明哪里设错了大概,也可以在国内路由器上直接用ss-local,看看连不连的上,命令行执行比较容易看错误提示

      • Karl 十一月 24, 2015 @ 4:52 下午

        在设置里有取消禁止ping。。。现在可以ping通了,不过ss客户端还是不行,请教你在服务器端的firewall设置里面写的那行是干嘛用得,在客户端里面也有类似的又是干嘛用的?

      • 一半君 十一月 24, 2015 @ 4:56 下午

        哪一行?都是教程网站上的

      • Karl 十一月 25, 2015 @ 3:14 上午

        iptables -A INPUT -p tcp –dport 8388 -j ACCEPT
        这个是必须的么

      • 一半君 十一月 25, 2015 @ 3:49 上午

        这个是在服务端所在的路由器上的,意思是允许8388端口的通讯进来,所以是必须的吧

  2. Ziman Ling 八月 24, 2016 @ 4:05 上午

    奇怪,之前直接把你编译出的scp复制到我的ac66u (merlin)上回报错,找不到symbol
    过了几个小时莫名其妙就好了
    感谢

  3. 杜可名 八月 26, 2016 @ 5:57 下午

    你好,我现在国内,用树莓派搭建shadowsocks在端口转发上碰到了问题:
    我家一个无线路由器下面连接了树莓派,路由器设置了端口转发,服务是socks,外部端口填了1080,内部端口到底是 下面的server_port还是local_port? 第二,我在某些网站上看到”server”的ip要填公网Ip,是吗?还是填”0.0.0.0″?
    {
    “server”:”60.163.120.95″,
    “server_port”:11111,
    “local_address”: “127.0.0.1”,
    “local_port”:1080,
    “password”:”123456″,
    “timeout”:300,
    “method”:”aes-256-cfb”,
    “fast_open”: false,
    “workers”: 1
    }

    望请教!非常感谢!

    • 一半君 八月 26, 2016 @ 11:43 下午

      如果你是要把他当服务器端(看你的配置文件应该是)以达到身在国外时也能连回国内的效果,那当然路由器的端口转发设置里的内部端口应该和上面配置文件里的server _port一样,我觉得server的“ip”应该填0.0.0.0,客户端的ss配置文件里才是填的server的公网ip

      • 杜可名 九月 9, 2016 @ 10:56 下午

        太感谢了一半君!
        我还碰到一个问题,就是我家的电信ip地址会隔一段时间改变,请问我在国外的时候如何动态得到我的服务器ip地址(服务器在国内)

      • 一半君 九月 9, 2016 @ 11:04 下午

        tomato里有ddns设置,你去注册个两边都能访问的,填进去,可以设两个,然后配置文件里填ddns的地址

      • 杜可名 九月 27, 2016 @ 4:44 上午

        一半君你好,现在我在国外了,可以连上国内的主机,但是网速并不理想,只有200K左右,国外是100M光纤,国内的50M光纤,为什么还这么卡?

      • 一半君 九月 28, 2016 @ 11:34 上午

        阿这个感觉lz爱莫能助了,需要问专业点的人士了… orz

  4. coolboy0961 八月 28, 2016 @ 1:04 下午

    一半君你好

    首先非常感谢你的分享。
    我最近准备回国,想实现国外国内的路由上同时假设ss服务器和客户端,将来在国外可以看国内视频,在国内可以翻墙。

    现在参照你的教程假设后国外路由的ss客户端以后,国外路由的服务端无法udp转发了。不知道你是否知道如何避免。

    我说一下我的假设步骤和结果
    1:国外路由假设ss服务器端
    防火墙打开端口:
    iptables -A INPUT -p tcp –dport 8388 -j ACCEPT
    iptables -A INPUT -p tcp –dport 1080 -j ACCEPT

    开启ss服务:
    ss-server -c /opt/etc/shadowsocks-libev/ss-server-config.json -u -f /opt/etc/shadowsocks-libev/shadowsocks-libev.pid

    2:用安卓手机的ss客户端通过LTE网络验证
    可以连接上国外路由的ss服务器,并且开启udp转发也可以访问网页

    3:假设国外路由客户端(通过你的教程)
    防火墙:(ipset的地方用你的方法无法载入,上网找了别的方法)
    # gfwlist set
    insmod ip_set
    insmod ip_set_bitmap_ip
    insmod ip_set_bitmap_ipmac
    insmod ip_set_bitmap_port
    insmod ip_set_hash_ip
    insmod ip_set_hash_ipport
    insmod ip_set_hash_ipportip
    insmod ip_set_hash_ipportnet
    insmod ip_set_hash_net
    insmod ip_set_hash_netport
    insmod ip_set_list_set
    insmod xt_set

    ipset -N gfwlist iphash

    # ss-redir chain
    iptables -t nat -N SHADOWSOCKS
    iptables -t nat -A SHADOWSOCKS -d 45.55.14.59 -j RETURN

    iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN
    iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN
    iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN
    iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN
    iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN
    iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN
    iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN
    iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN

    iptables -t nat -A SHADOWSOCKS -p tcp -m set –match-set gfwlist dst -j REDIRECT –to-port 1080
    iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS

    开启客户端:
    ss-redir -c /opt/etc/shadowsocks-libev/ss-redir-config.json -f /opt/etc/shadowsocks-libev/ss-redir.pid

    路由的DNS设定:
    Intercept DNS port (UDP 53) (checked)
    Dnsmasq Custom configuration (设定了一些测试IP用的网站)

    到了3完成以后,发现测试IP用的网站测出来的IP变成了45.55.14.59,
    但是用安卓手机登陆国外路由的ss服务器以后如果手机上开启了udp转发就没法连接到网页
    关闭udp转发就可以连接网页。
    另外在开启udp转发的情况下可以直接输入IP访问网页,但是通过网址就不行,所以判断应该是DNS的设置有问题,但是具体不知道哪里有问题。

  5. 一半君 八月 28, 2016 @ 2:19 下午

    没看明白… 手机开了udp转发 谁就不能连接网页? 我觉得我好像很难测试 因为我最近都回不了,我文中假设的是 如果在国内,手机用vpn连到国内家里的路由器 从而达到翻的效果,因为我手机不想root,好多软件用不了
    可以加我telegram研究@oglop

    • coolboy0961 八月 29, 2016 @ 7:01 下午

      非常感谢你的回复。

      我后来想会不会UDP转发的端口服务器端没开,于是就追加了下面这个防火墙命令,结果能访问网页了!!
      iptables -A INPUT -p udp –dport 8388 -j ACCEPT

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: