构建安全的DNS基础设施,如SecureDNS.eu

2020-05-02 17:47:56

在我的LinkedIn上可以看到,SecureDNS将于2020年4月30日关闭。许多人问我,他们是否可以购买SecureDNS,或者让我帮助他们建立一个类似的。这篇技术文章是为那些人写的。为了让它有意义,最好也检查一下我的Github SecureDNS存储库。

作为前端负载均衡器/反向代理,它使用HaProxy。HaProxy处理TLS部分,并将SNI路由到正确的服务。

ICS将/Bind9命名为DNS服务器。这是整个基础设施的核心,因为它提供来自所有其他服务的所有配对和请求(包括TLS上的DNS,其中Haproxy执行TLS部分,并命名为实际解析)。

dns over HTTPS服务器的m13253。它通过HTTPS提供DNS服务,并使用名为上游的服务。

nginx作为Web服务器,用于托管https://securedns.eu,和测试页面,如https://test.securedns.eu和https://ads-test.securedns.eu,用于检查用户是否使用SecureDNS作为提供商。

并非所有组件或配置的选项都会详细介绍,因为有些组件或配置的选项是直截了当的,或者只是最佳实践。如果您确实想知道,请检查RFC。

HaProxy是一个具有许多可配置功能的TCP/HTTP负载均衡器。此负载均衡器的唯一缺点是不支持UDP。这对于TLS上的DNS或HTTPS上的DNS应该不是问题,但是对于Quic上的DNS(Doq)或DNSCcrypt会有问题。

这个负载均衡器非常棒,因为它支持SNI路由。优点是您可以在同一端口上托管多个服务,并使用基于TLS中SNI扩展的路由。这确保了例如可以通过TLS服务DNS、通过HTTPS服务DNS以及在端口443上服务Web服务器!

以下部分包含haproxy.conf的内容。它分为以下几个部分:

全局守护进程用户haproxy group haproxy maxconn 55000外部-check tune.ssl.default-dh-param2048tune.ssl.cachesize 30000 tune.ssl.life600ssl-default-bind-options no-sslv3 nbproc 1 nbthread 4 cpu-map auto:1/1-4 0-3 log/dev/log local0通知默认超时http-request 10s超时队列30s超时检查3s超时连接5000ms超时客户端。

MAXCONN已设置为55000,高于默认值,以便能够处理更多连接。另外,将tune.ssl.cachesize和tune.ssl.lifetime设置为减少TLS握手带来的CPU开销。

由于此服务器有4个逻辑核心,我们希望使用多线程。因此,它将nbproc设置为1,以确保1个主进程,将nbthread设置为4,以确保4个工作线程。接下来,通过将CPU-MAP设置为AUTO:1/1-4 0-3,将每个线程分配给1个逻辑核心。

接下来,我使用log来确保通知消息被发送到systemd-Journal(因为Journal侦听/dev/log)。这对于跟踪在线和离线后端非常有用。

最后,我设置了EXTERNAL-CHECK参数,以启用使用自定义运行状况检查来验证后端是在线还是离线的功能。默认情况下,在后端使用参数检查时,HaProxy将进行TCP握手,以验证服务是否正在监听后端节点。通过使用此功能,您可以使用带有退出代码的Bash脚本进行运行状况检查。

默认部分包含前端和后端的所有默认值。优点在于,如果您将它们添加到Default,则只需添加一次,而不是在前端或后端部分本身中注明它们。

前端前端部分是面向公共互联网的配置,也是用户连接的位置。这些前端显然与后端部分有关系。

端口443/TLS:为Web服务器提供HTTPS服务,并为HTTPS上的DNS提供服务(如果您愿意,也可以将其用于TLS上的DNS)。

前端http bind:80 v4v6 tfo模式http maxconn 100重定向方案https code 301 if!{ssl_fc}acl securedns.eu hdr(Host)-i securedns.eu acl test.securedns.eu hdr(Host)-i test.securedns.eu acl ads-test.securedns.eu HDR(Host)-i ads-test.securedns.eu use_backend http-securedns.eu if securedns.eu。如果ads-test.securedns.eu default_backend http-securedns.eu前端https绑定.。

TFO:使用TCP Fast Open(设置某种cookie以在再次连接时启用更快的握手)。

crt:设置证书(请注意,1个文件必须包含证书、CA链和私钥。因此,如果您使用的是LetsEncrypt,则需要将它们组合在一起)。您可以在该行上使用多个CRT语句,让HaProxy为不同域提供多个证书。

我们使用mode参数将前端设置为HTTP或TCP代理。请记住,如果将其设置为HTTP,并且流量不是HTTP,则不会进行路由。使用HTTP的优点是使负载均衡器更了解流量,其中一些优化可以用于HTTP流量(例如,为报头转发