Openwrt 上的 Dnsmasq IPSET 真是神器 - V2EX
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 25314 次点击
    这是一个创建于 4132 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我只大概说一下,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: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:5 +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,这样的操作可行吗?
    关于     帮助文档     自助推广系统     博客 &bsp;   API     FAQ     Solana     1410 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 16:55 PVG 00:55 LAX 09:55 JFK 12:55
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86