Openwrt上使用dnsmasq和ipset实现域名分流
目标
部署一台自动代理路由器,实现根据域名来自动设定直连或者代理,而我要做的只是设置PC的默认网关为主路由器(192.168.0.1)还是自动代理路由器(192.168.0.254)。
创建Openwrt虚拟机
系统版本
- 主路由器 (ip:
192.168.0.1) - ESXI 6.0U2
- Openwrt 15.05.1 (ip:
192.168.0.254,gateway:192.168.0.1)
Openwrt虚拟机的配置教程有很多,这里只针对ESXI版Openwrt可能会遇到的问题说明下:
- 在ESXI6上,
openwrt_x86每次启动时会大概率的出现卡死现象,表现为Kernel panic - not syncing: Attempted to kill init。- 解决办法:改用
openwrt_x64后正常。原因未知。
- 解决办法:改用
在ESXI6上,在
openwrt上执行某些命令时,会被强制关机,表现为1来自 promote 的消息: The operation on the file "/vmfs/devices/deltadisks/17ad1ab5-openwrt-15. 05.1-x86-64-combined-ext4-s001.vmdk" failed (Bad address). The file system where disk "/vmfs /devices/deltadisks/17ad1ab5-openwrt-15.05.1-- x86-64-combined-ext4-s001.vmdk" resides is full. Select _Retry to attempt the operation again. Select Cancel to end the session.- 解决办法:在
Vmware Fusion中新建openwrt虚拟机(other/other linux 64, 256MB,虚拟机版本为11),第一次启动后,关机导出为ova,然后再导入到ESXI6中。具体原因未知。
- 解决办法:在
安装软件
|
1
2
3
4
5
6
7
|
opkg update
opkg remove dnsmasq
opkg install dnsmasq-full
opkg install ipset iptables-mod-nat-extra
wget http://x.x.x.x/shadowsocks-libev_2.4.6-1_x86_64.ipk
opkg install shadowsocks-libev_2.4.6-1_x86_64.ipk
|
PS
在这里,安装官方版的shadowsocks,而不是openwrt spec版, 下载地址在这里。
PPS
在这里,如果安装的顺序不同,可能会导致lib的依赖错误(至少在15.05.1上是这样)。使用ldd命令,检查一下shadowsocks的依赖包是否正常。
|
1
|
ldd /usr/bin/ss-redir
|
配置
配置shadowsocks
配置/etc/shadowsocks.json,格式如下:
|
1
2
3
4
5
6
7
|
{
"server": "X.X.X.X",
"server_port": "443",
"password": "password",
"local_port": "1080",
"method": "aes-256-cfb"
}
|
修改/etc/init.d/shadowsocks,设置shadowsocks以Proxy Mode模式启动,同时开启转发DNS请求功能,上游DNS为8.8.8.8:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#!/bin/sh /etc/rc.common
START=95
SERVICE_USE_PID=1
SERVICE_WRITE_PID=1
SERVICE_DAEMONIZE=1
CONFIG=/etc/shadowsocks.json
start() {
#service_start /usr/bin/ss-local -c $CONFIG -b 0.0.0.0
service_start /usr/bin/ss-redir -c $CONFIG -b 0.0.0.0
service_start /usr/bin/ss-tunnel -c $CONFIG -b 0.0.0.0 -l 5353 -L 8.8.8.8:53 -u
}
stop() {
#service_stop /usr/bin/ss-local
service_stop /usr/bin/ss-redir
service_stop /usr/bin/ss-tunnel
}
|
设置shadowsocks开机启动,并手动运行:
|
1
2
|
/etc/init.d/shadowsocks enable
/etc/init.d/shadowsocks start
|
到目前为止,你已经有了一个监听在1080端口的socks代理,和监听在5353端口的不受污染的DNS服务器
配置ipset
进入Luci界面-网络-防火墙-自定义规则,加入以下规则(最后的1080是shadowsocks的本地端口,请酌情修改):
|
1
2
3
4
5
6
|
#创建名为gfwlist,格式为iphash的集合
ipset -N gfwlist iphash
#匹配gfwlist中ip的nat流量均被转发到shadowsocks端口
iptables -t nat -A PREROUTING -p tcp -m set --match-set gfwlist dst -j REDIRECT --to-port 1080
#匹配gfwlist中ip的本机流量均被转发到shadowsocks端口
iptables -t nat -A OUTPUT -p tcp -m set --match-set gfwlist dst -j REDIRECT --to-port 1080
|
配置dnsmasq-full
修改/etc/dnsmasq.conf,在文末加入conf-dir=/etc/dnsmasq.d:
|
1
|
echo 'conf-dir=/etc/dnsmasq.d' >> /etc/dnsmasq.conf
|
新建目录/etc/dnsmasq.d,生成dnsmasq_list.conf 到该目录:
|
1
2
3
4
5
6
|
git clone https://github.com/cokebar/gfwlist2dnsmasq.git
cd gfwlist2dnsmasq
python2 gfwlist2dnsmasq.py
mkdir /etc/dnsmasq.d
cp dnsmasq_list.conf /etc/dnsmasq.d
|
其中,dnsmasq_list.conf的格式为:
|
1
2
3
4
|
#使用不受污染的DNS解析该域名,可以将此IP改为自己使用的DNS服务器
server=/google.com/127.0.0.1#5353
#将解析出来的IP保存到名为gfwlist的ipset表中
ipset=/google.com/gfwlist
|
你可以手动修改这个文件,你也可以使用gfwlist2dnsmasq.py自动生成dnsmasq_list版的gfwlist列表。
重新运行dnsmasq,它将监听在本机53端口上。
|
1
|
/etc/init.d/dnsmasq restart
|
测试
场景一
- PC端的默认网关设置为
192.168.0.1, DNS设置为192.168.0.1- 国内网站访问正常
- Google无法访问
场景二
- PC端的默认网关设置为
192.168.0.254, DNS设置为192.168.0.254- 访问国内网站
- dnsmasq解析该域名,发现该域名不在dnsmasq_list中,使用默认DNS服务器进行解析,正常访问。
- 访问Google
- dnsmasq解析该域名,发现该域名在dnsmasq_list中,使用设置的安全DNS服务器进行解析,并将该IP加至gfwlist集合中,iptables匹配到规则,将流量转发到shadowsocks监听的端口,进行代理访问。
- 访问国内网站
Openwrt上使用dnsmasq和ipset实现域名分流的更多相关文章
- openwrt上wifi探针的实现
openwrt上wifi探针的实现 探针是通过wifi搜集经过这个AP范围的手机的mac地址,没有什么深刻的东西,知乎上关于这个东西讨论的很多,有人觉得很有用,可以做很多增值的应用,有人觉得没啥用,不 ...
- 在OpenWrt上编写自己的硬件操作程序
上一篇文章中有写到如何使用OPENWRT的SDK,这里继续,写怎么在上面开发自己的应用程序. 我欲在OpenWrt上编写一个软件,它能够去读取某个AD芯片的多通道采样值. 在看这篇文章之前请看这官方的 ...
- OpenWrt上搭建纯L2TP服务器[ZT]
转自:http://www.openwrt.pro/post-389.html 纯L2TP(l2tp + ppp,无IPSec) 首先安装xl2tpd软件包 opkg update opkg inst ...
- openwrt上wifi探针的实现----mt7620a+rt2860v2
openwrt上wifi探针的实现----mt7620a+rt2860v2 [摘要:甚么是wifi探针 看到探针,感到很矮小上的模样,实在便是经过wifi汇集经由那个AP局限的脚机的mac地点,出有甚 ...
- 在linux 服务器上用.htaccess文件实现二级域名访问子目录
实现子域名绑定网站子目录的方法有很多,比如可以用js跳转,可以用php实现,可以301跳转等,但最常用的应该是RewriteEngine方式了. 新建一个笔记本命名为.htaccess(在wind ...
- js获取上一页、当前页及域名url方法,JS反回上一页的方法
<html> <head> <title>js获取上一页url,js获取前一页地址,javascripts获取上一页url,javascript获取前一页地址< ...
- 在openwrt上编译最简单的一个ipk包文件
1 什么是opkg Opkg 是一个轻量快速的套件管理系统,目前已成为 Opensource 界嵌入式系统标准.常用于路由.交换机等嵌入式设备中,用来管理软件包的安装升级与下载. opkg updat ...
- js获取上一页、当前页及域名url
一个业务中可能会用到,跳转到另个页面后, 又后退回之前的页面,之前的页面上有个判断提示一定会出 网上搬了下代码 console.log("js获取当前域名"+window.loca ...
- 如何在Openwrt上,针对内核创建自定义Patch?
参考资料: 1.http://wiki.openwrt.org/doc/devel/patches?s[]=quilt --- 官方对于如何打Patch的说明 2.http://blog.csdn ...
随机推荐
- 【编程技巧】NSTimer类的使用
创建一个 Timer + scheduledTimerWithTimeInterval: invocation: repeats: + (NSTimer *)scheduledTimerWithTim ...
- JavaScript学习日志:关于js分号
javascript有自动添加分号的功能,但是不是所有情况都会自动添加,要区分: 1,如果语句独占一行 如果当前行内的语句能够被js正确解析,那么就会在句尾添加一个分号. (如何判断是否正确解析?你在 ...
- IronFort---基于Django和Websocket的堡垒机
WebSSH有很多,基于Django的Web服务也有很多,使用Paramiko在Python中进行SSH访问的就更多了.但是通过gevent将三者结合起来,实现通过浏览器访问的堡垒机就很少见了.本文将 ...
- sudo 无效命令
mac系统中由于不小心修改了/etc/sudoers下的权限为777,故而sudo命令不能使用. 解决办法 1.重新启动mac并且按command+s进入单用户界面 2.此时默认的系统状态是只读状态, ...
- Hystrix-request collapsing(请求合并)
介绍: Hystrix的请求合并就是把重复的请求批量的用一个HystrixCommand命令去执行,以减少通信消耗和线程数的占用.Hystrix的请求合并用到了HystrixCollapser这个抽象 ...
- 序列化和Json
实现了python与python程序之间内存的交互 常用场景: 1 把内存的数据写到磁盘 2 socket只能传字符串,二进制,通过序列化 ============================== ...
- 爬虫_vs_反爬虫
爬虫中有哪些专业术语? 爬虫:自动获取网站数据的程序,关键是批量的获取 反爬虫:使用技术手段防止爬虫程序的方法 误伤:反爬虫技术将普通用户识别为爬虫,效果再好也不能用(禁止ip) 成本:反爬虫需要人力 ...
- C语言学习之递归
学习C语言到递归时,还记得那个用来抛砖引玉的例子: "从前呀,有座山,山里有个老和尚给一个小和尚讲故事,讲的什么故事呢?从前呀,有座山,山里有个老和尚给一个小和尚讲故事,讲的什么故事呢?从前 ...
- Windows--查看使用某端口的进程
场景: 有时候我们希望查找某个端口被那个进程使用,如何操作呢? 比如查找8000端口被按个进程使用? 首先使用netstat -ano |grep 8000查看 13776就是使用的进程ID 然后使用 ...
- 1.Tarball软件make与makefile详解(还需要补充)
*通常自己安装的软件放在 /usr/local/软件名 中,而将源文件放在/usr/local/src *为安装到单独目录的软件之 man page 加入 man path 搜寻: 如果你安装的软 ...