我正在使用针对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请求。
有任何线索吗?
答案 0 :(得分:1)
在您的server
块中,尝试添加:
if ($host != "block.xyz.com") {
rewrite ^/(.*) https://block.xyz.com/$1 permanent;
}