Nginx禁止服务器IP直接HTTP/HTTPS访问网站

By | 2018年11月24日

连接互联网的每台服务器一般会有一个相对应的IP,当域名解析到这个IP时,访问域名即可访问到此服务器上的站点。
但在默认情况下,直接访问服务器IP也是可以访问到服务器上的站点,也就是说,任何人将任何域名解析到此IP上,都可以访问到你的站点。虽然别人的域名解析到你的IP上,可能会给你的网站带来流量,但如果这个域名没有备案呢?或者曾经有过违法活动呢?这样的风险,就会给你带来IP被封、拔线或罚款的后果。某些别有用心的人,将有问题的域名解析到别人的服务器IP上,使其遭受损失,这也可以说是新兴的一种攻击手段。
本文以Nginx为例,分享如何禁止服务器IP直接访问网站。

1、站点是nginx.conf+网站.conf的情况

编辑nginx.conf配置文件,修改server { }内的信息,如下:

server
    {
        listen 80 default_server;
        #listen [::]:80 default_server ipv6only=on;
        server_name _;
        return 444;
     }
server
    {
        listen 443 ssl default_server;
        server_name _;
        ssl_certificate      /随便一个ssl证书/ssl.crt;
        ssl_certificate_key  /随便一个ssl证书/ssl.key;
        return 444;
     }

保存后重启一下Nginx使配置生效。如果别人访问http://ip或https://ip时,就不会访问到你的站点了,要是想把这些访问流量收集起来,也可以把return 444改为rewrite ^ https://你的域名.com permanent,这样就会直接跳转到你的网站,给你带来访问量了。

2、站点是单nginx.conf配置的情况

编辑nginx.conf配置文件,在server { }内的添加红色字体信息,如下:

server
    {
        listen 80 default_server;
        #listen [::]:80 default_server ipv6only=on;
        server_name _;
        index index.html index.htm index.php;
        root  /home/你的站点根目录;
        set $deny 1;
        if ($host = "www.你的域名.com"){
        set $deny 0;
        }
        if ($host = "你的域名.com"){
        set $deny 0;
        }
        if ($deny = 1){
        return 444;
        }
    }
server
    {
        listen 443 ssl default_server;
        server_name _;
        index index.html index.htm index.php;
        root  /home/你的站点根目录;
        ssl_certificate      /你网站的ssl证书/ssl.crt;
        ssl_certificate_key  /你网站的ssl证书/ssl.key;
        set $deny 1;
        if ($host = "www.你的域名.com"){
        set $deny 0;
        }
        if ($host = "你的域名.com"){
        set $deny 0;
        }
        if ($deny = 1){
        return 444;
        }
     }

同样,也可以修改return 444为rewrite ^ https://你的域名.com permanent。
另外,还可以查看nginx logs和站点logs,屏蔽一些非正常访问的IP,可对logs进行检索:

awk '{print $1}' access.log |sort |uniq -c|sort -n

然后对比一下实际情况,可将要屏蔽的IP保存在blockip.conf文件,本文当中nginx.conf和blockip.conf在同一个目录,然后修改nginx.conf添加一行:include blockip.conf; 即可。屏蔽IP的格式如下:

#屏蔽某个IP访问
deny IP;
#允许某个IP访问
allow IP;
#屏蔽整个段即从123.0.0.1到123.255.255.254访问
deny 123.0.0.0/8;
#屏蔽IP段即从123.45.0.1到123.45.255.254访问
deny 123.45.0.0/16;
#屏蔽IP段即从123.45.6.1到123.45.6.254访问
deny 123.45.6.0/24;

如果是单个站点屏蔽IP,把 include blockip.conf; 放在网站相对应的server {}内,如果是全站点屏蔽IP,则把 include blockip.conf; 放在http {}内即可。

以上是总体的修改思路,如果上面信息有误或不可用,欢迎留言探讨指导。

发表评论

电子邮件地址不会被公开。 必填项已用*标注