前段时间回国一趟,自己在路由器上搭建了openvpn,想着这样就可以不受GFW影响,顺便还可以访问下内网的NAS。
结果落地国内,VPN完全无法连接。用百度,必应查了好久查不到原因(这里必须吐槽一下,国内的搜索引擎是真的搜不到任何有用的东西)。回新加坡后Google到是因为openvpn在握手阶段使用的是明文,GFW可以精准识别,所以GFW直接在建立连接阶段就介入了,自然无法成功连接。
既然openvpn不行(基本也意味着IPSec等都不行),那就只好看看还有什么别的方法。这一了解才发现,大家为了应付这道不可见的高墙真的是手段百出。协议是一个接一个。有兴趣的可以参考这篇文章:科学上网的主流协议大对比!这里面有你在使用的吗?
扯远了。回归正题。我这里选择的协议是shadowsocks,如果想选择其他协议,可以酌情参考。
硬件要求
- 一个公网IP
- 一个刷了Merlin系统的华硕路由器
我因为有公网IP,所以这里不再赘述DDNS的配置。有需要的朋友可以自行google。
如果是其他品牌的路由器 + openwrt的系统,可以酌情参考本文章。内容大体通用。
前置准备
- 可以ssh登录到路由器
- 参考文章 1: SSHD · RMerl/asuswrt-merlin.ng Wiki · GitHub
- 参考文章 2: ## TO-DO ##
- 路由器已安装entware (ssh登陆后terminal输入
opkg --version
验证)- 参考文章 1: Entware · RMerl/asuswrt-merlin.ng Wiki · GitHub
- 参考文章 2: ## TO-DO ##
这两步是想要在路由器上做任何进阶操作的基础。后面我也会出相应的教程。
安装SS-Server
做完前置准备后,就可以正式开始在路由器上部署shadowsocks了。
首先ssh登录到路由器,之后输入opkg update
来确保opkg的index是最新的。
成功后应该看到类似如上的结果。
之后继续输入 opkg list | grep shadowsocks-libev
,应该会得到
shadowsocks-libev-config – 3.3.5-10a – shadowsocks-libev config scripts
shadowsocks-libev-ss-local – 3.3.5-10a – shadowsocks-libev ss-local
shadowsocks-libev-ss-redir – 3.3.5-10a – shadowsocks-libev ss-redir
shadowsocks-libev-ss-rules – 3.3.5-10a – shadowsocks-libev ss-rules
shadowsocks-libev-ss-server – 3.3.5-10a – shadowsocks-libev ss-server
shadowsocks-libev-ss-tunnel – 3.3.5-10a – shadowsocks-libev ss-tunnel
这一堆的输出。具体版本根据查询的时间可能有所不同,不必在意。这里是shadowsocks的不同组件,大部分和客户端相关。我们这里是搭建shadowsocks的服务器端,所以只需要安装
shadowsocks-libev-ss-server – 3.3.5-10a – shadowsocks-libev ss-server
这一个就好。
输入opkg install shadowsocks-libev-ss-server
,等待安装完成。
安装完成后,输入ss-server -h
,如果看到以下界面,则说明安装成功
配置SS-Server
配置自启动 & config文件位置
cd进入/opt/etc/init.d,这里应该会看到一个文件名为”S22shadowsocks“, 数字22可能会不同,不必在意。
输入vi S22shadowsocks
(替换成你自己看到的文件名) ,进入文本编辑页面。输入“i”开始编辑。在这里需要关注两个变量
- PROCS,注意PROCS后面是否为“ss-server”,如果不是,则改为“ss-server”
- ARGS,这里后面跟的是config存放的位置。如果你不知道写什么,可以写
"-c /opt/etc/shadowsocks/shadowsocks.json"
。注意这里需要同时复制双引号。
修改完成后,输入:wq,保存文件。
配置config文件
根据上一步在ARGS变量设置的config文件位置,创建对应文件。如果使用的是上面提供的位置,则依次输入以下命令
mkdir /opt/etc/shadowsocks && cd /opt/etc/shadowsocks
vi shadowsocks.json
这时进入了config的编辑页面,将下面的配置粘贴进去
{
"server":["::0","0.0.0.0"],
"mode":"tcp_and_udp",
"local_port":1080,
"timeout":86400,
"method":"chacha20-ietf-poly1305",
"server_port":8312,
"password":"xxxxxxxx",
"fast_open":false
}
这里两个地方需要修改
- server_port,修改成你希望使用的端口。如果不知道修改成什么,保持不动
- password,修改为你自己的密码。最好复杂一些。
其他参数可以自行看需修改。完成后“:wq”保存文件。
配置防火墙
cd进入/jffs/scripts。ls查看文件夹下是否存在firewall-start文件。
如果没有,vi firewall-start
创建并编辑文件,粘贴以下内容
#!/bin/sh
iptables -I INPUT -p tcp --dport 8312 -j ACCEPT
iptables -I INPUT -p udp --dport 8312 -j ACCEPT
这里8312替换成上面config文件填入的server-port。
如果有的话,vi firewall-start
编辑文件,将上面后两行(即iptables开头的两行)粘贴到文件的最后。
完成后“:wq”保存并退出。
启动SS-Server
到这里,基础的配置就已经完成了。输入/opt/etc/init.d/S22shadowsocks start
(将S22shadowsocks替换成上面你自己的文件名)启动SS-Server服务。
连接SS-Server
一切顺利的话,你的SS-Server已经搭建好了。接下来就是用客户端来连接服务器。我自己的电脑是Mac,所以这里以Mac端ShadowsocksX-NG举例。
打开软件后会看到上面的界面。这里有几个地方需要填
- Address 填入你自己的公网IP
- Port 填入上面你自己选择的端口。如果上面没有更改端口,则为8312
- Encryption 选择 chacha20-ietf-poly1305(或者上面你自己的选择)
- Password 你的密码
- Remarks 填什么都可以。起一个名字
一切顺利的话,这样就连上你自己搭建的SS-Server了!
定时检查SS-Server进程(Optional)
## TO-DO ##
SS-Server访问内网资源(Optional)
## TO-DO ##
小结
如果遇到什么问题,欢迎留言讨论