随笔 - 105  文章 - 2 评论 - 9 阅读 - 19万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

一大早接到网络部门通知,我们ip被恶意域名解析了:有未备案的域名解析到了我们ip上,10点前不处理好,将会封ip

接到这个通知,我是一头雾水,因为之前我是做过相关处理的:https://www.cnblogs.com/allay/p/17596091.html

后来把恶意解析域名地址拿来一看,好家伙,居然是https地址:

 那就说的通了,我当时只做了80端口的防解析,443端口并没做

这里说下恶意域名解析原理:

外网域名解析,只能解析到 http://ip(80端口)或者 https://ip(443端口)上,再往内部的二级域名等资源解析是没有办法的,因为他只能解析到 http://ip:80或者http://ip:443,nginx内部的 server_name参数他匹配不上

如果当前ip对应的80(或者443)端口在nginx里没有指定默认资源,会以conf.d目录下的顺序第一的配置文件指向的资源为准,也就是用80或者443各排第一个的配置文件为默认资源

这时候如果用一个不相关的域名解析到http://ip(80端口)或者 https://ip(443端口)上,就会阴差阳错的关联到conf.d目录下80或者443各排第一位的配置文件对应的资源上

所以防解析的解决方法也很简单,就是指定80和443端口的默认资源,让他们只返回403报错,默认资源没法显示有效内容,域名就没法解析成功

 

下面是我的操作步骤:

1.首先想到的就是修改默认资源啊

一开始修改的配置文件如下,重启nginx报错

 [emerg] 1#1: no "ssl_certificate" is defined for the "listen ... ssl" directive in /etc/nginx/conf.

复制代码
server {
    listen 80 default;
    return 403;
}

server {
    listen 443 ssl default;
    return 403;
}
复制代码

看来443端口没有证书是配置不了了,眼看着10点要到了,暂时就不配置证书了,试试其他方式曲线救国

 

2.修改conf.d目录443端口排第一的配置文件

复制代码
server {
                listen  443 ssl;
                server_name x.x.x.x;
                ...
                if ($host != 'x.x.x.x'){
                  return 403;
                }
                 ...
                location / {
                        proxy_pass   http://xxxx;
                        proxy_set_header Host $host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                }
                ...

}
复制代码

参考文档:https://www.cnblogs.com/mafeng/p/11671793.html

这个方式其实更适合防盗链,加了一个判断语句:只要匹配的域名不是设置的域名就返回403报错,经过实测是可行的!访问https://ip 也显示403了,之前是可以直接显示这个资源对应的网页的,访问正确的域名,网页可以正常打开

 

某种程度上这样就可以了,但是如果后期加了个443资源,排名比他靠前,那这个策略就失效了,所以还是得配置专门的默认资源来返回403

 

3.修改默认资源配置

首先得找个域名来生成证书,比如我们域名是abc.cn,那我就用403.abc.cn来做默认资源吧

我这里是使用certbot生成免费证书,关于如何使用certbot可以参考这篇:https://www.cnblogs.com/allay/articles/17319861.html

后来发现一个自签名证书的方式,感觉更好:https://blog.csdn.net/ceboy/article/details/104402486

这里 return 403; 配置需要先注释掉

修改403.conf如下

复制代码
server {
    listen 80 default;
    server_name 403.abc.cn;
    #return 403;
    #配置http验证可访问
    location ~/.well-known/acme-challenge/ {
    #此目录都是nginx容器内的目录,对应宿主机volumes中的http验证目录,而宿主机的又与certbot容器中命令--webroot-path指定目录一致,从而就整个串起来了,解决了http验证问题
    root /usr/share/nginx/html/;
     }

}
复制代码

证书生成成功

 继续修改配置文件403.conf

复制代码
server {
    listen 80 default;
    server_name 403.abc.cn;
    return 403;
    #配置http验证可访问
    location ~/.well-known/acme-challenge/ {
    #此目录都是nginx容器内的目录,对应宿主机volumes中的http验证目录,而宿主机的又与certbot容器中命令--webroot-path指定目录一致,从而就整个串起来了,解决了http验证问题
    root /usr/share/nginx/html/;
     }

}

server {
    listen 443 ssl default;
    server_name 403.abc.cn;
    ssl_certificate           /usr/local/etc/certbot/live/403.abc.cn/fullchain.pem;
    ssl_certificate_key       /usr/local/etc/certbot/live/403.abc.cn/privkey.pem;

    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

    return 403;
}
复制代码

重启nginx,未报错,说明配置成功

最后再把第二步的判断注释掉,再重启nginx

这个时候访问未备案域名,返回403,访问https://ip依然返回403,443端口的防解析配置成功~

 

posted on   06  阅读(2689)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示