`
498320858
  • 浏览: 392916 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

nginx限制域名访问

 
阅读更多

背景:一个未备案的域名恶意解析到我司的服务器,导致服务器托管服务商认为我司故意不备案域名,服务商准备停掉我们的服务器的接入

 

解决思路:

1.通过防火墙限制域名访问

2.设置代理服务器,对于域名不是我司注册的一律限制访问

 

       开始是希望通过防火墙去限制域名的访问,这样开销应该是最小的,但仔细想发现防火墙应该是解决不了这个需求,因为域名解析是在域名服务商那做的,在通过防火墙的时候,域名已经转换成ip地址了。

以下是摘自论坛的说法“

写道
目前的 iptables 是无法实现的
因为 iptables 工作在网络层,他看到的仅仅是数据包
domain 存放在两种数据包中
1、DNS 请求的 udp 包
2、HTTP 请求头部的 host 字段

对于 1 来说,我们得不到它,因为 DNS 请求是去放用户设置的 DNS 地址的,而且即便获得到了也做不了什么
对于 2 来说,我们虽然可以获得 host 字段具体域名,但如果在获得后再转向的话,前面的 connection 已经建立了,后面突然转向就未被了 TCP 工作原理,理论上是无法实现的

但是,利用 squid 或者 nginx 却是可以实现的,他们相当于七层代理,完全把 HTTP 请求截获,换成新的请求发向内网,得到信息再回传给客户,这样可行

至于前面有人说的 mark、tc 等,都是理论上行不通的,违反了 OSI 七层模型中 TCP 传输原理

 ”

      尝试了一段时间后,发现无法通过防火墙来解决这个问题,那就只能切换到nginx前端代理去禁止恶意域名访问了,其实是利用了nginx对不同来路的域名解析到不同服务器的规则实现的,以下为nginx的配置

user  nginx;
worker_processes  3;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

     keepalive_timeout  65;

    #gzip  on;

    #include /etc/nginx/conf.d/*.conf;

    upstream cncamm{
        server 127.0.0.1:8080;
    }

    server {
        listen       80;
        server_name  www.cn-camm.com;
        access_log      /var/log/nginx/cn-camm.server.access.log main;
        if ( $host != 'www.cn-camm.com' ){
             rewrite ^/(.*)$ http://www.emapp.cn/$1 permanent;
        }
        
        location / {
                proxy_pass      http://cncamm;
                proxy_set_header Host $host;
        }

   }

}

 

 

 

 电信人员人工检查域名后发现了我们对恶意域名采用的是转发机制,他们认为还是不行,必须要限制恶意域名的访问,于是只能对恶意域名配置403了,新的配置文件贴出来

user  nginx;
worker_processes  3;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

     keepalive_timeout  65;

    #gzip  on;

    #include /etc/nginx/conf.d/*.conf;
	
    upstream cncamm{
        server 127.0.0.1:8080;
    }	
     
    server {
        listen       80;
        server_name  www.cn-camm.com;
        access_log      /var/log/nginx/cn-camm.server.access.log main;
	if ( $host != 'www.cn-camm.com' ){
#	     rewrite ^/(.*)$ http://www.emapp.cn/$1 permanent;
		return 403;
	}

        location / {
                proxy_pass      http://cncamm;
                proxy_set_header Host $host;
        }
	

   }

 

 以上配置在短时间内确实生效了,可以成功拦截到恶意域名,但是接着问题又来了,现在服务器上有两个应用,并且都同时运行,其中一个应用需要通过localhost

来访问另外一个应用,因为不希望直接通过代理后的ip预计端口访问,希望保持tomcat做前端服务器时的代码,所以localhost依然要通过nginx转发,此时发现以上配置对localhost
也进行了拦截,所以以上配置还需要修改,正常思路是在if判断中再加一层逻辑与 ,但是nginx不支持多重逻辑,此时只能使用nginx的变量了

新版配置如下:
      
user  nginx;
worker_processes  3;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

     keepalive_timeout  65;

    #gzip  on;

    #include /etc/nginx/conf.d/*.conf;

    upstream cncamm{
        server 127.0.0.1:8080;
    }

    server {
        listen       80;
        server_name  www.cn-camm.com;
        access_log      /var/log/nginx/cn-camm.server.access.log main;
set $tag "0";

 if ( $host !~ ^www.cn-camm.com$ ){
                set $tag "$tag,1";
  }

  if ( $host !~ ^localhost$ ){
                set $tag "$tag,2";
   }
 
  if ( $tag ~ ^0,1,2$ ){
                return 403;
    }

location / {
                proxy_pass      http://cncamm;
                proxy_set_header Host $host;
        }

   }

}


以上配置对比之前只允许一个域名可以访问的配置要灵活很多,这里我们可以加入更多允许通过的域名

 

 

分享到:
评论

相关推荐

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

    下面我们就先看看Nginx的默认虚拟主机在用户通过IP访问,或者通过未设置的域名访问(比如有人把他自己的域名指向了你的ip)的时 候生效最关键的一点是,在server的设置里面添加这一行: listen 80 default; 后面的...

    Nginx中rewrite实现二级域名、三级域名、泛域名、路径的重写[文].pdf

    Nginx 中 rewrite 实现二级域名、三级域名、泛域名、路径的重写 Nginx 中的 rewrite 模块是实现 URL 重写和.redirect 的强大工具。下面我们将详细介绍 Nginx 中如何使用 rewrite 实现二级域名、三级域名、泛域名、...

    nginx安装, 解决跨域问题

    访问`http://your_server_ip`,如果看到Nginx的默认欢迎页面,则表明安装成功。 ### 解决跨域问题 跨域问题源于浏览器的安全策略,限制了一个源(域名)的JavaScript代码对另一个源发起HTTP请求。为了解决这个...

    nginx与apache限制ip并发访问 限制ip连接的设置方法

    **Nginx限制IP并发访问** Nginx是一款高效的反向代理和负载均衡服务器,它提供了内置的机制来限制同一IP地址的并发连接数。以下是在Nginx中设置限制的方法: 1. **添加limit_zone指令**: 在`http`上下文中定义一...

    Nginx一个域名访问多个项目的方法实例

    3. location指令的应用实例:在文章提供的配置实例中,通过两个location块实现一个域名访问两个不同项目的配置。例如,对于/test/a1/的请求,Nginx将请求转发到/usr/share/nginx/html/a1/public/目录;对于/test/a2/...

    nginx 映射本地文件

    - **限制访问权限**:确保只允许需要访问的用户或IP地址访问映射的文件。 - **隐藏敏感信息**:不要将敏感数据或配置文件放置在映射的目录下。 - **使用HTTPS**:对于包含敏感信息的文件,推荐使用HTTPS加密传输。 ...

    Nginx限制带宽配置示例

    在许多使用场景中,为了合理分配网络资源,确保...以上就是Nginx限制带宽的三种配置方法,通过这些方法,我们可以有效地控制不同客户端的网络带宽使用,从而使得网络资源得到合理分配,保障服务器性能和用户体验。

    nginx-1.10.2_海康;javascript_nginx/1.10.2_nginx转发海康_

    标签"nginx/1.10.2"指的是Nginx的特定版本1.10.2,这意味着在解决任何问题或进行配置时,应考虑该版本可能存在的已知限制和特性。确保查阅官方文档或社区论坛获取针对该版本的特定信息。 综上所述,这个主题涵盖了...

    nginx动态添加访问白名单的方法

    当用户需要临时访问受限的网站时,他们可以通过特定的URL提交请求,系统会在验证成功后将其IP添加到白名单,同时限制白名单的有效时间。此外,我们还通过HTTP基本认证增强了安全性,防止未经授权的访问。这样的设置...

    nginx文件资源下载

    可以通过限制 IP 地址、设置访问密码或使用 `.htaccess` 文件等方式来实现。 此外,Nginx 还支持 HTTP 范围请求(Range Request),允许客户端(如浏览器)请求文件的特定部分,这对于大文件下载和视频流媒体尤其...

    nginx+ftp图片上传服务器和访问.rar

    注意:为了确保安全,建议限制FTP用户的写入权限仅限于自己的图片目录,并且禁用匿名FTP访问。同时,保持服务器软件的更新以防止安全漏洞。 以上就是关于如何在Linux上部署Nginx和FTP服务,实现图片上传和跨服务器...

    nginx.config_nginx_

    - 可以通过配置限制访问,防止DDoS攻击: ```nginx limit_conn zone_name max_conns; limit_rate rate; deny all; ``` `limit_conn`限制连接数,`limit_rate`限制速率,`deny`阻止所有请求。 以上仅是Nginx...

    nginx-release-1.21.4.zip

    Nginx是一个高性能的HTTP和反向代理服务器,广泛用于网站的负载均衡和内容分发。...通过离线包"nginx-release-1.21.4.zip",我们可以独立部署和管理Nginx服务器,不受网络环境限制,确保服务的稳定运行。

    详细步骤截图。微信,淘宝客api域名检验,centos nginx springboot jar下的验证文件xxx.txt放置于您所配置域名

    - 在Springboot项目中,为了使验证文件可供外部访问,你需要放开对静态资源的访问限制。如果你使用了Shiro进行权限管理,可以在配置中添加一条规则,允许所有人匿名访问`root.txt`。例如: ```java ...

    nginx 离线安装包 pcre nginx 离线安装包 pcre

    7. **验证安装**:通过访问服务器的 IP 地址或域名,确认 Nginx 是否正常工作。如果需要,可以使用 `nginx -t` 检查配置文件的语法正确性,或使用 `nginx -s reload` 重新加载配置。 离线安装 Nginx 和 PCRE 虽然...

    nginx1.8.1

    2. **虚拟主机**:通过 server 块配置,Nginx 可以支持多个域名和端口,实现不同站点的独立管理。 3. **URL 转发**:利用 location 指令,可以设置 URL 路由规则,将特定路径的请求转发到不同的服务或文件。 **四、...

    nginx-rtmp模块源码包nginx-rtmp-module-master

    2. **安全设置**:限制可发布和播放流的 IP 或域名,防止未授权访问。 3. **负载均衡**:通过 Nginx 的反向代理功能,可以实现多服务器负载均衡,提高系统稳定性。 4. **性能优化**:根据服务器硬件和网络状况,调整...

    nginx的各项详细配置-超多注释

    - **server_name**: 指定服务器域名,可以是多个,支持通配符。 - **root**: 设置网站根目录,用于定位静态资源。 - **index**: 指定默认首页文件,如"index.html index.htm"。 - **listen**: 指定服务器监听的端口...

Global site tag (gtag.js) - Google Analytics