<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/rss/stylesheet/" type="text/xsl"?>
<rss xmlns:content='http://purl.org/rss/1.0/modules/content/' xmlns:taxo='http://purl.org/rss/1.0/modules/taxonomy/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:itunes='http://www.itunes.com/dtds/podcast-1.0.dtd' xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0" xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:atom='http://www.w3.org/2005/Atom' xmlns:podbridge='http://www.podbridge.com/podbridge-ad.dtd' version='2.0'>
<channel>
  <title>Su&apos;s Blog</title>
  <language>zh-cn</language>
  <generator>microfeed.org</generator>
  <itunes:type>episodic</itunes:type>
  <itunes:explicit>false</itunes:explicit>
  <atom:link rel="self" href="https://blog.0ne.day/rss/" type="application/rss+xml"/>
  <link>https://blog.0ne.day</link>
  <description>
    <![CDATA[<a rel="me" href="https://mastodon.0ne.day/@su">Mastodon</a>]]>
  </description>
  <itunes:author>Su</itunes:author>
  <itunes:image href="https://blog-media.0ne.day/blog-one-day/production/images/channel-5d1415959252c8d61e9adb7cbe424d6c.png"/>
  <image>
    <title>Su&apos;s Blog</title>
    <url>https://blog-media.0ne.day/blog-one-day/production/images/channel-5d1415959252c8d61e9adb7cbe424d6c.png</url>
    <link>https://blog.0ne.day</link>
  </image>
  <item>
    <title>我的网站访问记录是怎么泄露的之用 MosDNS 防止 DNS 泄露并实现分流</title>
    <guid>c-0KfHuTo35</guid>
    <pubDate>Sat, 11 Nov 2023 12:31:30 GMT</pubDate>
    <itunes:explicit>false</itunes:explicit>
    <description>
      <![CDATA[<ul>
  <li>自从反诈以来，中国互联网上有越来越多的网友分享自己刚打开某个网站，正准备网上冲浪的时候，突然来了<code>“您正在浏览境外小众网站，请谨慎浏览”</code>或者是<code>“xx网警提醒您，您访问的网站xxx存在用户举报”</code>之类的短信，甚至有的是直接跳脸的闪信，还有的直接就是反诈民警直接电话呼过来，甚至还边响铃边带着这是反诈中心电话，请放心接听之类的闪信，给了不少网友一点小小的反诈震撼，被诈骗之余，网友们可能会好奇他们是怎么知道你在访问什么网站的？诸位网友稍安勿燥，接下来我们将揭开反诈的骗…啊不对，是DNS的面纱，并且帮助大家学习如何保护自己的隐私。</li>
  <li>什么是DNS</li>
  <ul>
    <li>为了便于理解网络是如何通信的，我们可以把网络类比成邮政系统，我们在网络上接收信息发送信息就像收发快递，只不过网络的传输速度是光速，收发快递需要有双方确定的地址，网络上我们的地址就是IP地址，我们上网时的每次通信都是向对方的IP地址发送信息，当你访问某个网站的时候，其实是在你的IP地址和网站的IP地址之间传递信息，互联网早期，人们访问网站都是直接输入IP地址访问，但是像<code>114.514.114.514</code> 这样的地址形式太不好记，就像生活中我们不会说<code>“我想去中华人民共和国北京市海淀区清华园 40°0′2″N 116°19′34″E”</code>，而是说<code>“我想去清华大学”</code>，DNS（域名解析系统）就是这样一个人类友好的别名系统，把域名<code>example.com</code>转换成对应服务器的IP地址<code>114.514.114.514</code>，这样我们再上网冲浪的时候访问网站就好记多了。</li>
  </ul>
  <li>DNS的问题</li>
  <ul>
    <li>明文可审查</li>
    <ul>
      <li>互联网早期发展阶段，没有想到政府会大规模监控其他人上网，并且可能因此写保证书或者进监狱，更没有想到有人会从中作梗，把域名指向到错误的IP上做坏事。所以 DNS 协议默认是明文的，一般如果你没有特意设置过 DNS 服务器的话，默认会使用电信运营商的 DNS 服务器，即使你使用了第三方公共 DNS 服务器，在通过 DNS 查询某网站的 IP 的时候，通信内容都是运营商可以直接看到的，这么一来，你访问了哪些网站的域名，运营商都知道得一清二楚，而众所周知，中国的电信运营商都属国有，政府能监控所有人的域名访问记录，那顺道再给你发个短信打个电话问候一下肯定不在话下。</li>
    </ul>
    <li>DNS 劫持和 DNS 污染</li>
    <ul>
      <li>网络通信的过程其实和快递类似，快递运输的途中会有一个个的中转点，不是直接从地址A到地址B，而是从<code>地址A → A附近的快递网点 → 中转点1 → 中转点2 →...→ 中转点N → B附近的快递网点 → 地址B</code>，网络发送信息的过程也类似，从<code>你的手机/电脑 → 你家的路由器 → 电信运营商接入点 → 运营商骨干网节点1 → 运营商骨干网节点2 →…→ 运营商骨干网节点N → 对方电信运营商接入点 → 对方的路由器 → 对方的手机/电脑</code>。</li>
      <li>对收发快递的用户来说，快递的运输依赖于中间人快递公司，如果你的包裹没有上锁，那么快递公司完全有能力在运输过程中偷梁换柱或者全部私吞，想想如果你下单了首发的游戏光盘，收货时却发现变成了菠萝！或者你下单的就是菠萝，却被快递公司偷吃了，而你一直收不到货，你重复下单菠萝，却永远收不到货。</li>
      <li>网络通信也类似，既然电信运营商全程负责在 DNS 服务器和用户之间直接转发消息，也能看到明文的内容，那么就能够篡改网站对应的IP地址，而墨菲定律告诉我们，如果坏事可能发生，那就一定会发生，果不其然，即使在今天电信运营商们也一直在做着这些坏事，把 DNS 服务器返回的结果丢失或者篡改成错误的 IP，而用户们轻则访问不了网站，重则被钓鱼丢失钱财。</li>
    </ul>
    <li>DNS 解析友好度</li>
    <ul>
      <li>随着互联网的发展，大一些的互联网服务提供者为了确保服务的高可用和提高不同地区用户的访问速度，会在不同地区都设立服务器提供服务，因此一个域名可能指向多个 IP，DNS 服务器在解析域名的时候，理想情况下应该返回离用户最近的服务器 IP，确保用户流畅的网络体验，但面对一些国外的服务，国内电信运营商默认的 DNS 服务器往往在这方面能力较差，而一些在全球各国各地区都有服务器的第三方公共 DNS 服务通常会有更好的解析结果，常见例子是使用某些国外互联网服务时，比如 Switch、PS 等下载游戏时，换个国外的 DNS 下载速度就变快了，就是因为使用了解析更精准的 DNS 服务器，对应下载资源的域名解析到了离用户更近速度更快的服务器。</li>
    </ul>
  </ul>
  <li>解决 DNS 的问题</li>
  <ul>
    <li>加密 DNS 协议</li>
    <ul>
      <li>随着网络的广泛应用，DNS安全也越来越受重视，因此开发了加密的DNS协议，加密之后，网络通信的中间节点们就看不到我们的通信内容了，自然也无从篡改。</li>
      <li>目前主流的DNS加密协议有 DoT（DNS over TLS)、DoH（DNS over HTTPS/HTTP3）、DoQ（DNS over QUIC）、DNSCrypt，由于 DNSCrypt、DoQ 支持平台有限，DoT 协议特征明显，很容易被屏蔽，所以推荐依附于 HTTPS 的 DoH，目前主流的公共 DNS 服务基本都支持了 DoH 协议。</li>
    </ul>
    <li>公共 DNS 服务</li>
    <ul>
      <li>电信运营商默认提供的 DNS 服务只做到了基本能用，对于安全性、准确性等方面支持较差，因此有些企业或者公益组织提供了公共的 DNS 服务，这些公共 DNS 服务也在不同地区都有多台服务器，使用 anycast 技术，所有地区服务器的 IP 地址都相同，用户访问时会自动分配到离用户最近的服务器，以尽可能得到最优的结果。</li>
      <li>国内公共 DNS 服务</li>
      <ul>
        <li>国内公共 DNS 服务的服务器大多都在国内各地区，国外则较少，所以在国内用户对国内网站的解析效果较好，而对国外用户和国外网站的效果可能就不太好了。</li>
        <li>国内公共 DNS 服务虽然即使是加密的，也可能存在 DNS 污染的现象，但还是比电信运营商默认的 DNS 服务污染少多了，电信运营商提供的 DNS 服务没有加密，整个通信链路中除了电信运营商，也可能会有其他的攻击者，所以加密还是好过不加密。</li>
        <li>自2022年12月1日起施行的<b>《中华人民共和国反电信网络诈骗法》</b>第二十四条 <code>“提供域名解析、域名跳转、网址链接转换服务的，应当按照国家有关规定，核验域名注册、解析信息和互联网协议地址的真实性、准确性，规范域名跳转，记录并留存所提供相应服务的日志信息，支持实现对解析、跳转、转换记录的溯源。”</code> 意味着即使是使用国内公共 DNS 服务的加密 DNS 协议，域名的请求记录也被服务商保存，提供给政府进行监控对政府来说和明文一样，那当你用国内公共 DNS 服务访问某些国外网站的时候，也可能会接到反诈电话。所以尽量避免用国内任何 DNS 服务解析国外网站。</li>
        <li>国内流行的公共 DNS 服务中，南京信风的 114DNS（114.114.114.114）知名度最高，由于公司本身就是对政府和电信运营商等做用户行为分析、广告等业务的，你使用它们公共 DNS 的每一次记录都可能被分析并利用，不推荐， 其他的据说阿里的 <a href="https://www.alidns.com/knowledge?type=SETTING_DOCS">AliDNS</a> 服务器节点比较多，腾讯的 <a href="https://www.dnspod.cn/Products/publicdns">DNSPod</a> 比较准一些，可以用这两个的 DoT 和 DoH。</li>
      </ul>
      <li>国外公共 DNS 服务</li>
      <ul>
        <li>由于政策原因，国外公共 DNS 服务难以在国内设立服务器，所以都没有国内节点，很多解析结果对国内来说并不是最优，所以国外公共 DNS 服务对国外用户访问国外网站效果比较好，对国内用户访问国内服务就不好用了。</li>
        <li>既然加密的国外公共 DNS 服务政府无法监控，那就直接屏蔽掉他们好了，目前国外常用的公共 DNS 服务在国内各地区均收到不同程度的干扰，有些地区直接屏蔽，有些地区会不定时干扰阻断连接，间歇性屏蔽国外公共 DNS服务，所以想要国外 DNS 服务访问稳定，最好通过代理访问或者自建 DoH 服务器。</li>
        <li>国外公共 DNS 服务推荐 <a href="https://developers.google.com/speed/public-dns/docs/intro">Google（8.8.8.8）</a> 和 <a href="https://developers.cloudflare.com/1.1.1.1/setup/">Cloudflare（1.1.1.1） </a>的，这俩应该是全球各地服务器数量最多的公共 DNS 服务了，体验应该也会好很多。</li>
      </ul>
    </ul>
    <li>DNS 分流</li>
    <ul>
      <li>对于每天需要上互联网而不只是上局域网的人来说，即要想上网速度快，又不想被反诈，最好的情况是国内 DNS 服务只用来解析国内网站，国外网站全部用国外公共 DNS 解析，要达到这个目的，我们需要先确定网站是否在国内，如果是国内的服务，那么使用国内 DNS，否则使用国外 DNS，那怎么来判断是否是国内网站呢，这方面已经有了不少的翻墙分流方案做过了，简单来说就是两个列表，一个是使用最多的<a href="https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/direct-list.txt">国内域名列表</a>，一个是 IP 地址归属地为<a href="https://raw.githubusercontent.com/Loyalsoldier/geoip/release/text/cn.txt">中国的 IP 区段列表</a>，当接受一个网站的 DNS 解析请求时，先看它是否在国内域名列表中，如果在，就用国内 DNS 解析，如果不在，就用国外 DNS 解析，解析的 IP 地址如果在中国的 IP 区段中，那就改用国内 DNS 解析，并对解析结果缓存。虽然国内域名列表没有包含所有国内域名，IP区段列表也不是全都准确，但两者组合基本上能保证一个相对更安全准确的结果。</li>
      <li>对于这个解决方案，刚好 <a href="https://github.com/IrineSistiana/mosdns">MosDNS</a> 这个功能强大的 DNS 转发器就能很好的做到，MosDNS 至今已经开发到第五版，以下就给出 V5 的配置文件，详细可以看看<a href="https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5">官方文档</a>，根据自己的需求修改<p><br/></p><pre data-lang="yaml">		  log:
		  level: info
		  production: true
		  
		  plugins:
		  # 定期更新中国域名列表到配置目录
		  # https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/direct-list.txt
		  - tag: cn_domainList
		    type: "domain_set"
		    args:
		      files:
		        - "./direct-list.txt"
		  
		  # 定期更新IP列表到配置目录
		  # https://raw.githubusercontent.com/Loyalsoldier/geoip/release/text/cn.txt
		  - tag: cn_ipList
		    type: "ip_set"
		    args:
		      files:
		        - "./cn.txt"
		  
		  #国外DNS
		  - tag: world_DNS
		    type: "forward"
		    args:
		      upstreams:
		        #可使用代理或者自建DoH
		        - tag: google_doh
		          addr: "https://dns.google/dns-query"
		          dial_addr: "8.8.8.8"
		          enable_http3: true
		          insecure_skip_verify: false
		  
		        - tag: cloudflare_doh
		          addr: "https://1.1.1.1/dns-query"
		          dial_addr: "1.1.1.1"
		          enable_http3: true
		          insecure_skip_verify: false
		  
		  #国内DNS
		  - tag: cn_DNS
		    type: "forward"
		    args:
		      upstreams:
		        - tag: alidns_dot
		          addr: "tls://dns.alidns.com"
		          dial_addr: "223.5.5.5"
		          enable_pipeline: true
		          insecure_skip_verify: false
		  
		        - tag: dnspod_dot
		          addr: "tls://dot.pub"
		          dial_addr: "1.12.12.12"
		          enable_pipeline: true
		          insecure_skip_verify: false
		  
		  #本地缓存
		  - tag: local_cache
		    type: "cache"
		    args:
		      size: 65535
		      lazy_cache_ttl: 260000
		      dump_file: "./cache.dump"
		      dump_interval: 600
		  
		  #缓存解析
		  - tag: cache_resolve
		    type: "sequence"
		    args:
		      - exec: $local_cache
		      - matches:
		          - has_resp
		        exec: query_summary cache
		      - matches:
		          - has_resp
		        exec: accept
		  
		  #国内解析
		  - tag: cn_resolve
		    type: "sequence"
		    args:
		      - exec: $cn_DNS
		      - exec: query_summary cn_DNS
		  
		  #解析流程
		  - tag: resolve_process
		    type: "sequence"
		    args:
		      - exec: prefer_ipv4
		  
		      - exec: jump cache_resolve
		  
		      - matches:
		        - "qname $cn_domainList"
		        exec: goto cn_resolve
		  
		      - exec: $world_DNS
		      - exec: query_summary world_DNS
		  
		      - matches:
		        - "resp_ip $cn_ipList"
		        exec: goto cn_resolve
		  
		  # 提供明文的UDP DNS服务
		  - tag: udp_server
		    type: "udp_server"
		    args:
		      entry: resolve_process
		      listen: "0.0.0.0:53"
</pre></li>
    </ul>
    <li>在配置目录下载需要的两个列表文件，并定期更新，命令或后台服务启动 mosdns，就会监听 53 端口，提供一个明文的本地 DNS 服务，本机系统设置 DNS 为 127.0.0.1，局域网内其他机器或路由器设置 DNS 为此机器的 IP 地址即可使用上分流的 DNS。</li>
    <li>除了上述的简单方案，MosDNS 还有更多强大的功能和插件，能精细控制 DNS 解析流程中的各个环节，大家可以参照文档自定义配置文件。</li>
  </ul>
  <li>DNS 之外</li>
  <ul>
    <li>SNI（Server Name Indication）泄露</li>
    <ul>
      <li>只加密了 DNS 还不够，网络协议中并非只有 DNS 协议是明文的，浏览网页的 HTTP 协议也是明文，虽然现在普遍升级到了加密的 HTTPS 协议，但是 HTTPS 协议也并非完全加密，当初为了一台服务器可以同时有多个域名，会在 HTTPS 请求发起时发送明文的网站域名给服务器，所以电信运营商虽然不知道你访问的具体链接和网页内容，但会知道你上了哪个网站，对于这个问题，目前还没有比较好的办法，有一项新的 ECH 协议计划正在推进中，来加密 SNI，但远未广泛施行，目前还是需要完全使用代理才能保证域名访问记录不泄露。</li>
    </ul>
    <li>安全意识</li>
    <ul>
      <li>除了网络基础设施环境的安全，更重要的还是日常网上冲浪的过程中的种种行为，审查系统不是一个无所不能的机器，了解它的运作机制，学习如何应对才能长久地保护自己，所以强烈推荐 matters 的这个<a href="https://public.0ne.day/videos/cybersecurity.mp4">网络安全讲座</a>，梳理解答了很多常见的问题，看完之后会对大家有不少帮助。</li>
    </ul>
  </ul>
</ul>]]>
    </description>
    <link>https://blog.0ne.day/i/mosdns-dns-c-0KfHuTo35/</link>
    <itunes:episodeType>full</itunes:episodeType>
  </item>
</channel>
</rss>