背景:一个未备案的域名恶意解析到我司的服务器,导致服务器托管服务商认为我司故意不备案域名,服务商准备停掉我们的服务器的接入
解决思路:
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 传输原理
因为 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访问,或者通过未设置的域名访问(比如有人把他自己的域名指向了你的ip)的时 候生效最关键的一点是,在server的设置里面添加这一行: listen 80 default; 后面的...
本文介绍了通过nginx代理拦截请求进行全局访问限制,分享给大家,具体如下: 运行环境: Ubantu 14.0 tomcat7 nginx 1.4.6(更新后1.5.6) 项目中经常会用到权限管理,必然的就会存在权限的设定和验证;对于登陆...
nginx限制ip并发数,也是说限制同一个ip同时连接服务器的数量,要使apache服务器做对同一IP地址的连接限制,需要mod_limitipconn来实现。一般需要手动编译。不过模块作者也提供了一些编译好的模块,根据自己的apache...
DENY:浏览器拒绝当前页面加载任何Frame页面SAMEORIGIN:frame页面的地址只能为同源域名下的页面ALLOW-FROM:允许frame加载的页面地址 PHP代码:复制代码 代码如下:header(‘X-Frame-Options:Deny’); Nginx配置:复制...
当然浏览器的并发请求数目限制是针对同一域名的,同一时间针对同一域名下的请求有一定数量限制,超过限制数目的请求会被阻塞。 首先我们看下各个浏览器的并发连接数: 罗列一下浏览器这么决定可能有什么考虑 由于...
主要介绍了nginx 配置跨域失效修复的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
一、NGINX目录保护及访问限制 Nginx保护目录的配置如下,目录密码保护文件是 /usr/local/nginx/htpasswd location ~ /admin { #admin为要保护的目录名称,location 的意思就是保护从网页根目录算起的admin 目录 ...
微信公众号多域名回调功能:微信公众号后台默认只能授权2个网页域名,用本系统突破这个限制,用同一个公众号对接无限多个网站。网站后台支持回调域名白名单的管理,以及登录记录的查看。 微信access_token获取功能...
加入php host功能限制每个网站的访问目录,防止跨目录,更安全!解决nginx 0day漏洞! DebianLNMP特点:1. 独特的DebianLNMP安全增强设置。2. 新软件库基于http://www.dotdeb.org/可保持同步更新。3. Nginx MySQL ...
本文主要介绍了nginx 多个location转发任意请求或访问静态资源文件的实现,分享给大家,具体如下: server { #监听的端口 listen 80; #监听的域名 server_name localhost; #监听带后缀的url location ^~\.txt...
浏览器缓存域名也是有限制的,不仅浏览器缓存大小有限制,而且缓存的时间也有限制,通常情况下为几分钟到几小时不等,域名被缓存的时间限制可以通过TTL属性来设置。 这个缓存时间太长和太短都不太好,如果时间太长,...
PHP_MEMORY_LIMIT在php.ini设置的内存限制UPLOAD_MAX_FILESIZE -PHP和Nginx的上传文件大小限制MAGENTO_RUN_MODE有效值,如Magento\Framework\App\State : developer , production , default 。 MAGENTO_ROOT -...
上传源码至服务器访问域名按提示安装即可 如出码较慢可尝试降低nginx版本 发信邮箱不可使用QQ邮箱其余的都行 本版本为免授权版本除微信云端外全部走本地不受云端限制所以无需授权(微信云端官方未加限制) 安装完成后...
微信公众号后台默认只能授权2个网页域名,用本系统突破这个限制,用同一个公众号对接无限多个网站。 网站后台支持回调域名白名单的管理,以及登录记录的查看。 本系统还有微信access_token的获取功能,可让当前...
微信公众号后台默认只能授权2个网页域名,用本系统可突破这个限制,用同一个公众号对接无限多个网站。网站后台支持回调域名白名单的管理,以及登录记录的查看。 本系统还有微信access_token的获取功能,可让当前站点...
可以设置九折优惠券吸引流量,支持限制每月充值次数,本来是默认限制每月一次的,我把限制取消了,限制的方法备注在里面。文本教程里也非常详细的指出了,短信API对接的是短信宝,就没有改动。这个就不上图了,有...
2.Nginx 1.18.0 3.MySQL 5.6.50 4.PHP-5.6 //PHP5.6安装拓展 fileinfo 删除所有禁用函数 1.创建站点 1)上传源码并解压 2)设置网站伪静态 /thinkphp 2.创建数据库 1)上传并导入数据库 2)修改数据库信息 /config/...
2.Nginx 1.18.0 3.MySQL 5.6.50 4.PHP-5.6 //PHP5.6安装拓展 fileinfo 删除所有禁用函数 1.创建站点 1)上传源码并解压 2)设置网站伪静态 /thinkphp 2.创建数据库 1)上传并导入数据库 2)修改数据库信息 /config/...