V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
leavic
V2EX  ›  DNS

如何屏蔽 DNS Local Cache 的返回结果?

  •  
  •   leavic · 2014-06-30 20:27:50 +08:00 · 4737 次点击
    这是一个创建于 3799 天前的主题,其中的信息可能已经有所发展或是发生改变。
    前情提要:
    参考这个帖子的内容:
    http://www.v2ex.com/t/118885#reply22

    我的做法是利用路由器上的iptables FILTER表,配合m32模块,自动丢弃DNS查询结果中返回的污染IP,保证DNS的干净.
    命令:
    iptables -t mangle -A PREROUTING -m set --match-set vpn dst -j MARK --set-mark 1
    iptables -I INPUT -p udp -m udp --sport 53 -m u32 --u32 "0&0x0F000000=0x05000000 && 22&0xFFFF@16=0x4A7D7F66,0x4A7D9B66,0x4A7D2766,0x4A7D2771,0xBDA31105,0xD155E58A,0xF9812E30,0x80797E8B,0x9F6A794B,0xA9840D67" -j DROP
    iptables -I INPUT -p udp -m udp --sport 53 -m u32 --u32 "0&0x0F000000=0x05000000 && 22&0xFFFF@16=0xC043C606,0xCA6A0102,0xCAB50755,0xCBA1E6AB,0xCB620741,0xCF0C5862,0xD0381F2B,0xD1913632,0xD1DC1EAE,0xD1244921" -j DROP
    iptables -I INPUT -p udp -m udp --sport 53 -m u32 --u32 "0&0x0F000000=0x05000000 && 22&0xFFFF@16=0xD35E4293,0xD5A9FB23,0xD8DDBCB6,0xD8EAB30D,0xF3B9BB27,0x253D369E,0x042442B2,0x2E52AE44,0x3B1803AD,0x402158A1" -j DROP
    iptables -I INPUT -p udp -m udp --sport 53 -m u32 --u32 "0&0x0F000000=0x05000000 && 22&0xFFFF@16=0x4021632F,0x4042A3FB,0x4168CAFC,0x41A0DB71,0x422DFCED,0x480ECD68,0x480ECD63,0x4E10310F,0x0807C62D,0x5D2E0859" -j DROP

    问题:
    在使用114,阿里云这些DNS的时候都很正常,污染结果会被丢弃,但下面这种情况好像就挡不住.
    A(一级路由,假定默认的通告DNS是123.123.123.123)==>B(我的路由)==>C(我的设备)

    在B或者C上用A上的默认DNS查询,则所有污染的结果都可以无障碍的进来.但是本地抓包看起来和用114这些DNS查询的结果是一样的,实在搞不清楚为什么这个污染的解析结果没有被丢弃.

    我只能猜测是:
    当用A上的默认DNS查询时,其实没有真正的访问DNS,而是直接从A路由的缓存上读取了数据,而这个数据回传过程可能不是走的UDP 53端口,所以防火墙规则无效.

    那么,要如何解决这个问题呢?是否可以绕过本地的DNS缓存,或者针对上级路由返回的DNS缓存应该如何过滤?
    7 条回复    2014-07-03 16:52:33 +08:00
    LazyZhu
        1
    LazyZhu  
       2014-06-30 21:05:17 +08:00   ❤️ 1
    主要是浏览器和系统的DNS缓存吧,很麻烦哦
    leavic
        2
    leavic  
    OP
       2014-06-30 21:43:45 +08:00
    @LazyZhu 我是在路由器上查询的啊....
    RainFlying
        3
    RainFlying  
       2014-06-30 21:48:09 +08:00 via Android
    直接查询非 53 端口不就没污染了?
    leavic
        4
    leavic  
    OP
       2014-07-01 09:01:35 +08:00
    @RainFlying 你怎么控制路由的查询命令?
    RainFlying
        5
    RainFlying  
       2014-07-02 07:43:51 +08:00 via Android   ❤️ 1
    @leavic 1. 如果 resolver 支持可以直接用 [208.67.222.222]:5353 形式,比如 OpenBSD,还可以指定使用 TCP 当时查询。
    2. iptables 把发出的 DNS 查询的端口改成非 53 端口
    3. 使用 DNSMasq. server=/#/208.67.222.222#5353
    KCheshireCat
        6
    KCheshireCat  
       2014-07-03 15:55:40 +08:00
    在input链上的规则只对路由器自己有效

    你需要在FORWARD链上也写上规则
    leavic
        7
    leavic  
    OP
       2014-07-03 16:52:33 +08:00
    @KCheshireCat 我就是在路由上查询的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2697 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:40 · PVG 18:40 · LAX 02:40 · JFK 05:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.