服务器A被服务器B代理的,怎么能获取客户段的真实IP地址,现在在服务器A上获取的IP地址全是代理服务器B的IP地址,怎么样能获取真实的客户端的IP地址

解决方案 »

  1.   

    -----------以下为LZ Google的
    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。 
        如果使用了反向代理软件,将http://192.168.1.110:2046/ 的URL反向代理为 http://www.bt285.cn / 的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1 或 192.168.1.110,而并不是客户端的真实IP。    经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。当我们访问http://www.5q520.cn /index.jsp/ 时,其实并不是我们浏览器真正访问到了服务器上的index.jsp文件,而是先由代理服务器去访问http://192.168.1.110:2046/index.jsp ,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问index.jsp的,所以index.jsp中通过request.getRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。    于是可得出获得客户端真实IP地址的方法一:public String getRemortIP(HttpServletRequest request) {
      if (request.getHeader("x-forwarded-for") == null) {
       return request.getRemoteAddr();
      }
      return request.getHeader("x-forwarded-for");
     }     可是当我访问http://www.5a520.cn /index.jsp/ 时,返回的IP地址始终是unknown,也并不是如上所示的127.0.0.1 或 192.168.1.110了,而我访问http://192.168.1.110:2046/index.jsp 时,则能返回客户端的真实IP地址,写了个方法去验证。原因出在了Squid上。squid.conf 的配制文件 forwarded_for 项默认是为on,如果 forwarded_for 设成了 off  则:X-Forwarded-For: unknown    于是可得出获得客户端真实IP地址的方法二:public String getIpAddr(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();
           }
           return ip;
       } 
        可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,究竟哪个才是真正的用户端的真实IP呢?    答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。    如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100用户真实IP为: 192.168.1.110
      

  2.   

    String ip=request.getRemoteAddr();
      

  3.   

    http://hi.baidu.com/yuxinglian/blog/item/2a657acedb92f130b600c8bf.html
      

  4.   

    2楼 这位兄弟x114944880说的好啊·· 但是我就是你说的那样做的·
    下面是我获取IP的方法·
     public String getIpAddr(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();
            }
            return ip;
        }
    但问题是还是获取不到真实的IP,还是获取的代理服务器的IP啊·
    请问各位大侠问题出在那里啊·?
      

  5.   

    以前只知道request.getRemoteAddr();
      

  6.   

    /**
     * 获取客户IP
     * @param request
     * @return
     */
    public String getIpAddr(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();
    }
    return ip;
           }
    --------------
    我也是这样获取的,
    你说的是获取客服端IP,这样就是真实的客服端IP
    那与服务器代理有什么关系啊。
      

  7.   

    11楼你确信能获取到真实的IP地址吗?我是已经验证过了,那方法只能获取到代理服务器的IP,获取不到访问者的真实IP
    郁闷啊
      

  8.   

      public static String getIpAddr(HttpServletRequest request)
      {
        String ip = null;
        Enumeration enu = request.getHeaderNames();
        while (enu.hasMoreElements()) {
          String name = (String)enu.nextElement();
          if (name.equalsIgnoreCase("X-Forwarded-For")) {
            ip = request.getHeader(name);
          }
          else if (name.equalsIgnoreCase("Proxy-Client-IP")) {
            ip = request.getHeader(name);
          }
          else if (name.equalsIgnoreCase("WL-Proxy-Client-IP")) {
            ip = request.getHeader(name);
          }      if ((ip != null) && (ip.length() != 0))
            break;    }    if ((ip == null) || (ip.length() == 0))
          ip = request.getRemoteAddr();    return ip;
      }用这个吧,绝对没问题,除非你的环境是集群的。
      

  9.   

    17 楼的方法我也试了还是不行··服务器是用SSH代理来着··难道真的不能获取真实的IP
      

  10.   

      public static String getIpAddr(HttpServletRequest request) 
      { 
        String ip = null; 
        Enumeration enu = request.getHeaderNames(); 
        while (enu.hasMoreElements()) { 
          String name = (String)enu.nextElement(); 
          if (name.equalsIgnoreCase("X-Forwarded-For")) { 
            ip = request.getHeader(name); 
          } 
          else if (name.equalsIgnoreCase("Proxy-Client-IP")) { 
            ip = request.getHeader(name); 
          } 
          else if (name.equalsIgnoreCase("WL-Proxy-Client-IP")) { 
            ip = request.getHeader(name); 
          }       if ((ip != null) && (ip.length() != 0)) 
            break;     }     if ((ip == null) || (ip.length() == 0)) 
          ip = request.getRemoteAddr();     return ip; 
      }
      

  11.   

    真的IP在你提交服务器后就已经找不到了,无论是后台,还是在前台,服务器会做一些自我的修改,比如在页面上,如果不经过服务器的话,也就是静态调试页面,用javascript取得的地址就是绝对的地址,可是如果提交到服务器上,同样的javaScript语句得到的是服务器的一个path地址。我本来想从这个地址来回访文件,计算本件的大小的,看为只能放弃了。
      

  12.   

    并没有返回客户端,而是通过 file f=new file(“path”);
    然后通过String fileSize=(double)(f.length()/1024/1024)+"M";
    得到文件的大小,如果path是绝对地址的话,那么fileSize就是能得到的。比如path="c://dd/f.rar"那么 f.rar的大小就能得到。
      

  13.   


    public String getIpAddr() {
        String ipAddress = null;
        ipAddress = request.getRemoteAddr();
        ipAddress = request.getHeader("x-forwarded-for");
        if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
        ipAddress = request.getHeader("Proxy-Client-IP");
        }
        if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = request.getHeader("WL-Proxy-Client-IP");
        }
        if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = request.getRemoteAddr();
        }    //对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
        if(ipAddress!=null && ipAddress.length()>15){ //"***.***.***.***".length() = 15
            if(ipAddress.indexOf(",")>0){
                ipAddress = ipAddress.substring(0,ipAddress.indexOf(","));
            }
        }
        return ipAddress; 
      }
      

  14.   

    Java code
    public String getIpAddr() {
        String ipAddress = null;
        ipAddress = request.getRemoteAddr();
        ipAddress = request.getHeader("x-forwarded-for");
        if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
        ipAddress = request.getHeader("Proxy-Client-IP");
        }
        if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = request.getHeader("WL-Proxy-Client-IP");
        }
        if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = request.getRemoteAddr();
        }    //对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
        if(ipAddress!=null && ipAddress.length()>15){ //"***.***.***.***".length() = 15
            if(ipAddress.indexOf(",")>0){
                ipAddress = ipAddress.substring(0,ipAddress.indexOf(","));
            }
        }
        return ipAddress; 
      }
    ipAddress = request.getRemoteAddr();
    该处就可以获得代理的IP,下面的代码点用都没有难道就不能获得真实的IP吗
      

  15.   

    public String getIpAddr(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();
    }
    //可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串Ip值
    //是取X-Forwarded-For中第一个非unknown的有效IP字符串
    String[] str = ip.split(",");
    if(str!=null && str.length>1){
    ip = str[0];
    }
    return ip;
    }
      

  16.   

    public String getIpAddr(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(); 

    //可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串Ip值 
    //是取X-Forwarded-For中第一个非unknown的有效IP字符串 
    String[] str = ip.split(","); 
    if(str!=null && str.length>1){ 
    ip = str[0]; 

    return ip; 
    }不管是那个方法request.getHeader("x-forwarded-for"); 
    request.getHeader("Proxy-Client-IP"); 
     request.getHeader("WL-Proxy-Client-IP"); 
    这样去获取IP都是为空的
     request.getRemoteAddr()这里可以获取到IP,但是就是获取到代理的IP啊·
    有人知道为什么不啊?
    另外看到一些专门做IP限制的,能穿过代理,获取真实的IP,不知道是什么原理,希望有人赐教,谢谢
      

  17.   

    是不是这种问题要看 RFC 标准里面是如何介绍的?
      

  18.   

    帖子发了这么久,我现在是弄明白这个服务器之间的代理了。我这里说的代理是指在在两台linux服务器之间,建立一个安装通道,通过这个通道来转发请求,上面各位的答复都不是正确的方法,根本没办法拿到客户到得真实IP。代理结构图客户端--》代理服务器--》真实服务器在代理服务器与真实服务器之间建立一个linux下面的安全通道,代理服务器将客户端的请求转发真实服务器
      

  19.   

    看了楼上各们的回答,其实得到的都不是网络IP只能得到像192.168.……这样的IP,这没有什么用的。下面可以得到机子在实际网络中的IP.具体怎么能得到客户端的很是个问题,java代码可是运行是服务器上的.
    public class GetIPMAC {
    String OutPutStream = new String();
    int a;
    char b;
    int power = 1;
    String c = null;
    String res;
    URLConnection urlcon; public String dayinji(int power, char d) { if (power == 1) {
    res = String.valueOf(d);
    } else {
    res = "";
    }
    return res;
    } public String getIP() {
    try {
    URL url = new URL("http://www.cz88.NET/ip/viewip468.ASPx");
    urlcon = url.openConnection();
    int i = urlcon.getContentLength();
    if (i > 0) {
    InputStream isr = urlcon.getInputStream();
    InputStreamReader is = new InputStreamReader(isr, "GB2312");
    int spower = 0;
    while ((a = is.read()) != -1) {
    b = (char) a;
    OutPutStream = OutPutStream + "" + dayinji(power, b);
    c = String.valueOf(b);
    if (OutPutStream.indexOf("IPMessage\">") > 0) {
    OutPutStream = "";
    power = 1;
    spower = 1;
    }
    if (spower == 1) {
    if (c.equalsIgnoreCase("<")) {
    power = 0;
    }
    }
    }
    OutPutStream = OutPutStream.replaceAll(">", "");
    OutPutStream = OutPutStream.replaceAll("", "");
    OutPutStream = OutPutStream.replaceAll("<", "");
    } else {
    System.out.println("Length is null.");
    }
    } catch (MalformedURLException e) {
    e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    return OutPutStream;
    }
    }
      

  20.   

    如果是内部应用系统倒是可以考虑用js获取:
    <html>
    <head>
    <script language="javascript">
    var MACAddr;
    var IPAddr;
    var DomainAddr;
    var sDNSName;
    function valid(){
        //获取本机地址信息
        document.form1.remoteIPAddr.value = IPAddr;
        document.form1.remoteMACAddr.value = MACAddr;
        document.form1.remoteName.value = sDNSName;
    }
    </script>
    <script language="javascript" event=OnObjectReady(objObject,objAsyncContext) for=foo>
    if(objObject.IPEnabled != null && objObject.IPEnabled != "undefined" && objObject.IPEnabled == true) {
        if(objObject.MACAddress != null && objObject.MACAddress != "undefined"){
            MACAddr = objObject.MACAddress;
        }
        if(objObject.IPEnabled && objObject.IPAddress(0) != null && objObject.IPAddress(0) != "undefined"){
            IPAddr = objObject.IPAddress(0);
        }
        if(objObject.DNSHostName != null && objObject.DNSHostName != "undefined"){
            sDNSName = objObject.DNSHostName;
        }
    }
    </script>
    </head>
    <body>
    <OBJECT id=locator classid=CLSID:76A64158-CB41-11D1-8B02-00600806D9B6 VIEWASTEXT></OBJECT>
    <OBJECT id=foo classid=CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223></OBJECT>
    <SCRIPT language="javascript">
       var service = locator.ConnectServer();
       service.Security_.ImpersonationLevel=3;
       service.InstancesOfAsync(foo, 'Win32_NetworkAdapterConfiguration');
    </SCRIPT>
    </body>
    </html>
      

  21.   

    大家 说的都是一样,还是一个问题,不管怎么样,都是取不到真实的IP,都是代理的IP,寻找答案中