需求

我有几个小网站需要穿透出去,为了方便使用和安全,选择了直接使用Nginx实现反向代理和ssl的部署,另外还有一些简单的Nginx防护

  • 反代实现
  • 加密访问(仅本人访问)
  • SSL部署
  • Nginx防护恶意请求

反代实现

server
{
    listen 80;
    server_name www.your_url.com;
    location / {
        proxy_pass http://local456:port/;
        }
}

这样就在80端口实现了对server_name 的反代操作,server_name填写外部请求的url,proxy_pass填写内部你需要反代出去的url

当你对www.your_url.com进行访问的时候,nginx就会转发到http://local456:port/上,就实现了最简单的反向代理

注意需要在系统内部防火墙内开放端口

加密访问

有的站点不需要给别人访问,仅提供给自己,于是就有了加密的需求

这个方法是在百度上翻到的

server {

       listen       80;
       server_name www.your_url.com;

       auth_basic "Authorization";
       auth_basic_user_file /www/server/pass/www.your_url.com.pass;
       location / {

           proxy_pass http://local456:port/;

       }
   }

.pass文件可以使用htpasswd,openssl进行生成,添加完后重新启动Nginx就可以了

当输入url进行访问时,会弹出小窗口提示需要输入账号密码进行验证,输入正确的账号密码即可访问成功

SSL部署

首先需要进行证书的申请,我选择从https://freessl.cn/进行申请

输入邮箱,选择RSA和DNS验证,进行一键申请,接着输入你的域名解析供应商的APIkey,它会自动进行解析参数的添加并在验证成功后删除

之后在KeyManager上的证书管理界面,点击证书的详情,然后再右下角点击查看PEM,对证书和私钥分别进行复制粘贴保存,分别命名为fullchain.pem和privkey.pem,上传至云

然后开始对Nginx进行修改

server {

       listen       80;

       listen       443 ssl;
       server_name www.your_url.com;

       auth_basic "Authorization";
       auth_basic_user_file /www/server/pass/www.your_url.com.pass;
       location / {

           proxy_pass http://local456:port/;

       }

       ssl_certificate    /path_to_pem/fullchain.pem;
       ssl_certificate_key    /path_to_pem/privkey.pem;
       if ($server_port !~ 443){
        rewrite ^(/.*)$ https://$host$1 permanent;
    }
   }

首先开启对443口的监听,分别在ssl_certificate和ssl_certificate_key上填写相应文件的路径,最后写个重定向,当请求非443端口时,强制重定向到443的https链接上

最后保存重启,验证是否成功

简单的Nginx防护

拦截特定UA

if ($http_user_agent ~ "Apache\-HttpClient") {
                return 403;
            }

或者空UA

if ($http_user_agent = '') {
         return 403;
        }

拦截SQL注入

if ($query_string ~* (\$|'|--|[+|(%20)]union[+|(%20)]|[+|(%20)]insert[+|(%20)]|[+|(%20)]drop[+|(%20)]|[+|(%20)]truncate[+|(%20)]|[+|(%20)]update[+|(%20)]|[+|(%20)]from[+|(%20)]|[+|(%20)]grant[+|(%20)]|[+|(%20)]exec[+|(%20)]|[+|(%20)]where[+|(%20)]|[+|(%20)]select[+|(%20)]|[+|(%20)]and[+|(%20)]|[+|(%20)]or[+|(%20)]|[+|(%20)]count[+|(%20)]|[+|(%20)]exec[+|(%20)]|[+|(%20)]chr[+|(%20)]|[+|(%20)]mid[+|(%20)]|[+|(%20)]like[+|(%20)]|[+|(%20)]iframe[+|(%20)]|[\<|%3c]script[\>|%3e]|javascript|alert|webscan|dbappsecurity|style|confirm\(|innerhtml|innertext)(.*)$) { return 555; }

来源:如何配置Nginx防止SQL注入、XSS攻击? - 幸运摩登 - 博客园 (cnblogs.com)

防盗链

    location ~ .*\.(jpg|jpeg|gif|png|js|css)$
    {
        expires      30d;
        valid_referers your_url.com;
        if ($invalid_referer){
           return 404;
        }
    }

当referer不为your_url.com的时候,资源请求直接返回404,防止外部访问

还有防CC,防外国IP访问,等等就不赘述