本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
在12306上买过票的人都知道它有一个封ip的功能。这个功能有利也有弊,有利是可以预防恶意攻击,恶意访问;而弊则是这种限制ip的做法,限制的是出口ip,而不是正在访问12306的这台电脑,这样就会导致使用同一个出口ip的用户都无法访问12306。
关于出口IP大家可能不是很了解。由于互联网上整个ipv4的ip有限,导致了上网的设备不能都分配到公网ip,所以路由器等设备出现了,让一个小区或一个学校等单位共享一个出口IP进行上网。
再回到我们今天的主题,通常现在ip访问有3种做法:
1.机房的网络设备限制(通过交换机,路由器,防火墙进行现在).
2.通过程序进行限制.
3.通过部署的web容器进行限制(tomcat,jboss,nginx,apache等).
我主要介绍第2种和第三种做法。通过程序进行限制,主要是根据http协议带的ip头,或者socket带的ip信息来进行限制。限制步骤如下:
1.新建一个拦截器,http和socket都可以创建拦截器进行拦截。
2.获取ip头信息,http获取方法如下:
public static String getIpAddress(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if ((ip == null) || (ip.length() == 0) || ("unknown".equalsIgnoreCase(ip))) ip = request.getHeader("Proxy-Client-IP"); if ((ip == null) || (ip.length() == 0) || ("unknown".equalsIgnoreCase(ip))) ip = request.getHeader("WL-Proxy-Client-IP"); if ((ip == null) || (ip.length() == 0) || ("unknown".equalsIgnoreCase(ip))) ip = request.getRemoteAddr(); if(ip.startsWith(Constant.HUPU_ZERO)){ try { ip=InetAddress.getLocalHost().getHostAddress(); } catch (UnknownHostException e) { logger.error("获取本机网络IP异常!"+e.getMessage(),e); } } return ip; }
通过socket获取方法如下(InetSocketAddress对象的方法):
getRemoteAddress().getAddress().getHostAddress();
3.匹配限制的ip,如何相同则进行拦截。
通过容器tomcat的限制方法如下:
找到tomcat配置文件server.xml,在<Host>节点之前配置
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.1.*" deny=""/>
之后重启,就会限制192.168.1.*网段的所有ip进行访问。allow="192.168.1.8"是限制192.168.1.8这个ip,限制多个ip或多个网段用英文逗号隔开。
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.1.8,192.168.1.9" deny=""/>
在tomcat的server.xml里面可以配置两个vavle来限制ip访问,可以使用allow配置白名单,用deny配置黑名单,都支持正则配置匹配,可以把这个vavle配置在any Catalina container (Engine, Host, or Context)的任何一个,只会有不同的作用于,可以用ip4或者ip6地址;denyStatus是黑名单访问的http状态码,
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" deny="178.238.\d+.\d+" denyStatus=“403”/>
tomcat还有Remote Host Filter RemoteHostValve这个来表示域名的匹配
<Valve className="org.apache.catalina.valves.RemoteHostValve" allow="www.aaa.com" deny="www.bbb.com" denyStatus=“403”/>
org.apache.catalina.valves.RemoteIpValve 这个vavle可以用来把代理或者负载均衡机器或者request header中的X-Forwarded-For的ip把request的remote ip替换掉,改成真正的地址。
原文地址:http://www.xttblog.com/?p=332
最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » 实现网站封IP限制IP访问