近期遇到业务需求,需要在多台内网机器上部署应用,内网机器上连接互联网有严格限制,只能连接特定几个IP段以及指定的几个业务域名。
这些应用使用了DNS over HTTPS(DoH)进行业务域名的解析,需要配置一个DoH的地址,但内网机器显然是无法访问互联网上提供的DoH服务的。在该内部网络中设置了DMZ区,访问外部网络没有限制,于是决定在DMZ主机上使用Nginx部署一个DoH代理服务给内网机器使用。
由于服务器环境在国外,此处选择Cloudflare提供的1.1.1.1公共解析服务。为了保证响应结果不被篡改,提高安全性,此处向上游发起的DNS请求也使用DoH进行发送,并且对响应设置10分钟的缓存时间(详见下方proxy_cache_path、proxy_cache_valid配置),重写了log增加上游响应时间记录。
Nginx的具体配置如下,本地SSL证书配置部分由于不属于本文讨论重点故没有添加进来,可参考网上的文档进行配置:
proxy_cache_path /var/cache/nginx/doh_cache levels=1:2 keys_zone=doh_cache:10m;
log_format upstream_time '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"'
'rt=$request_time uct="$upstream_connect_time" uht="$upstream_header_time" urt="$upstream_response_time"';
server
{
listen 80;
listen 443 ssl http2;
location / {
return 444;
}
# location /cdn-cgi/trace {
# proxy_ssl_name 'one.one.one.one';
# proxy_ssl_server_name on;
# proxy_ssl_session_reuse off;
# proxy_pass https://1.1.1.1;
# proxy_set_header Host 'one.one.one.one';
# }
proxy_cache_methods GET POST;
location /dns-query {
proxy_cache doh_cache;
proxy_cache_key $scheme$proxy_host$uri$is_args$args$request_body;
proxy_cache_valid 200 10m;
add_header X-Cache-Status $upstream_cache_status;
proxy_ssl_name 'one.one.one.one';
proxy_ssl_server_name on;
proxy_ssl_session_reuse off;
proxy_pass https://1.1.1.1;
proxy_set_header Host 'one.one.one.one';
}
// ...
}
发表回复