临时回国的翻墙教程 (把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 
} 
# lz目前测试了最新的ss 3.3.1 貌似需要去掉local_开头的两行设置,不然会出现错误
# ERROR: connect: Invalid argument

# 如果不是很确定配置文件写的对不对,可以先前台运行验证一下,注意需要-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

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

手机翻墙

有现成的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在线画的)

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

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

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

    1. 动态的小,100k,静态的大很多,静态的是如果你用动态的运行不了,说少symbol什么的时候,此时你可以试试静态的。假如你也是和我一样用tomato shibby v131的话,你用动态的就行了

      1. 谢谢你这么快的回复,我会先用动态的试试。
        我现在是Tomato Shibby V130,尝试在“”数位天堂“”下载V131版本,但是由于刚刚注册,等级不够,不知道你是否方便提供V131的链接?

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

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

    1. 我发现我没转贴完,而且没有自己试过 因为没有国内的机器 你连到国外的ss-server了么?先找个windows客户端试试看,如果确实能翻出去了再来搞“自动翻墙路由器”也不迟。
      update: 最近尝试过,已测试可行

      1. 我是自己买的vps,手机和电脑一直在用。
        刚刚看了路由器的log,发现出现的问题如下:
        Oct 22 14:42:03 unknown user.info /jffs/ss/ss-redir[1006]: initialize ciphers… aes-256-cfb
        Oct 22 14:42:03 unknown user.err /jffs/ss/ss-redir[1006]: bind: Address already in use
        Oct 22 14:42:03 unknown user.err /jffs/ss/ss-redir[1006]: Could not bind
        Oct 22 14:42:03 unknown user.err /jffs/ss/ss-redir[1006]: bind() error

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

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

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

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

    1. 你的压缩包里有6个文件,是否只要ss-server有用?其他5个没用?还有,如果路由器获取的是动态IP,那配置文件里的server ip能否直接用动态域名代替?

      1. 如果你想把路由器当server,是的,只需要那一个文件, server端的配置文件里的server ip 应该是 0.0.0.0吧, 客户端的server ip当然是可以填动态域名的

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

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

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

  6. 你好!我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

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

      2. 你不能完全照搬阿,至少得知道每行是什么意思吧,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如何往远端机器上拷文件”

  7. 非常感谢!又进了一步,现在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是什么意思?百度过还是不太明白,也要复制进去吗?

    1. 是到这步
      # 创建自动启动运行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服务器

  8. 楼主你好,我在国外家里台式机ubuntu server 上装了shadowsocks server,想着长期开机回国临时用一下。 供应商路由器需要有什么配置么?自己测试似乎连不上,也不知道什么原因。

  9. 之前尝试很多相关教程,很多都不靠谱,而且f.cp46.cn/tfr2计数方式一直没摸透,这个播放量计数真的很诡异.今天刚找到个新的工具,比较干净

zhao (@wyf198251) 发表评论 取消回复