一、背景
自从上次写过一篇DLink路由器刷OpenWrt的笔记之后, 到现在已经过去好几个月了。 一直在研究最正确的姿势搭建Shadowsocks, 但过程中一直有问题。
本篇记录搭建过程中踩过的一些坑。
二、任务目标
本次任务的总目标是: 将通过路由器的流量自动分流, 国内的直连目标服务器, 国外的通过敌国的Shadowsocks服务器转发。
详细的操作有如下几步:
1. 需要本地建立转发代理服务器将出国流量通过该服务转发; 2. 由于存在DNS污染,需要提供稳定的线路向Google的DNS服务器查询,本地转发53端口流量; 3. 国内流量需要能无缝切换,且不通过Google DNS查询(太慢);
三、相关资料
现有一份比较周全的文档在这里:
http://ift.tt/1u5LlQy
四、详细步骤与坑
4.1 服务器端搭建
这里博主踩了很久的坑, 由于对Shadowsocks不太熟悉, 而且个人比较偏爱Python, 所以一直使用Python版本搭建服务器端, 导致后面的DNS转发一直出问题。
经过探索发现目前为止貌似只有libev版的Shadowsocks支持UDP转发, 可用于搭建DNS转发线路。
关于libev版的安装, 个人推荐直接参考GitHub上的项目README, 比较直观。
最粗暴的安装方式是先克隆仓库到服务器本地, 然后跑这个:
sudo apt-get install build-essential autoconf libtool libssl-dev ./configure && make sudo make install
之后随便在什么地方都可以直接启动服务。
关于UDP转发的另一个坑是, 需要服务器启动的时候加入一个启动参数 -u , 官方的说法是启动udprelay模式, 这样服务器才会转发UDP请求。
4.2 路由器客户端的部署
安装的步骤直接参考教程基本可以搞定, 分为两个大步骤, 首先是客户端的安装, 直接下载并搞进路由器里用dpkg安装即可; 其次是配置自动切换, 国内流量直连, 国外流量走代理。
很多时候由于网络的原因会导致各种下载失败, 推荐直接在本地用各种办法把文件搞下来之后再scp传进路由器里。
需要注意的主要是服务器的ip, 各种端口的设置。
常用的几个配置项如下:
0. 敌国服务器Shadowsocks配置(写到config.json里由本地Shadowsocks读取即可) 1. 敌国服务器的ip地址:需要在iptables转发的设置里配置为直连 2. 路由器本地Shadowsocks监听端口(UDP转发的需要在dnsmasq里配置,TCP的需要在iptables转发里设置)
4.3 步骤测试
很多时候有各种各样脑残的故障, 通过一些特定的办法可以快速找到问题的原因。
4.3.1 测试基本的网络连通性
简单,直接用各种终端连接路由器, 测试百度是否能够打开即可。
4.3.2 测试tcp转发是否正常
由于是智能转发, 因此可以通过访问国外网站测试连通性。
这里需要注意的是, 应该避免由于UDP转发失败导致的网络断开, 如果百度可以访问但所有国外网站均无法打开, 可以通过如下步骤测试tcp是否正常:
1. 修改路由器中/etc/dnsmasq.d/gfwlist.conf,将查询修改为114.114.114.114,确保所有DNS请求正常(不保证防污染) 2. 重启dnsmasq让配置生效 3. 终端通过路由器访问国外未被DNS污染的网站,例如http://lifehacker.com/ 4. 如果访问成功说明tcp转发没有问题,反之则需要检查Shadowsocks链路是否故障
4.3.3 测试udp转发是否正常
如果网络通讯正常, 且去掉UDP转发的情况下一般的国外网站可以访问, 则问题归结为UDP转发失败。
UDP转发依赖于服务器的udprelay, 因此需要注意自建的服务器是否使用支持UDP转发的版本并开启udprelay(参考4.1节内容)。 如果是购买的Shadowsocks服务则需要确认是否支持udp转发。
排除服务器故障之后, 本地的UDP转发需要检查端口设置是否正确, 并通过进程查看ss-tunnel是否启动。
重新修改/etc/dnsmasq.d/gfwlist.conf恢复为本地UDP转发, 配置正确的端口设置。
通过路由器直接nslookup检查twitter的DNS解析是否成功, 如果成功说明DNS转发正常, 否则说明还有问题。
五、总结
本篇主要记录在OpenWrt上配置Shadowsocks的流程及各种常见问题, 以及一些简单的问题定位方法。
基本的流程为:
服务器搭建 本地ss搭建 配置本地ss智能转发 步骤故障排除
via 细节的力量 http://ift.tt/1hjscKC
No comments:
Post a Comment