[nginx]安全加固

Nginx 禁止IP访问 只允许域名访问 转

今天要在Nginx上设置禁止通过IP访问服务器,只能通过域名访问,这样做是为了避免别人把未备案的域名解析到自己的服务器IP而导致服务器被断网,从网络上搜到以下解决方案:

Nginx的默认虚拟主机在用户通过IP访问,或者通过未设置的域名访问(比如有人把他自己的域名指向了你的ip)的时候生效

最关键的一点是,在server的设置里面添加这一行:
listen 80 default;
后面的default参数表示这个是默认虚拟主机。

这个设置非常有用。
比如别人通过ip或者未知域名访问你的网站的时候,你希望禁止显示任何有效内容,可以给他返回500.
目前国内很多机房都要求网站主关闭空主机头,防止未备案的域名指向过来造成麻烦。就可以这样设置:

  server {
	listen 80 default;
	server_name _;
	return 403;
}

nginx防盗链的方法

作者:Rick_Ji
链接:https://www.jianshu.com/p/97937992e523

一般,我们做好防盗链之后其他网站盗链的本站图片就会全部失效无法显示,但是您如果通过浏览器直接输入图片地址,仍然会显示图片,仍然可以右键图片另存为下载文件!
依然可以下载?这样就不是彻底的防盗了!那么,nginx应该怎么样彻底地实现真正意义上的防盗链呢?
首先,我们来看下nginx如何设置防盗链
如果您使用的是默认站点,也就是说,您的站点可以直接输入服务器IP访问的,使用root登录,修改 /usr/local/nginx/conf/nginx.conf 这个配置文件。
修改/usr/local/nginx/conf/vhost/你的域名.conf 这个配置文件,找到:

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$



expires      30d;

把这一段删掉,修改成:

location ~* \.(gif|jpg|png|jpeg)$ {

 expires     30d;

 valid_referers none blocked *.hugao8.com www.hugao8.com m.hugao8.com *.baidu.com *.google.com;

if ($invalid_referer) {

rewrite ^/ http://ww4.sinaimg.cn/bmiddle/051bbed1gw1egjc4xl7srj20cm08aaa6.jpg;

#return 404;

    }

}

第一行: location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
其中“gif|jpg|jpeg|png|bmp|swf”设置防盗链文件类型,自行修改,每个后缀用“|”符号分开!
第三行:valid_referers none blocked .it300.com it300.com;
就是白名单,允许文件链出的域名白名单,自行修改成您的域名!
.it300.com这个指的是子域名,域名与域名之间使用空格隔开!
第五行:rewrite ^/ http://www.it300.com/static/images/404.jpg;
这个图片是盗链返回的图片,也就是替换盗链网站所有盗链的图片。这个图片要放在没有设置防盗链的网站上,因为防盗链的作用,这个图片如果也放在防盗链网站上就会被当作防盗链显示不出来了,盗链者的网站所盗链图片会显示X符号。
这样设置差不多就可以起到防盗链作用了,上面说了,这样并不是彻底地实现真正意义上的防盗链!
我们来看第三行:valid_referers none blocked *.it300.com it300.com;
valid_referers 里多了“none blocked”
我们把“none blocked”删掉,改成
valid_referers *.it300.com it300.com;

nginx彻底地实现真正意义上的防盗链完整的代码应该是这样的:

location ~* \.(gif|jpg|png|jpeg)$ {

expires     30d;

valid_referers   *.hugao8.com www.hugao8.com m.hugao8.com *.baidu.com *.google.com;

if ($invalid_referer) {

rewrite ^/ http://ww4.sinaimg.cn/bmiddle/051bbed1gw1egjc4xl7srj20cm08aaa6.jpg;

#return 404;

    }

}

nginx防盗链的方法2

Nginx中防盗链(下载防盗链和图片防盗链)及图片访问地址操作记录

日常运维工作中,设置防盗链的需求会经常碰到,这也是优化网站的一个必要措施。今天在此介绍Nginx中设置下载防盗链和图片防盗链的操作~

一、Nginx中下载防盗链的操作记录
对于一些站点上的下载操作,有很多的下载来源不是本站,是迅雷、flashget, 源源不断的带宽,防盗链绝对是当务之急!使用来源判断根本不靠谱,只能防止一些小白站点的盗链,迅雷之类的下载工具完全无效;
如果是nginx配置的站点,可以使用secure link来完美解决这个问题,远离迅雷.

以下Nginx的盗链配置,仅用于下载服务器的下载防盗链,不适用于图片防盗链:
1)nginx的配置
[root@test-huanqiu ~]# cat /usr/local/nginx/conf/vhost/down.conf

server {
  
    listen       80;
    server_name  x1.down.wangshibo.com;
    access_log  /data/logs/nginx/x1.down.wangshibo.com.access.log  main;
  
    index index.html index.php index.html;
    root /data/site/x1.down.wangshibo.com;
  
    location / {
        secure_link $arg_st,$arg_e;
        secure_link_md5 wangshibo.com$uri$arg_e;
  
        if ($secure_link = "") {
            return 403;
        }
  
        if ($secure_link = "0") {
            return 403;
        }
    }
}

2)php下载页面
[root@test-huanqiu ~]# cd /data/site/x1.down.wangshibo.com
[root@test-huanqiu x1.down.wangshibo.com]# cat down.php

<?php # 作用:生成nginx secure link链接 # 站点:www.wangshibo.com $secret = 'wangshibo.com'; # 密钥 $path = '/web/nginx-1.4.2.tar.gz'; # 下载文件 # 下载到期时间,time是当前时间,300表示300秒,也就是说从现在到300秒之内文件不过期 $expire = time()+300; # 用文件路径、密钥、过期时间生成加密串 $md5 = base64_encode(md5($secret . $path . $expire, true)); $md5 = strtr($md5, '+/', '-_'); $md5 = str_replace('=', '', $md5); # 加密后的下载地址 echo ' nginx-1.4.2'; echo '
http://x1.down.wangshibo.com/web/nginx-1.4.2.tar.gz?st='.$md5.'&e='.$expire; ?>

3)测试nginx防盗链
浏览器上打开http://test.wangshibo.com/down.php点击上面的连接下载
下载地址如下:
http://x1.down.wangshibo.com/web/nginx-1.4.2.tar.gz?st=LSVzmZllg68AJaBmeK3E8Q&e=1378881984
页面不要刷新,等到5分钟后在下载一次,你会发现点击下载会跳转到403页面。

4)secure link 防盗链过程
1.用户访问down.php
2.down.php根据secret密钥、过期时间、文件uri生成加密串
3.将加密串与过期时间作为参数跟到文件下载地址的后面
4.nginx下载服务器接收到了过期时间,也使用过期时间、配置里密钥、文件uri生成加密串
5.将用户传进来的加密串与自己生成的加密串进行对比,一致允许下载,不一致403
整个过程实际上很简单,类似于用户密码验证. 尤为注意的一点是一定不要泄露了自己的密钥,否则别人就可以盗链了,除了泄露之外最好能经常更新密钥.

5)secure link 指令
1.secure_link
语法: secure_link md5_hash[,expiration_time]
默认: none
配置段: location
variables: yes
这个指令由uri中的MD5哈希值和过期时间组成. md5哈希必须由base64加密的,过期时间为unix时间.如果不加过期时间,那么这个连接永远都不会过期.
2.secure_link_md5
语法: secure_link_md5 secret_token_concatenated_with_protected_uri
默认: none
配置段: location
variables: yes
md5值对比结果,使用上面提供的uri、密钥、过期时间生成md5哈希值.如果它生成的md5哈希值与用户提交过来的哈希值一致,那么这个变量的值为1,否则为0
3.secure_link_secret
语法: secure_link_secret word
默认:
配置段: location
Reference: secure_link_secret
nginx 0.8.50之后的版本已经使用secure_link_md5取代,不在多说.

注意事项
1.密钥防止泄露、以及经常更新密钥
2.下载服务器和php服务器的时间不能相差太大,否则容易出现文件一直都是过期状态.

secure link以及内置到了nginx,不需要额外安装第三方模块,有下载服务器的情况,极力推荐使用它,除非你不在乎你的带宽.

6)珍爱带宽,远离迅雷
还可以配置nginx,让nginx防止迅雷、快车的多线程下载:
作用域: server location
if ($http_range)
{
return 405;
}

这样给用户端的第二个线程返回405,只让nginx单线程给用户吐数据。

二、Nginx中图片防盗链的操作记录
图片防盗链和下载防盗链使用的指令不同,下载防盗链使用secure link,并且需要程序配合,但是效果非常好;而图片防盗链不需要程序配合,根据图片来源来实现,但是只能先限制基本的图片盗用,无法防止图片采集.
nginx referer指令简介
nginx模块ngx_http_referer_module通常用于阻挡来源非法的域名请求.我们应该牢记,伪装Referer头部是非常简单的事情,所以这个模块只能用于阻止大部分非法请求.我们应该记住,有些合法的请求是不会带referer来源头部的,所以有时候不要拒绝来源头部(referer)为空的请求.

nginx防盗链指令
1)语法: referer_hash_bucket_size size;
默认值: referer_hash_bucket_size 64;
配置段: server, location
这个指令在nginx 1.0.5中开始出现.
2)语法: referer_hash_max_size size;
默认值: referer_hash_max_size 2048;
配置段: server, location
这个指令在nginx 1.0.5中开始出现.
3)语法: valid_referers none | blocked | server_names | string …;
默认值: —
配置段: server, location
指定合法的来源’referer’, 它决定了内置变量$invalid_referer的值,如果referer头部包含在这个合法网址里面,这个变量被设置为0,否则设置为1.记住,不区分大小写的.

参数说明
none:“Referer” 来源头部为空的情况,即表示空的来路,也就是直接访问,比如直接在浏览器打开一个图片
blocked:“Referer”来源头部不为空,但是里面的值被代理或者防火墙删除了,这些值都不以http://或者https://开头.即表示被防火墙标记过的来路
server_names:“Referer”来源头部包含当前的server_names(当前域名)
string:任意字符串,定义服务器名或者可选的URI前缀.主机名可以使用*开头或者结尾,在检测来源头部这个过程中,来源域名中的主机端口将会被忽略掉
regular expression:正则表达式,~表示排除https://或http://开头的字符串.

注意:
图片使用来源头部做防盗链是最合理的. 简单、实用。但是没有办法防采集。

图片防盗链的配置有三种方法,下面一一介绍:
1)针对不同文件类型的防盗链:
配置示例1:
location ~* .(gif|jpg|png|bmp)$ {
valid_referers none blocked *.wangshibo.com server_names ~.google. ~.baidu.;
if ($invalid_referer) {
return 403;
#rewrite ^/ http://www.wangshibo.com/403.jpg;
}
}

配置说明:
以上所有来至wangshibo.com和域名中包含google和baidu的站点都可以访问到当前站点的图片
如果来源域名不在这个列表中,那么$invalid_referer等于1,在if语句中返回一个403给用户,这样用户便会看到一个403的页面;
如果使用下面的rewrite,那么盗链的图片都会显示403.jpg;
如果用户直接在浏览器输入你的图片地址,那么图片显示正常,因为它符合none这个规则.

配置示例2:
location ~ .*.(wma|wmv|asf|mp3|mmf|zip|rar|jpg|gif|png|swf|flv)$ {
valid_referers none blocked *.wangshibo.com wangshibo.com;
if($invalid_referer){
#rewrite ^/ http://www.765h.com/error.html;
return 403;
}
}

配置说明:
第一行:表示对wma|wmv|asf|mp3|mmf|zip|rar|jpg|gif|png|swf|flv后缀的文件实行防盗链
第二行:表示对*.wangshibo.com和wangshibo.com这2个来路进行判断(*代表任何,任何的二级域名),可以添加更多
if{}里面内容的意思是,如果来路不是指定来路就跳转到403错误页面,当然直接返回404也是可以的,也可以是图片。

一般常用的图片防盗链的方法是在server或者location段中加入:
valid_referers none blocked www.wangshibo.com wangshibo.com;
如上面的两个小示例能起到一定的图片防盗链功能,但其实并不是真正的彻底的防盗链设置。
一般来说:
做好防盗链之后,其他网站盗链的本站图片就会全部失效无法显示,但是如果通过浏览器直接输入图片地址,仍然会显示图片,仍然可以右键图片另存为下载文件!
依然可以下载?这样就不是彻底的防盗了!那么,nginx应该怎么样彻底地实现真正意义上的防盗链呢?

首先,来看下nginx如何设置防盗链?
修改 /usr/local/nginx/conf/nginx.conf 这个配置文件:
默认图片是有过期时间设置的
[root@bastion-IDC ~]# vim /usr/local/nginx/conf/nginx.conf
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 30d;
}

把上面的配置修改成:
[root@bastion-IDC ~]# vim /usr/local/nginx/conf/nginx.conf
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ {
valid_referers none blocked *.wangshibo.com wangshibo.com;
if($invalid_referer) {
rewrite ^/ http://www.wangshibo.com/404.jpg;
#return404;
}
expires 30d;
}

配置解说:
第一行:location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
其中“gif|jpg|jpeg|png|bmp|swf”设置防盗链文件类型,自行修改,每个后缀用“|”符号分开!

第二行:valid_referers none blocked .wangshibo.com wangshibo.com;
就是白名单,允许文件链出的域名白名单,自行修改成您的域名!
.wangshibo.com这个指的是子域名,域名与域名之间使用空格隔开!

第四行:rewrite ^/ http://www.wangshibo.com/404.jpg;
这个图片是盗链返回的图片,也就是替换盗链网站所有盗链的图片。这个图片要放在没有设置防盗链的网站上,因为防盗链的作用,这个图片如果也放在防盗链网站上就会被当作防盗链显示不出来了,盗链者的网站所盗链图片会显示X符号。

这样设置差不多就可以起到防盗链作用了,但是这样并不是彻底地实现真正意义上的防盗链!
我们来看第二行:valid_referers none blocked *.wangshibo.com wangshibo.com;
valid_referers 里多了“none blocked”
我们把“none blocked”删掉,改成:
valid_referers *.wangshibo.com wangshibo.com;

所以说:
nginx彻底地实现真正意义上的防盗链完整的代码应该是这样的:
1.去掉valid_referers 后面的none blocked
2.防盗链和expires图片过期时间设置整合到一起。其实就是保证server段中只有一个类似location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$的配置
完整配置如下:

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
  valid_referers *.wangshibo.com wangshibo.com;
  if($invalid_referer) {
    rewrite ^/ http://www.wangshibo.com/404.jpg;
    #return404;
    }
  expires 30d;
}

这样您在浏览器直接输入图片地址就不会再显示图片出来了,也不可能会再右键另存什么的。
第四行:
rewrite ^/ http://www.wangshibo.com/404.jpg;
这个是给图片防盗链设置的防盗链返回图片
如果我们是文件需要防盗链下载,把第四行改成一个链接,比如可以改成是主站的链接
rewrite ^/ http://www.wangshibo.com;
这样,当别人输入文件下载地址,由于防盗链下载的作用就会跳转到您设置的这个链接!
最后,配置文件设置完成别忘记重启nginx生效!

再看一例:
比如现在google首页点击广告www.abc.com跳转到www.baidu.com,但是直接在浏览器输入www.abc.com还是www.abc.com
配置如下:
valid_referers none blocked localhost .abc.com abc.com;
if ($invalid_referer){
rewrite ^/(.
) http://www.baidu.com/? permanent;
break;
}


实验说明:

server {
     listen 80 ;
     server_name 192.168.1.14 web01.wangshibo.cn;
     root /var/www/html;
     index index.html index.php index.htm;
  
     location ~* \.(gif|jpg|png|swf|flv)$ {
     valid_referers none blocked *.wangshibo.cn;
     if ($invalid_referer) {
         rewrite ^/ http://www.heihei.com/404.jpg;
         #return 404;
         }
      expires 30d;
     }
  
     location ~ .*\.(php|php5)?$ {
       #fastcgi_pass  unix:/tmp/php-cgi.sock;
       fastcgi_pass  127.0.0.1:9000;
       fastcgi_index index.php;
       include fastcgi.conf;
     }
     access_log  /usr/local/nginx/logs/image.log;
 }

注意第8行 “valid_referers none blocked”
其中"none" “blocked” 的意思分别是:
none代表没有referer;
blocded代表有referer但是被防火墙或者是代理给去除了。

以上配置后,访问的跳转流程:
1)首先当输入要打开的网址的时候,因为是直接输入的没有referer,所以匹配了valid_referers后面的none或者是blocked,invalid_referer值为0,因此不进行跳转.
2)当是从这个网站里面的链接跳到该网站首页的时候,因为referer的值是肯定包含srever_names,所以匹配了server_names,因此不进行跳转;
3)当从搜素引擎进去的时候因为referer字段类似于www.google.com.hk/search,开始进行匹配,发现没有一个匹配,则此时会设置invalid_referer值为1,if语句成功执行,进行了跳转. 达到功能!

[root@test-huanqiu ~]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@test-huanqiu ~]# /usr/local/nginx/sbin/nginx -s reload

只有把这两个none,blocked去掉,才可以真正的实现防盗连!因为只有匹配到server_name的时候,才不会进行跳转。如下说明:

[root@master-node html]# ll /var/www/html/
total 16
-rw-r–r-- 1 www www 143 Dec 14 11:34 index.html
-rw-r–r-- 1 www www 10571 Dec 14 11:35 long.jpg
[root@master-node html]# cat /var/www/html/index.html

发布了401 篇原创文章 · 获赞 256 · 访问量 271万+

猜你喜欢

转载自blog.csdn.net/cdnight/article/details/99288651