关于出口IP大家可能不是很了解。由于互联网上整个ipv4的ip有限,导致了上网的设备不能都分配到公网ip,所以路由器等设备出现了,让一个小区或一个学校等单位共享一个出口IP进行上网。
再回到我们今天的主题,通常现在ip访问有3种做法:
1.机房的网络设备限制(通过交换机,路由器,防火墙进行现在).
2.通过程序进行限制.
3.通过部署的web容器进行限制(tomcat,jboss,nginx,apache等).

通过程序进行限制,主要是根据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替换掉,改成真正的地址。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐