#dns #proxy #upstream #cache #ttl #leveldb #forced

bin+lib dnscache

简单的强制缓存DNS代理

9个版本

使用旧版Rust 2015

0.3.2 2018年4月24日
0.3.1 2018年3月11日
0.2.3 2018年1月11日
0.2.2 2017年12月27日
0.1.2 2017年12月20日

#13#leveldb

每月 27次下载

MIT/Apache

1.5MB
784

Dnscache

支持一个上游的简单DNS代理。专为使用速度慢且不可靠的上游DNS服务器(如Tor的DNS解析器)而设计。以可用性为代价换取一致性。不适用于正式用途。

许可 = MIT或Apache 2.0

Github发布中有一些预构建版本。版本号低于0.3.1的版本依赖于有缺陷的rusy-leveldb,可能会偶尔崩溃。

DNSCache也可以作为库使用(使用您自己的数据库和网络抽象,但DNS数据包仍然作为字节数组),


dnscache 0.1.3
Vitaly _Vi Shukela <vi0oss@gmail.com>
Simple DNS cacher.

USAGE:
    dnscache [OPTIONS] <listen_addr> <upstream_addr> <db>

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
        --max-ttl <max_ttl>    Maximum TTL of A or AAAA entry, seconds [default: 4294967295]
        --min-ttl <min_ttl>    Minimum TTL of A or AAAA entry, seconds [default: 0]
        --neg-ttl <neg_ttl>    Negative reply TTL, seconds [default: 30]

ARGS:
    <listen_addr>      Listen address and port
    <upstream_addr>    Upstream DNS server address and port
    <db>               Path to LevelDB database directory
    
    
$ dnscache --neg-ttl 7200 127.0.0.1:53 127.0.0.1:6053 db --min-ttl 7200
A	users.rust-lang.org  cached
AAAA	users.rust-lang.org  cached
A	google.com  queued
  upstream
  saved to database: google.com
  replied...
A	www.google.com  cached, but refreshing
  upstream
  refusing to forget A entries
  saved to database: www.google.com
A	google.com  cached, negative 31.
AAAA	vi-notebook  cached, negative 6600.
AAAA	vi-notebook  cached, negative 6601.
A	users.rust-lang.org  cached
AAAA	users.rust-lang.org  cached
...

功能

  • IPv6 AAAA记录
  • 按原样转发更复杂的查询
  • 多问题查询
  • 通过过滤回复中的域名来提供最小的防护,以防止中毒
  • 始终尝试立即返回一些A或AAAA记录供客户端尝试,而不是等待刷新。
  • 将TTL限制在用户指定的最小值和最大值之间(缓存包含未修改的值)。

注意

  • 它不自己构建DNS请求,它重用客户端构建的数据包
  • 基于ID转发未缓存的查询(非A、非AAAA或非IN)
  • 回复中的TTL可能为0
  • 单线程,单个UDP套接字
  • 如果回复中所有的A或AAAA条目都消失了,则缓存条目保留。AAAA解析在Tor DNS解析器中有时有效,有时无效。
  • CNAME解析为A/AAAA条目并保留
  • 不支持查询(MX,All)仅根据ID转发
  • Dnscache整体对大小写敏感。google.comGoogle.com 分别查询和缓存。

关注点

  • 条目永远不会从缓存中删除
  • 如果数据已过期,它首先以TTL 0回复,然后在上游重新检查
  • 所使用的LevelDB实现尚不建议用于正式用途。
  • 客户端和上游通信都使用相同的套接字。不能仅监听127.0.0.1,而是依赖8.8.8.8。
  • 没有超时或计时。未回复的请求可能会无限期地保留在内存中。

数据库格式:LevelDB数据库,以类似 internals.rust-lang.org 的域名作为键,以CBOR作为值。示例值

{"a4": {"t": 1513810855, "a": [{"ttl": 599, "ip": h'4047a8d3'}]}, "a6": {"t": 1513810855, "a": [{"ttl": 599, "ip": h'20010470000103a80000000000000211'}]}}

00000000  a2 62 61 34 a2 61 74 1a  5a 3a eb a7 61 61 81 a2  |.ba4.at.Z:..aa..|
00000010  63 74 74 6c 19 02 57 62  69 70 44 40 47 a8 d3 62  |cttl..WbipD@G..b|
00000020  61 36 a2 61 74 1a 5a 3a  eb a7 61 61 81 a2 63 74  |a6.at.Z:..aa..ct|
00000030  74 6c 19 02 57 62 69 70  50 20 01 04 70 00 01 03  |tl..WbipP ..p...|
00000040  a8 00 00 00 00 00 00 02  11                       |.........|
00000049

简单描述

{"a4": {"t": timestamp_unix, "a":[IPv4/TTL pairs list]}, "a6": null (for never requested values)}
{"t": ..., "a":[(empty list)]} means negatively cached

格式可能会更改,并且与预构建1.2二进制文件所使用的格式不同。

依赖项