V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
OpenWrt 是一个专门面向嵌入式设备的 Linux 发行版。你可以将 OpenWrt 支持的型号的嵌入式设备,比如各种路由器上的系统,换成一个有更多可能性可以折腾的 Linux 系统。
OpenWrt 官方网站
leavic
V2EX  ›  OpenWrt

Openwrt 上的 Dnsmasq IPSET 真是神器

  •  
  •   leavic · 2014-06-21 19:49:16 +08:00 · 24467 次点击
    这是一个创建于 3805 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我只大概说一下,OpenWRT上从2.66版开始的Dnsmasq已经支持IPSET了,不过需要自己改一下Makefile重新编译.
    所以,Dnsmasq.conf里可以把XXX域名的解析结果全部导入一个IPSET,然后通过防火墙规则,可以把IPSET里的所有IP转发到VPN网关上,配合上GFWlist,聪明的你应该懂了.
    之前只用过AutoddVPN,IPSET其实都不是太懂,不过折腾了一天已经成功编译好dnsmasq并且在两台路由上跑起来了,真是目前我所知道最好的翻墙方案了,维护难度几乎为0.

    参考这三个链接:
    https://code.google.com/p/autovpn-for-openwrt/wiki/Dnsmasq_Ipset
    http://samsonly.us/?p=85
    https://sorz.org/p/openwrt-outwall/
    第 1 条附言  ·  2014-07-04 19:10:09 +08:00
    其实不需要自己重新编译,OpenWRT官方是有提供Full版本的Dnsmasq的,那个版本就包含了IPSET和DNSSEC,用那个版本就行了.
    60 条回复    2015-04-28 12:08:17 +08:00
    LazyZhu
        1
    LazyZhu  
       2014-06-21 20:09:25 +08:00
    利用Dnsmasq的server和ipset吧,关键能否把vpn替换成其他类型的代理,譬如shadowsocks?
    ipset -N shadowsocks iphash
    iptables -t mangle -A PREROUTING -m set --match-set shadowsocks dst -j MARK --set-mark 1
    ip rule add fwmark 1 table 1
    然后创建一个只走shadowsocks的路由表
    Nin
        2
    Nin  
       2014-06-21 20:12:23 +08:00 via Android
    方法是好,只是略折腾
    cj1324
        3
    cj1324  
       2014-06-21 21:35:57 +08:00
    顶 改良一下配合ss不错。
    lj0014
        4
    lj0014  
       2014-06-21 21:42:30 +08:00
    @LazyZhu
    @cj1324
    有折腾出配合ss的方案吗?
    cj1324
        5
    cj1324  
       2014-06-21 21:56:47 +08:00
    @lj0014
    需要实践来证明。 开始改脚本重新编译刷openwrt 。
    leavic
        6
    leavic  
    OP
       2014-06-21 22:06:21 +08:00   ❤️ 2
    @cj1324 我这里有编译好的适用于ar71xx芯片的2.71版的开了IPSET的dnsmasq文件,不要浪费做重复的工作了:
    http://www.lifetyper.com/?wpdmact=process&did=OS5ob3RsaW5r
    mortal
        7
    mortal  
       2014-06-21 22:11:27 +08:00
    顶,希望能有更加简易的方案…
    binux
        8
    binux  
       2014-06-21 22:12:48 +08:00
    其实没有也可以。。打开 dnsmasq 的日志就可以了。。
    http://blog.binux.me/2014/01/add-blocked-ip-to-route/
    cj1324
        9
    cj1324  
       2014-06-21 22:15:47 +08:00
    @leavic
    你这个只是编译好了dnsmasq吧。
    还需要 一系列脚本把这个流程串起来。
    达到刷机直接可用的地步。 《工程化!》
    leavic
        10
    leavic  
    OP
       2014-06-21 22:19:43 +08:00
    @cj1324 从OpenWRT官方下载image builder,用这个ipk替换掉官方的对应的ipk,然后你把脚本作为files打包进image就可以了,后面不需要编译过程.
    脚本总共就三条命令,我折腾一天就是为了编译这个dnsmasq,后面都很快.
    cj1324
        11
    cj1324  
       2014-06-21 22:23:43 +08:00
    @leavic 能用 -》 好用 -》 不用 (嘿嘿)
    leavic
        12
    leavic  
    OP
       2014-06-21 22:28:09 +08:00
    @binux 嗯,你这个和我之前写过一个给autoddvpn维护route表的脚本思路差不多,不过这种方法的问题也很明显:
    一个是你自己都提到的第一次访问时的问题;
    还有就是有些网站的IP解析变化速度快得惊人,dropbox和instagram这种放在amazonaws上的就是这样,我试过隔几秒去nslookup一次一个域名,结果连续给我返回了N个不同的IP.
    而IPSET则完全没有这个问题,整个过程都是即时生效的,所以即时解析出不同的结果也不影响工作.
    leavic
        13
    leavic  
    OP
       2014-06-21 22:30:44 +08:00
    @cj1324 这个方案就是部署起来比autoddvpn门槛略高,所以基本没法普及,要做也只能像你说的针对路由去做打包好的固件,我现在也是在WNDR3800和TL-WR720n上做了打包了全部的脚本和配置文件的固件刷进去,就算重置路由也是直接翻墙.
    cj1324
        14
    cj1324  
       2014-06-21 22:40:21 +08:00
    @leavic 为什么没办法普及? 没办法脚本自动化? 到最后不就是转换成iptables 脚本吗? 把ss的package加一些依赖 改进一下启动脚本不就好了?
    我之前的改进 https://github.com/cj1324/shadowsocks-libev/tree/master/openwrt
    leavic
        15
    leavic  
    OP
       2014-06-21 22:46:25 +08:00
    @cj1324 我指的是编译dnsmasq这块没法普及,不可能要求所有人都去自己编译package然后定制固件,但是对码农来说,这个没有难度,三条命令的脚本都搞不定就该改行了.
    cj1324
        16
    cj1324  
       2014-06-21 22:53:27 +08:00
    @leavic 哦 我现在目标只是不在重复自己。 至于普及普通用户最多只能做到提供功能健全的ipk包。但是前提还要有CPU平台一致openwrt系统 ...
    LazyZhu
        17
    LazyZhu  
       2014-06-22 01:07:39 +08:00
    用shadowsocks替代vpn是可行的, 就是不知道效率如何

    ss-tunnel 把dns请求转发给shadowsocks
    tun2socks + ss-local 把数据请求转发给shadowsocks

    dnsmasq(server=/google.com/127.0.0.1#5053) -> ss-tunnel(-b 127.0.0.1 -l 5053 -L 8.8.8.8:53) -> ss-server
    dnsmasq(ipset=/google.com/tun2socks) -> tun2socks(--socks-server-addr 127.0.0.1:1080) -> ss-local(-l 1080) -> ss-server
    shierji
        18
    shierji  
       2014-06-22 23:33:46 +08:00
    @cj1324 期待。哈哈
    shierji
        19
    shierji  
       2014-06-22 23:38:38 +08:00
    如果我没理解错的话。貌似整合shadowsocks并不麻烦。。。。
    lj0014
        20
    lj0014  
       2014-06-28 23:10:10 +08:00
    好像确实不麻烦,试了下似乎可行
    ipset -N letitgo iphash
    iptables -t nat -A PREROUTING -p tcp -m set --match-set letitgo dst -j REDIRECT --to-port 1080
    #1080端口是ss-redir
    @shierji
    @LazyZhu
    diymusic
        21
    diymusic  
       2014-06-29 19:31:59 +08:00
    多谢 @lj0014 @LazyZhu 成功打造shadowsocks/ipset/dnsmasq/pdnsd自动翻墙器,用了 @leavic 的dnsmasq ipk。耶!
    cj1324
        22
    cj1324  
       2014-06-29 20:43:13 +08:00
    @shierji
    同一原理的实现。
    openwrt 的feed https://github.com/cj1324/hc_openwrt_packages

    8M 720n的固件包含ipk下载 http://goo.gl/052PT7

    固件特点
    1. dnsmasq+ipset + ssredir完整的服务启动脚本。
    2. 没开80 ,首次通过23端口管理配好后ssh
    3. 刷入开机可用~
    shierji
        23
    shierji  
       2014-06-30 23:28:45 +08:00
    我今天又一次认识到DNS查询是UDP包。。。囧
    难道果然需要重新编译 dnsmasq么
    est
        24
    est  
       2014-07-04 20:31:26 +08:00 via Android
    pac实现完全相同功能!
    JoeyChan
        25
    JoeyChan  
       2014-07-04 20:55:41 +08:00
    好像很复杂的样子,如果根据gfwlist来判断的话还有很多遗漏的域名,我感觉还是用白名单比较舒服,国内走本地,其他走socks5,这样100%不会受到墙的干扰,而且一定程度上可以加速一些国外网站的访问,当然你自己的shadowsocks速度要给力才行。我说说我的做法:
    1、shadowsocks,用ss-redir运行,得到一个透明代理。
    2、chnroute整理国内ip段出来,通过iptables创建规则,默认流量走ss透明代理,国内ip段则走本地。整理出来大概将近4000条防火墙规则,我用openwrt执行的话大概需要三四分钟,也就是开机加载时间比较久,路由器不重启的话基本没什么影响。
    3、dns污染问题,实际上我觉得这个老方法更有效
    https://code.google.com/p/openwrt-gfw/wiki/AntiDNSPoisoning
    用这个方法你会得到大概十几二十条iptables规则,加上这些规则基本不会受到污染,再配合dnsmasq把一些域名受到严重污染的域名通过8.8.8.8或者其他dns来解析,最重要的一点,不影响一些网站的本地cdn加速而且不受污染。
    szpunk
        26
    szpunk  
       2014-07-05 12:43:05 +08:00
    @JoeyChan AntiDNSPoisoning 的方法,这几十条 iptables 规则会严重影响正常 DNS的查询速度,有点得不偿失。
    leavic
        27
    leavic  
    OP
       2014-07-05 13:15:37 +08:00
    @szpunk 事实上,FILTER表的过滤效率是高得惊人的,你根本不会察觉到有什么速度上的问题,更谈不上什么严重影响DNS查询速度.
    shierji
        28
    shierji  
       2014-07-05 18:42:30 +08:00
    等我写个文章吧。这种其实很合适用的网站比较少的。。比如我这样的人。。。很智能的说。也。。。满简单。。。
    jmhglvip
        29
    jmhglvip  
       2014-07-08 08:57:24 +08:00
    @cj1324 能否编译4M的720固件?顺求47XX的ipk !
    cj1324
        30
    cj1324  
       2014-07-08 10:38:54 +08:00   ❤️ 1
    @jmhglvip 可以接受没有LuCI? (web界面管理) 4M 真心有点挤,我可以代为编译,列出你必须的特性。
    声明刷机有风险:最好需要会一些uboot修砖。
    jmhglvip
        31
    jmhglvip  
       2014-07-08 10:57:05 +08:00
    @cj1324 谢谢你的答复!可以接受无luci,平时在外地,上网中继一下,都是手机上网,只需要手机能爬墙就行,ss是自己买的一年账号。然后能否加上3G功能,在户外用3g卡。我的uboot是刷不死的。http://www.right.com.cn/forum/thread-136444-1-1.html720n专用v3板的。
    jmhglvip
        32
    jmhglvip  
       2014-07-08 11:00:06 +08:00
    @cj1324 现在刷的是leavic的4m720nvpn版本的,看yb有点卡,不知道ss是否好点?再次感谢!
    jmhglvip
        33
    jmhglvip  
       2014-07-08 11:02:08 +08:00
    @cj1324 要是大哥能编译个47xx的就好了,家里的主路由是asus rtn16的,16mflash,回到家也可以无忧爬墙哦!
    cj1324
        34
    cj1324  
       2014-07-08 11:34:45 +08:00
    @jmhglvip BCM47xx芯片 我并没有设备。我可以带为编译。但是没办法测试固件。所以风险更大。。
    我的主路由是 NETGEAR WNDR3700v4 也是ar的芯片。
    jmhglvip
        35
    jmhglvip  
       2014-07-08 11:45:35 +08:00
    @cj1324 大大先编译吧,n16也是刷不死的,我来测试,没问题!其实我上网的要求很简单,无缝爬墙看youtube就行。偶尔twitter,facebook.家里人看看优酷,电视盒子。再次感谢!
    cj1324
        36
    cj1324  
       2014-07-08 11:46:13 +08:00
    @jmhglvip Hangouts上面聊吧。 chen1324[at]gmail
    jmhglvip
        37
    jmhglvip  
       2014-07-08 11:51:47 +08:00
    @cj1324 好的
    leavic
        38
    leavic  
    OP
       2014-07-08 13:56:29 +08:00   ❤️ 1
    @jmhglvip 不需要自己编译,官方提供了dnsmasq-full,替换掉默认的dnsmasq就可以了.
    shierji
        39
    shierji  
       2014-07-12 21:34:27 +08:00
    我发现。由于有客户端异步DNS等问题。路由器上解析得到存入ipset的地址不一定跟客户端上得到的地址一样。造成的结果就是对某些拥有多个IP的网站来说,首次开启的时候很有可能因为对应的IP没有被路由到服务器而无法访问。我还是用以前的方式好了。
    leavic
        40
    leavic  
    OP
       2014-07-12 21:56:27 +08:00
    @shierji 这是你Dnamasq配置方式的问题,DNS解析应该完全交给路由器进行,客户端不应该指定任何DNS,设置成自动获取就行.所有的解析结果由路由返回,这也是Dnsmasq中DHCP通告DNS部分的默认设定.
    ShadyK
        41
    ShadyK  
       2014-08-02 13:08:40 +08:00
    @jmhglvip
    @cj1324
    请问两位大哥有编译出asuswrt merlin entware下可用的dnsmasq ipset嘛?
    我业余爱好者,基本上从0开始学编译,搞不定啊。
    jmhglvip
        42
    jmhglvip  
       2014-08-03 16:08:20 +08:00
    @ShadyK 呵呵,我也是个小白。只会刷固件而已。你找@CJ1324大大吧!
    jmhglvip
        43
    jmhglvip  
       2014-08-03 16:10:01 +08:00
    @ShadyK 找到了梅林版用的chinadns:https://www.v2ex.com/t/124550#reply76
    cj1324
        44
    cj1324  
       2014-08-04 11:14:01 +08:00
    @ShadyK 如果你只是需要dnsmasq ipset opkg包 给我你的机器型号或CPU型号。 另外没实际设备测试过,不保证可用。
    ShadyK
        45
    ShadyK  
       2014-08-04 12:58:26 +08:00
    @cj1324 我推上问了下merlin作者能不能集成dnsmasq ipset,他说不行,too much denpendcies,它的fw还不行,你看是否能帮我编译一个entware下可用的
    ipset-dns
    http://git.zx2c4.com/ipset-dns/about/

    asus ac66u,bcm4706的U
    麻烦了,非常感谢
    cj1324
        46
    cj1324  
       2014-08-04 13:36:42 +08:00
    @ShadyK ASUSWRT 兼容OpenWrt吗? 没接触过。。
    ShadyK
        47
    ShadyK  
       2014-08-04 19:34:47 +08:00
    @cj1324 asuswrt和tomato、dd现在都在用一种叫做entware的套件,比optware里的套件更新快,维护勤,你有兴趣可以看下
    https://github.com/Entware/entware
    newbie666
        48
    newbie666  
       2014-08-29 07:45:19 +08:00   ❤️ 1
    我有一个新的想法:
    先设置好策略路由,对打上标记的数据包走vpn。
    再写一个linux的内核模块,然后监听所有到80端口的syn请求,凡是1秒内没有收到syn-ack数据包的都认为是被防火墙block 的连接,针对这个连接,伪造一个syn-ack给客户端,让浏览器以为连接到服务器成功。再伪造一个syn给web服务器,给这个syn包打上标记,让他走vpn出去。
    这样就搭了个桥,双方都会认为连接成功了,再把以后后续的数据包都打上标记,全部都走vpn出去。
    最后再把这个ip加入列表内,以后凡是这个IP都走vpn。
    感觉这个办法应该可行,不再需要考虑什么域名,只要是被block的站全部都可以自动连通。
    但缺点第一次连接可能会是速度较慢,因为需要等1秒后再启用这个机制。
    chijiao
        49
    chijiao  
       2014-09-01 23:20:48 +08:00
    @newbie666 如果是reset的怎么办?
    chijiao
        50
    chijiao  
       2014-09-01 23:22:48 +08:00
    感觉还是太复杂了,本人用的白名单,china top 500 的域名做一个白名单,凡是不是白名单内的域名,用第三方的dns服务器解析, top500 内的,用路由器获取的dns。 这样可以保证国内网站的cdn能工作。 然后在iptables 开启geo ip, 对于国外的IP,统统走代理。 这样基本上不用后期什么维护了。
    jielee
        51
    jielee  
       2014-09-02 22:02:00 +08:00
    我自己编译的固件ipset怎么运行不了?
    root@OpenWrt:~# ipset list
    ipset v6.20.1: Cannot open session to kernel.
    logtee
        52
    logtee  
       2014-11-02 23:34:34 +08:00
    @jielee 遇到相同问题,请问有解决办法吗?
    jielee
        53
    jielee  
       2014-11-03 10:23:54 +08:00
    @logtee 重新编译固件,包含了ipset就可以了
    buddha
        54
    buddha  
       2014-12-02 06:35:29 +08:00
    对编译一窍不通, 有没有高手能帮忙给一个能在R6300v2上的DDWRT下能用的包含ipset功能的dnsmasq ?
    xiaofami
        55
    xiaofami  
       2014-12-03 13:56:35 +08:00
    @lj0014 你好,我参照您的方法,在路由器上的 /etc/rc.local中,添加

    ipset -N Shadowsocks iphash

    iptables -t nat -A PREROUTING -p tcp -m set --match-set Shadowsocks dst -j REDIRECT --to-port 1081

    结合dnsmasq的ipset使用,效果很好。但是遇到一个问题:Shadowsocks服务器关闭后,本地也出现了问题。具体表现在除了dnsmasq.conf中自行解析的域名,其他域名均nslookup失败,打不开网页。我在删除

    ipset -N Shadowsocks iphash

    iptables -t nat -A PREROUTING -p tcp -m set --match-set Shadowsocks dst -j REDIRECT --to-port 1081

    后重启路由器,问题解决。但是我不清楚问题出在哪里,有更好的解决办法吗?
    iMax
        56
    iMax  
       2014-12-21 21:58:24 +08:00
    @leavic 有没有最新的刷入即用的固件啊?我的是WNDR3800,对于菜鸟来说折腾起来很费时间,想偷个懒直接用上就好。我没VPS,但是SS和VPN账号都有。谢谢先
    msdindin
        57
    msdindin  
       2015-01-15 12:18:19 +08:00
    都是大神啊,我就想在AC68U上实现SS,但是俺是一个小白,有没有什么适合我的教程呢?
    xmvagrant
        58
    xmvagrant  
       2015-02-04 17:44:40 +08:00
    @cj1324
    @leavic 我的路由器是Buffalo WZR-HP-G300NH2,刷的是Attitude Adjustment 12.09 版本的OpenWrt,Kernel Version是3.3.8,安装dnsmasq-full时使用 http://downloads.openwrt.org/snapshots/trunk/ar71xx/generic/packages/base/dnsmasq-full_2.72-4_ar71xx.ipk 这里的版本,装好后运行/etc/init.d/dnsmasq start无报错,但是dnsmasq进程未能启动,试了 https://github.com/aa65535/openwrt-dnsmasq 这里预编译好的版本也一样情况,是不是我的OpenWrt版本太老了dnsmasq-full不支持,请大神帮我分析下是什么情况,谢谢!
    pwcpp
        59
    pwcpp  
       2015-03-08 14:40:42 +08:00
    AA 12.09官方源里没有dnsmasq-full这个软件包,只有dnsmasq 2.66,请问该怎么办?
    arfaWong
        60
    arfaWong  
       2015-04-28 12:08:17 +08:00
    @leavic 我配置防火墙规则通过ipset再转发到shadowsocks的1080端口。DHCP/DNS的DNS转发到ChinaDNS,这样的操作可行吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5353 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 08:45 · PVG 16:45 · LAX 00:45 · JFK 03:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.