一半君的总结纸

听话只听一半君

临时回国的翻墙教程 (把shadowsocks服务端放在国外住处的tomato路由器上)– 简洁整理版

本文的方法是按照飞羽博客的方案3操作的,原文是用在openwrt上的,不利于大家照着操作,这里特此整理一份简明教程版,以供同学们参考

update:
lz编译的tomato k26RT-N适用的shadowsocks在这里下载 http://oglopss.github.io/ctng-ss-jekyll/

目的

临时回国,没买vps,想要方便的手机电脑翻墙,把国内家里的路由器做成自动翻墙路由器

方法

把shadowsocks的服务端直接放在tomato路由器上(而不是常见的教程里的放在买来的vps上,其实没区别,都是linux系统)

需要准备的软硬件

  • tomato的路由器一台(位于国外你的家里,当然也可以是dd-wrt,openwrt的路由器),这里lz使用的是asus rt-n66u,下文中用N66代替他的地址
  • shadowsocks (lz已经交叉编译好了2.3.4的静态和动态版本,下载地址在文末)
    1. shadowsocks服务端设置

      在国外的路由器上开启jffs存储空间,(或者你的路由器高级点能插u盘的话此处不表,网上教程很多),将ss-server复制上去

      # 创建必要的文件夹
      ssh root@router-abroad  "mkdir -p /jffs/ss"
      ssh root@router-abroad  "mkdir -p /jffs/etc/config"
      
      # 把ss-server拷上去
      scp ss-server root@router-abroad:/jffs/ss
      
      # 创建配置文件
      ssh root@router-abroad
      vi /jffs/ss/ss-server-config.json
      
      # 配置文件内容如下,按i键进入编辑模式,然后中键贴入,按Esc,输入:wq保存退出
      {
          "server":"0.0.0.0",
          "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
      }
      
      # 如果不是很确定配置文件写的对不对,可以先前台运行验证一下,注意需要-u
      /jffs/ss/ss-server -s 0.0.0.0 -p 8388 -k <mypassword> -m aes-256-cfb -b 127.0.0.1 -u
      
      # 确保他能运行
      chmod +x /jffs/ss/ss-server
      
      # 创建自动启动运行script
      vi /jffs/etc/config/ss-server.fire
      
      # 文件内容如下 注意有-u
      #!/bin/sh
      /jffs/ss/ss-server -c /jffs/ss/ss-server-config.json -f /tmp/ss-server.pid -u
      
      # 确保他能运行
      chmod +x /jffs/etc/config/ss-server.fire
      
      

      tomato的设置如图所示:

      jffs设置

      Admistration->JFFS
      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 -u
      
      # 验证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 xxx.xxx.xxx.xxx:8388      0.0.0.0:*               LISTEN 
      

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

    2. 手机翻墙

      有现成的apps可以装 看这里

windows笔记本电脑翻墙

有gui的客户端shadowsocks-qt5可以装 看这里
有编译好的版本可以直接用 Shadowsocks的图形化客户端Shadowsocks-Qt5介绍,这个什么时候用呢?lz觉得是如果只有一台笔记本需要翻墙,没有很多需要连wifi的设备的需求的话,你可以用这个,或者是想简单测试下ss server有没有搭好,那可以用它,不然如果有很多设备都需要翻的话,远没有下面的“自动翻墙路由器”方便,因为没台设备都需要装ss的客户端并进行设置。lz写有 shadowsocks-qt5 for windows 试用心得

  • 国内家里的路由器上的shadowsocks客户端设置 – 制作自动翻墙路由器

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

    # 创建必要的文件夹
    ssh root@router-in-China "mkdir -p /jffs/ss"
    ssh root@router-in-China "mkdir -p /jffs/etc/config"
    
    # 把ss-redir拷上去
    scp ss-redir root@router-in-China:/jffs/ss
    
    # 创建配置文件
    ssh root@router-in-China
    vi /jffs/ss/ss-redir-config.json
    
    # 配置文件内容如下,按i键进入编辑模式,然后中键贴入,按Esc,输入:wq保存退出
    # 我没在这里放local_port是因为我想让ss-tunnel也用这个配置文件
    {
        "server":"my_server_ip_abroad", # 这是你国外住处的路由器的地址
        "server_port":8388,
        "local_address": "0.0.0.0",
        "password":"mypassword",
        "method":"aes-256-cfb",
    }
    
    # 如果不是很确定配置文件对不对,可以先命令行前台测试一下
    /jffs/ss/ss-redir -s <my_server_ip_abroad> -p 8388 -k <mypassword> -m aes-256-cfb -l 1080
    
    # 确保他能运行
    chmod +x /jffs/ss/ss-redir
    
    # 创建自动启动运行script
    vi /jffs/etc/config/ss-redir.fire
    
    # 文件内容如下 在命令行里加local_port 1080
    #!/bin/sh
    /jffs/ss/ss-redir -c /jffs/ss/ss-redir-config.json -l 1080 -f /tmp/ss-redir.pid
    
    # 确保他能运行
    chmod +x /jffs/etc/config/ss-redir.fire
    
    # 下面使用ss-tunnel解决dns问题
    # 创建自动启动运行script
    vi /jffs/etc/config/ss-tunnel.fire
    
    # 文件内容如下 使用ss-tunnel转发UDP的DNS请求,要加-u, 当然相应的server端也要加-u
    #!/bin/sh
    /jffs/ss/ss-tunnel -c /jffs/ss/ss-redir-config.json  -l 5353 -L 8.8.8.8:53 -f /tmp/ss-tunnel.pid -u
    
    
    # 确保他能运行
    chmod +x /jffs/etc/config/ss-tunnel.fire
    

    你可以这样加一大堆网站进去,也可以只加自己常用的(如果不多,可以在tomato webui里直接加)

    # 从gfwlist得到dnsmasq_list.conf 并放进jffs
    ssh root@router-in-China "mkdir -p /jffs/etc/dnsmasq.d"
    scp dnsmasq_list.conf root@192.168.2.22:/jffs/etc/dnsmasq.d/
    
    vi /etc/dnsmasq.custom
    #其中加入下面的一行
    conf-dir=/jffs/etc/dnsmasq.d
    
    nvram setfile2nvram /etc/dnsmasq.custom
    nvram commit
    

    dnsmasq_list.conf文件格式如下所示

    #使用不受污染干扰的DNS解析该域名 可以将此IP改为自己使用的DNS服务器
    server=/google.com/127.0.0.1#5353
    #将解析出来的IP保存到名为gfwlist的ipset表中
    ipset=/google.com/gfwlist
    

    此外,飞羽博客说他会每周更新dnsmasq_list.conf,自动生成dnsmasq_list.conf 的脚本在这里:https://github.com/cokebar/gfwlist2dnsmasq

    dns和dnsmasq设置

    dnsmasq的设置比如:(测试,只加了几个,lz用不着ls加的那么多网站感觉)

    server=/facebook.com/127.0.0.1#5353
    ipset=/facebook.com/gfwlist
    
    server=/google.com/127.0.0.1#5353
    ipset=/google.com/gfwlist
    
    server=/youtube.com/127.0.0.1#5353
    ipset=/youtube.com/gfwlist
    
    server=/twitter.com/127.0.0.1#5353
    ipset=/twitter.com/gfwlist
    
    server=/dropbox.com/127.0.0.1#5353
    ipset=/dropbox.com/gfwlist
    
    

    iptables设置比如:

    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
    iptables -t nat -N SHADOWSOCKS
    iptables -t nat -A SHADOWSOCKS -d your-server -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
    

    tomato的设置如图所示:

    注:这下面还没写完(未亲自操作验证),由于lz在国内没有一个空闲的路由器用于测试,所以暂时不方便试,希望哪位同学能提供一台tomato路由器供lz远程测试,最好不要是唯一的路由器,不然万一lz设错了你怎么上网?

    希望有同学能贡献一台国内的空闲tomato路由器用于测试,希望是如下架构:(此图是用draw.io在线画的)

    tomato_fq_test

 

lz远程测试了一下,似乎翻不了 ss-tunnel总是timeout,也许可以试试飞羽博客上提到的unbound

lz已亲身远程操作国内的路由器验证,目前依然是可行的

文件下载:(在墙外的dropboxgithub上)

update: lz用travis ci编译了大部分最新版,放在了github,请去这里下载

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

update2: 关于line聊天软件,lz在手机上装了个packet capture,看到line有去连

203.104.160.12:443
203.104.160.31:443
203.104.160.11:443

不知道需要加哪些,所以lz在dnsmasq配置里加了

server=/line.naver.jp/127.0.0.1#5353
ipset=/line.naver.jp/gfwlist 

在防火墙里加了

iptables -t nat -A SHADOWSOCKS -p tcp -d 203.104.160.0/24 -j REDIRECT --to-port 1080

之后似乎可以用line了

update 3:(未测试,因为lz是在国外远程ssh回国内的路由器上测试的,怕万一把国内家里的设置弄乱,找不到会的人修复)
上文中有忽略的一点是,如果国内的路由器需要opkg装东西,意思就是他自身也需要翻墙的时候,需要在firewall里添加如下设置,但是本文讨论的路由器们不存在此问题,因为都是屌丝路由器,根本没空间装opkg.但是记录在这里一下以备参考,(可以用于,当你远程设置国内家里的路由器翻国外的时候,你可以在ssh连接后ping下原本被墙的网站测试,如果不做这一步,路由器自身没翻,是ping不到被墙网站的,你无法判断你的翻墙设置有没有成功,当然你问国内家里使用此路由器上网的人能不能翻也可以)

抄袭cokebar的设置,firewall script里加上

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

然后确保Advanced -> DHCP/DDNS 里开启了 Use internal DNS, 不知道是否 Basic -> Network里的static dns是不是填公用dns,未测试

参考:
搭建智能翻墙路由器
Shadowsocks & ChinaDNS on OpenWRT
从选 VPS 到架设 UDP 转发型 SS 到路由设置
WNDR4300安装Openwrt,使用shadowsocks配置透明代理,使用chinadns+dnscrypt-proxy处理DNS污染
OpenWrt 透明代理配置并解决 Chromecast 的更新问题
Asia Chats: LINE and KakaoTalk Disruptions in China

Advertisements

37 responses to “临时回国的翻墙教程 (把shadowsocks服务端放在国外住处的tomato路由器上)– 简洁整理版

  1. HOUZI 九月 25, 2015 @ 4:54 下午

    为什么不用chnroutes!多直接暴力!哈哈!lz可以尝试一下!

  2. Henry Jiang 十月 20, 2015 @ 4:29 下午

    很高兴能看到这个文章,我的路由器也是RT-N66U,一直在找编译好的SS (因为自己不会编译)。谢谢你提供的编译好的文件,晚上回去就试一试。
    有一个问题,你提供了编译的文件有静态的和动态的,这2个版本有什么区别?我该如何正确的使用合适的版本?

  3. Henry Jiang 十月 22, 2015 @ 8:31 下午

    刷了v132,按照博主提供的步骤下来,还是不能fq。
    dns和dnsmasq设置 是否还有其他的步骤没有贴出来?

  4. Henry Jiang 十月 22, 2015 @ 8:32 下午

    不好意思重复的回复。之前的回复有点不太清楚。

    刷了v132,按照博主提供的步骤下来,还是不能fq。
    到了这里:dns和dnsmasq设置
    后面是否还有其他的步骤?

  5. Jason 十一月 22, 2015 @ 7:23 上午

    楼主能否直接给IPK包啊?
    谢谢

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

      因为磊科q3不能插优盘,flash也很小根本装不了entware,所以没有研究,你自己做一个呗
      update: 没有做的原因是,既然你有entware/optware, ss已经直接在repo里了,直接opkg install就可以了,用不着从我这拿; 如果你flash太小装不了entware,那何须用得上ipk? 综上,你用不着ipk吧

  6. allen 十一月 30, 2015 @ 10:22 下午

    楼主,请教如何配置多用户使用?

    • 一半君 十二月 1, 2015 @ 3:18 上午

      你把密码告诉所有人不就行了,如果想每个人的账号端口不一样, libev版只能开多个进程来多开,因为他设计目的是为了费资源尽量小,https://github.com/shadowsocks/shadowsocks-libev/issues/5 如果你服务器端不是放路由器上或者你路由器比较高级可以用python或者go版

  7. OnionNet 七月 27, 2016 @ 12:05 上午

    我成功连接后内网可以正常访问,但是外网无法连接呢?这是二级路由,DHCP动态IP由主路由分配,内网可以正常连接SS,但是外网直接无法连接IP,怎么回事呢?希望LZ解答,谢谢!

  8. OnionNet 七月 27, 2016 @ 12:13 上午

    已经重启解决,不麻烦楼主回复啦!

  9. zhao (@wyf198251) 八月 8, 2016 @ 7:20 下午

    你好,楼主,我的版本是Tomato DualWAN 15.02.0068 MIPSR2 K26 USB WR-525W专用版
    想搭建个SS服务器,主要是现在免费WIFI太不安全,想用手机端的ss连接家里的网络,没看懂你的教程,需要安装吗?代码复制到哪里?麻烦帮忙指教一下行吗?

  10. zhao (@wyf198251) 十月 23, 2016 @ 10:06 下午

    非常感谢你的耐心回答!现在终于有些明白了,但还是有些地方不解,望能继续给于帮助。
    # 把ss-server拷上去
    scp ss-server root@router-abroad:/jffs/ss

    这段代码里的root@router-abroad必须一样吗?还是要改成自己的路由器名称?
    还有解压后的ss-server文件该放在电脑的哪里?你ssh连接使用的是哪个软件?ss-server是否放在和它同一目录?

    • 一半君 十月 24, 2016 @ 2:05 上午

      router-abroad是你放在国外的路由器的ip或者ddns地址, ss-server随便放哪里都可以,scp是拷贝的命令, 我用的是Linux,ssh命令是自带的,如果用Windows的话你可以装cygwin,此外需要学习下linux基本操作

  11. zhao (@wyf198251) 十月 24, 2016 @ 10:07 上午

    你好!我windows端ssh连接使用的是PuTTY,输入命令后显示如下,是什么问题?
    能否帮帮忙,使用PuTTY连接路由器代码如何一步一步输,我的路由器在国内,内外访问路由器的IP是192.168.3.1

    root@ZRCC-AP:/jffs# scp ss-server 192.168.3.1:/jffs/ss

    Host ‘192.168.3.1’ is not in the trusted hosts file.
    (fingerprint md5 46:d4:a9:4d:1f:79:df:28:3d:ad:7d:38:d1:b1:fd:28)
    Do you want to continue connecting? (y/n) y
    root@192.168.3.1’s password:
    ss-server: No such file or directory

    • 一半君 十月 24, 2016 @ 10:57 上午

      召唤身边认识的会使用linux基本命令的同学来帮你下 似乎更有效率

      • zhao (@wyf198251) 十月 24, 2016 @ 11:38 上午

        认识的人没有会使用linux的,我国外VPS上架设shadowsocks 服务器也是用windows端的PuTTY,直接复制你的命令代码好像并不顺利

      • 一半君 十月 24, 2016 @ 12:18 下午

        你不能完全照搬阿,至少得知道每行是什么意思吧,scp ss-server 192.168.3.1:/jffs/ss 的意思是: 假设你现在位于电脑的某个目录下,此目录中有ss-server文件,用ssh连接到192.168.3.1,并将本机的当前目录下的ss-server文件复制到192.168.3.1的/jffs/ss 目录下, 你用putty连接路由器之后,就已经在路由器的终端里了,再照搬上述命令当然不行了,你应该去google”用putty如何往远端机器上拷文件”

  12. zhao (@wyf198251) 十月 24, 2016 @ 1:43 下午

    非常感谢!又进了一步,现在ss-server文件以及上传到/jffs/ss目录了,现在到
    # 创建自动启动运行script
    vi /jffs/etc/config/ss-redir.fire

    # 文件内容如下 在命令行里加local_port 1080
    #!/bin/sh
    /jffs/ss/ss-redir -c /jffs/ss/ss-redir-config.json -l 1080 -f /tmp/ss-redir.pid
    这里的#!/bin/sh是什么意思?百度过还是不太明白,也要复制进去吗?

    • zhao (@wyf198251) 十月 24, 2016 @ 1:53 下午

      是到这步
      # 创建自动启动运行script
      vi /jffs/etc/config/ss-server.fire

      # 文件内容如下 注意有-u
      #!/bin/sh
      /jffs/ss/ss-server -c /jffs/ss/ss-server-config.json -f /tmp/ss-server.pid -u

      我只要在Tomato上架shadowsocks服务器

  13. zhao (@wyf198251) 十月 24, 2016 @ 1:50 下午

    #!/bin/sh 无法输入
    只复制/jffs/ss/ss-server -c /jffs/ss/ss-server-config.json -f /tmp/ss-server.pid -u
    提示pattern not found

发表评论

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 博主赞过: