nginx进阶——访问限制的一些骚操作

nginx进阶——访问限制的一些骚操作

经验文章nimo972025-06-18 19:13:021A+A-

前言

公司开发了后台系统网站,用于对接各种公司开发的设备;
网站部署在机房,通过防火墙将内网服务器和公网ip进行了映射;

场景一:只允许域名访问网站,不允许通过ip访问

描述:如果你的网站没有配置此类的拦截规则,那么大概率会遭到恶意请求攻击。全球的公网ip是都是暴露在大众下的,每天都有大量的扫描工具在不停的扫描,一旦扫描到你的公网ip,继而进行端口扫描,你的web也就不可避免的暴露出来。

示例:

...
server {
	listen 80;
	server_name www.abcd.com;
	if ($host != 'www.abcd.com') {
		return 403;
	}

	location / {
		...
	}
}
...

通过上述配置,只有web端使用 www.abcd.com 的域名访问才不会被拦截,其余的都会返回403的错误;

杠精抬杠:我通过ip可以反查到对应的域名啊,这样也就可以攻击了;
我:这个配置是拦截了大部分自动扫描的机器人,如果通过反查再进行攻击,就属于人为的定向攻击了,另当别论;出门左转,不送!

场景二:允许多个域名访问网站,不允许通过ip访问

描述:如果有多个域名指向同一个公网ip呢?对,通常我们也会用域名的方式进行功能区分。比如:blog.abcd.com 是博客网站,www.abcd.com是公司系统网站......

示例配置:

...
server {
	listen 80;
	server_name www.abcd.com blog.abcd.com;

	set $flag 0;
	if ($host = 'www.poct.cloud') {
	    set $flag 1;
	}
	if ($host = 'blog.abcd.com') {
	    set $flag 1;
	}
	if ($flag != 1) {
	    return 403;
	}

	location / {
		...
	}
}
...

看懂了不,先设置一个变量flag,初始值为0;如果使用 www.poct.cloud 访问的,flag就会变成1,后面以此类推,最后判断 flag 的值,为0还是为1;如果不是使用www或blog来访问的,flag就还保持默认值,判断flag不为1,则返回403;满足任意条件,则flag为1,则通过。

场景三:多网卡ip,配置拦截和放行规则

在实际环境中刚改完,问题就来了,另一个开发部门的同事找过来,说请求403了。排查、对接发现,他们使用了内网的网卡进行的请求,被我配置的ip访问限制给拦截了;
系统有两个网卡,一个是 192.168.10.10(通过防火墙和公网ip做了映射),一个是 172.10.10.10(另一个部门开发的设备通过vpn来访问的,设备的请求通过vpn到达172.10.10.10,例如:https://172.10.10.10/api/)。

示例配置:

...
server {
	listen 80;
	server_name www.abcd.com blog.abcd.com;

	set $flag 0;
	if ($host = 'www.poct.cloud') {
	    set $flag 1;
	}
	if ($host = 'blog.abcd.com') {
	    set $flag 1;
	}
	if ($host = '172.10.10.10') {
		set $flag 1;
	}
	if ($flag != 1) {
	    return 403;
	}

	location / {
		...
	}
}
...

再加一个flag参数的判断就ok了;

点击这里复制本文地址 以上内容由nimo97整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

尼墨宝库 © All Rights Reserved.  蜀ICP备2024111239号-7