【发布时间】:2019-04-10 19:28:49
【问题描述】:
我正在使用针对 bind9 的 DNSRBL 列表来实施内部 DNS 服务器,以阻止对恶意网站的特定 DNS 请求。每当有匹配时,DNS 服务器都会使用提供块页面的内部 NGINX 服务器的 IP 进行响应。
例如,当内部客户端请求http://www.badsite.com/时,DNS服务器以192.168.0.100为例进行响应,这是NGINX服务器的IP。然后 NGINX 使用 301 将请求转发到 HTTPS 站点,该站点将阻止页面消息提供给最终用户。
使用简单的 NGINX 配置效果很好:
server {
listen 80 default_server;
server_name _;
return 301 https://block.xyz.com;
}
server {
listen 443 ssl;
server_name block.xyz.com;
ssl_certificate /etc/letsencrypt/live/block.xyz.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/block.xyz.com/privkey.pem;
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
我遇到的问题是客户端请求 HTTPS 站点时,即:https://www.badsite.com/。我想将任何传入的 SSL/443 请求转发到 https://block.xyz.com。我尝试添加以下指令:
server {
listen 443 ssl default_server;
server_name _;
ssl_certificate /etc/letsencrypt/live/block.xyz.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/block.xyz.com/privkey.pem;
return 301 https://block.xyz.com;
}
我收到典型的 SSL 错误,说证书与域不匹配:NET::ERR_CERT_COMMON_NAME_INVALID,这是可以理解的。当我将指令从 return 更改为 rewrite 时,也会发生同样的事情:
...
rewrite ^ https://block.xyz.com;
....
我将如何在 NGINX 中添加指令来完成此操作?本指南 (https://sweetcode.io/ad-blocking-with-local-dns-servers-and-nginx/) 为我提供了一种在 http 端实现类似广告拦截的方法,但不涉及 https 请求。
有什么线索吗?
【问题讨论】:
-
Pihole可能是更好的解决方案。
标签: nginx