路由器自动出国

RaspberryPi 2016-11-20

Depends

感谢@aa65535为出国事业所做的努力, 几乎是一站式包了所有:
https://github.com/aa65535/openwrt-dist-luci #luci配置界面
https://github.com/shadowsocks/openwrt-shadowsocks #出国用的主力代理
https://github.com/aa65535/openwrt-redsocks2 #自动判断是否需要代理
https://github.com/aa65535/openwrt-chinadns #DNS代理及自带List
https://github.com/aa65535/openwrt-dns-forwarder #将UDP代理转发为TCP代理

安装

所需要的包我都为树莓派编译了一份, 地址是:
http://raspberrypi.slkun.me/mirror/LEDE/20161119/usr/
全部使用opkg安装即可, 所需的依赖在默认的软件源里都有~

配置

  1. 在影梭的服务器管理里填上你的服务器
  2. 在影梭的一般设置里面, 打开Sock5代理和端口转发, 服务器选择你刚刚填的
  3. 将端口转发的本地端口改为5151A, 目标地址改为国外DNS, 比如8.8.4.4:53.
  4. 在影梭的访问控制下, 被忽略IP列表选择ChinaDNS路由表, 内网区域勾上br-lan
  5. 启用Redsock2, 等待超时改为6

这样路由器就可以自动识别类型并出国了√
不过为了正确的获得DNS, 可以进行下面的配置:

  1. 在网络-DHCP/DNS下, 一般设置-DNS转发填入127.0.0.1#5353
  2. 在网络-DHCP/DNS下, HOSTS和解析文件下忽略解析文件打勾
  3. 启用ChinaDNS, 并把上游服务器改为: 114.114.114.114,127.0.0.1:5300,127.0.0.1:5151
  4. 启用DNS转发, 监听端口5300, 上游DNS改为国外DNS

这样就搞定了√
首先客户端向路由器的dnsmasq发送DNS请求
dnsmasq将DNS请求转发给ChinaDNS
ChinaDNS再默认去访问国内的DNS服务器114.114.114.114
ChinaDNS负责判断该返回结果是否正确, 如果不正确
则通过DNS转发采用tcp方式向国外DNS发出请求, 如果依然不正确
则通过SS代理, 向国外DNS发出请求, 直到获得正确的DNS结果为止╮(╯▽╰)╭

更新 - DNS的更好解决方案

经过测试, 在我的网络环境下, 通过SS-tunnel无法走UDP的DNS查询, 但是能够走TCP的DNS查询.
DNS-Forwarder固然能够将UDP的DNS请求转发为TCP请求, 但是并不能指定上级服务器的端口.
所以, 我Fork了原项目, 稍微修改了一下可以通过配置文件制定上级服务器的端口了.
Fork的项目地址为:
openwrt-dns-forwarder
hev-dns-forwarder
同时向原项目提交了pull request申请, 希望能够通过.
镜像源的预编译文件也已经更新.

配置

调整ChinaDNS的上游服务器为114.114.114.114,127.0.0.1#5300,208.67.222.222
调整DNSForward的上游DNS为127.0.0.1:5151.
调整Shadowsocks的端口转发为8.8.4.4:53, 本地端口为5151.

智能调整DNSMASQ

效果:
国内网站走国内DNS, 比如114.114.114.114
国外已知被墙网站走国外DNS, 即通过DNSForward转发为TCP走SS-Tunnel.
其他的网站交给ChinaDNS再做判断.

配置

将dnsmasq更换为full版

opkg remove dnsmasq
opkg install dnsmasq-full
echo "conf-dir=/etc/dnsmasq.d" >> /etc/dnsmasq.conf
mkdir -p /etc/dnsmasq.d

自动更新脚本

#!/bin/ash

url=http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest
url2=https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf

## Backup
gzip -f /etc/chinadns_chnroute.txt
tar -cvf /etc/dnsmasq.d.tar /etc/dnsmasq.d/

# chnroute
wget -O- $url | awk -F\| '/CN\|ipv4/ { printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > /etc/chinadns_chnroute.txt
# chnroute_dnsmasq
wget -O- $url2 > /etc/dnsmasq.d/accelerated-domains.china.conf
# gfwlist
python /etc/script/gfwlist2dnsmasq.py > /tmp/gfw2dns.log
mv foreign_list.conf /etc/dnsmasq.d/

/etc/script/gfwlist2dnsmasq.py文件在:
https://github.com/cokebar/gfwlist2dnsmasq
选择gfwlist2dnsmasq_noipset.py版的, 修改一下名字.


本文由 SLKun 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论