使用apache ProxyPass和ProxyPassReverse时,保留远程IP(以保护端点)

时间:2014-06-12 21:20:49

标签: java apache jboss

我们目前有一个apache服务器将请求传递给运行我们的应用程序的JBoss服务器。在JBoss方面,在ContainerRequestFilter实现中,我获取了HttpServletRequest对象的句柄以获取远程地址(request.getRemoteAddr())。但是,返回的IP是Apache服务器的IP,而不是远程主机。

我知道我可以查看请求标头," x-forwarded-for"找到"真实" IP地址,但IP地址用于限制对我们应用程序中某些休息端点的访问。有人在这看到问题吗?快速欺骗x-forwarded-for标题和我在。

我的问题是:如何保留远程IP地址以限制对我们的端点的访问,而不是使用" x-forwarded-for"总而言之,因为它只是在等待被滥用?

这是我们缩写的apache配置文件:

<VirtualHost 192.168.42.60:80>
  ....
  RewriteCond %{SERVER_PORT} !^443$
  RewriteRule ^.*$ https://www.ourappaddress.com%{REQUEST_URI} [L,R]
  ...
</VirtualHost>

<VirtualHost 192.168.42.60:443>
  ProxyPass / http://appserver:8080/app
  ProxyPassReverse / http://appserver:8080/app
</VirtualHost>

这是简化的拦截器代码:

package com.ourcompany.interceptor;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.Provider;

import com.ourcompany.interceptor.annotation.IpRestricted;


@Provider @IpRestricted
public class IpInspector implements ContainerRequestFilter {
  @Context
  HttpServletRequest request;

  @Override
  public void filter(ContainerRequestContext containerRequestContext)
      throws IOException {

    String ip = request.getRemoteAddr(); // this gives me apache's IP, not remote IP!

    if (!isIpAuthorized(ip)) {
      containerRequestContext.abortWith(Response.ok("not authorized").build());
    }
  }

0 个答案:

没有答案