阿里雲X-Forwarded-For 發現tomcat記錄的日誌全部來自於SLB轉發的IP地址,不能獲取到請求的真實IP。
阿新 • • 發佈:2019-02-09
1、背景:阿里雲的SLB的負載均衡,在tomcat中獲取不到真實IP,而是阿里的內網IP,SLB中倆臺或者3臺本身是區域網,這裡是SLB原理,可以看看,沒怎麼看懂,呵呵,要細細讀下。
2、需要開啟tomcat的X-Forwarded-For,在tomcat/conf/server.xml中有一個如下的AccessLogValve 日誌紀錄功能,當配置中的pattern=common時,對應的日誌是如下,無論正常請求和非法請求都會記錄。
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern='commont' resolveHosts="false"/>
3、修改pattern為pattern='%{X-Forwarded-For}i %h %l %u %t "%r" %s %b',則會記錄headers頭中的X-Forwarded-For資訊,可以使用fiddle抓取到X-Forwarded-For資訊
4、獲取tomcat中的X-Forwarded-For,前提阿里雲需要開啟獲取真實IP如下圖:
5、Java程式碼獲取X-Forwarded-For
/** * 獲取ip地址,防止叢集、代理 * @param request * @return ip */ public static String getAddr(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; }