後端真實伺服器ip地址
A. 如何取得反向代理的真實ip
問題引出:
<hr/>
在JSP里,獲取客戶端的IP地址的方法是:request.getRemoteAddr(),這種方法在大部分情況下都是有效的。但是在通過了 Apache,Nagix等反向代理軟體就不能獲取到客戶端的真實IP地址了。如果使用了反向代理軟體,用 request.getRemoteAddr()方法獲取的IP地址是:127.0.0.1或 192.168.1.110,而並不是客戶端的真實IP。
經過代理以後,由於在客戶端和服務之間增加了中間層,因此伺服器無法直接拿到客戶端的 IP,伺服器端應用也無法直接通過轉發請求的地址返回給客戶端。但是在轉發請求的HTTP頭信息中,增加了X-FORWARDED-FOR信息。用以跟蹤原有的客戶端 IP地址和原來客戶端請求的伺服器地址。
舉例來說,當我們訪問口碑網首頁hangzhou.jsp時,其實並不是我們瀏覽器真正訪問到了伺服器上的hangzhou.jsp 文件,而是先由代理伺服器Nagix去訪問hagnzhou.jsp ,代理伺服器再將訪問到的結果返回給我們的瀏覽器,因為是代理伺服器去訪問hangzhou.jsp的,所以hangzhou.jsp中通過 request.getRemoteAddr()的方法獲取的IP實際上是代理伺服器的地址,並不是客戶端的IP地址。
<hr/>
獲得客戶端真實IP地址的方法一:
public String getRemortIP(HttpServletRequest request) {
if (request.getHeader("x-forwarded-for") == null) {
return request.getRemoteAddr();
}
return request.getHeader("x-forwarded-for");
}
<hr/>
獲得客戶端真實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;
}
<hr/>
B. 伺服器的IP地址就能真實反映他的實際地址嗎可以虛擬嗎比如在國內的伺服器IP地址確實國外的
確實不能真實反映實際地址,像QQ什麼的使用代理後就變成國外的啦。同意正宗大獃子
C. nginx做反向代理負載均衡 Java怎麼獲取後端伺服器獲取用戶IP
首先,在前端nginx上需要做如下配置:
location /
proxy_set_hearder host $host;
proxy_set_header X-forwarded-for $proxy_add_x_forwarded_for;
proxy_set_header X-real-ip $remote_addr;
};
nginx會在把請求轉向後台real-server前把http報頭中的ip地址進行替換;這樣操作完成後,real-server也需要做一些操作;
public class ClientIPUtils {
/**
* 在很多應用下都可能有需要將用戶的真實IP記錄下來,這時就要獲得用戶的真實IP地址,在JSP里,獲取客戶端的IP地
* 址的方法是:request.getRemoteAddr(),這種方法在大部分情況下都是有效的。但是在通過了Apache,Squid等
* 反向代理軟體就不能獲取到客戶端的真實IP地址了。
* 但是在轉發請求的HTTP頭信息中,增加了X-FORWARDED-FOR信息。用以跟蹤原有的客戶端IP地址和原來客戶端請求的伺服器地址。
* @param request
* @return
*/
public static String getClientIp(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
//String ip = request.getHeader("X-real-ip");
logger.debug("x-forwarded-for = {}", ip);
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
logger.debug("Proxy-Client-IP = {}", ip);
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
logger.debug("WL-Proxy-Client-IP = {}", ip);
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
logger.debug("RemoteAddr-IP = {}", ip);
}
if(StringUtils.isNotBlank(ip)) {
ip = ip.split(",")[0];
}
return ip;
}
}
D. IP地址代表著什麼真實地址嗎
IP地址只是一個邏輯上的地址,並不是真實地址。
IP地址在公網上是唯一的,在私網里也是唯一的,但是屬於不同私網的IP地址可能相同。
192.168.0.x
172.16.x.x
10.X.X.X.
這些都是私網地址,不能在公網出現。
私網地址通過NAT技術與公網地址通信。
IP地址在公網唯一並不代表每台主機的IP地址固定不變。
這取決於網路環境,情況比較復雜,比如DHCP伺服器的配置等等。
但是一般來說,IP地址所屬的是網段是不會變的。(可以理解為IP地址的前幾個數字,具體是幾個數字在不同的網路是不一樣的。牽扯到子網掩碼的概念,這里不多說了)
真實地址是MAC地址,也就是物理地址。每塊網卡都有一個全球唯一的MAC地址。
路由器會記錄你當前的IP地址與MAC地址的綁信息,從而保證發往你IP地址的報文能准確的發往你的MAC地址,也就是你的網卡。(這個綁定信息就是ARP表項)
大體上是這樣,有什麼疑問請補充。
E. 實IP地址於虛IP地址的區別
IP地址好像不分實和虛
或者說你是問的電腦的真實IP,和使用代理伺服器後的IP有什麼區別?
電腦真實的IP地址就是服務商給你分配的上網IP,用這個IP可以找到你真實的位置。
而使用代理伺服器後的IP就好像一個中轉站,不使用代理伺服器時,你要訪問網路,比如網路,是你自己真實的IP直接向網路的伺服器提出請求,然後網路在回應你的IP,然後你就可以訪問了。而使用代理伺服器後,是你的IP先向你所使用的代理伺服器,提出 你要訪問網路的請求,代理伺服器在把你的訪問請求轉給網路,然後網路再向你所使用的代理伺服器回應,代理伺服器在向你回應。
IP只分以下幾類:
1.A類IP地址
一個A類IP地址由1位元組的網路地址和3位元組主機地址組成,網路地址的最高位必須是「0」, 地址范圍1.0.0.1-126.255.255.254(二進製表示為:00000001 00000000 00000000 00000001 - 01111110 11111111 11111111 11111110)。可用的A類網路有126個,每個網路能容納1600多萬個主機。
2.B類IP地址
一個B類IP地址由2個位元組的網路地址和2個位元組的主機地址組成,網路地址的最高位必須是「10」,地址范圍128.1.0.1-191.254.255.254(二進製表示為:10000000 00000001 00000000 00000001 - 10111111 11111110 11111111 11111110)。可用的B類網路有16382個,每個網路能容納6萬多個主機 。
3.C類IP地址
一個C類IP地址由3位元組的網路地址和1位元組的主機地址組成,網路地址的最高位必須是「110」。范圍192.0.1.1-223.255.255.254(二進製表示為: 11000000 00000000 00000001 00000001 - 11011111 11111111 11111110 11111110)。C類網路可達209萬余個,每個網路能容納254個主機。
4.D類地址用於多點廣播(Multicast)。
D類IP地址第一個位元組以「1110」開始,它是一個專門保留的地址。它並不指向特定的網路,目前這一類地址被用在多點廣播(Multicast)中。多點廣播地址用來一次定址一組計算機,它標識共享同一協議的一組計算機。
地址范圍224.0.0.1-239.255.255.254
5.E類IP地址
以「11110」開始,為將來使用保留。
E類地址保留,僅作實驗和開發用。
F. 如何查詢代理伺服器下的真實IP地址
vpn具有全局代理的特點,也就是說在連接VPN成功之後,所用上網活動都是通過代理之後的IP地址進行的,包括網頁瀏覽, 外服網路 游戲視頻欣賞和投票,注冊之類的,雙魚IP轉換器主要採用了隧道技術、加解密技術、密鑰管理技術和使用者與設備身份認證技術。實現外網IP地址更改,更改之後的IP地址在網路查詢
G. nginx做反向代理負載均衡 Java怎麼獲取後端伺服器獲取用戶IP
nginx做反向負載均衡,後端伺服器獲取真實客戶端ip方法:附上關鍵步的解釋。
首先,在前端nginx上需要做如下配置:
location /
proxy_set_hearder host $host;
proxy_set_header X-forwarded-for $proxy_add_x_forwarded_for;
proxy_set_header X-real-ip $remote_addr;
};
nginx會在把請求轉向後台real-server前把http報頭中的ip地址進行替換;這樣操作完成後,real-server也需要做一些操作;
public class ClientIPUtils {
/**
* 在很多應用下都可能有需要將用戶的真實IP記錄下來,這時就要獲得用戶的真實IP地址,在JSP里,獲取客戶端的IP地
* 址的方法是:request.getRemoteAddr(),這種方法在大部分情況下都是有效的。但是在通過了Apache,Squid等
* 反向代理軟體就不能獲取到客戶端的真實IP地址了。
* 但是在轉發請求的HTTP頭信息中,增加了X-FORWARDED-FOR信息。用以跟蹤原有的客戶端IP地址和原來客戶端請求的伺服器地址。
* @param request
* @return
*/
public static String getClientIp(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
//String ip = request.getHeader("X-real-ip");
logger.debug("x-forwarded-for = {}", ip);
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
logger.debug("Proxy-Client-IP = {}", ip);
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
logger.debug("WL-Proxy-Client-IP = {}", ip);
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
logger.debug("RemoteAddr-IP = {}", ip);
}
if(StringUtils.isNotBlank(ip)) {
ip = ip.split(",")[0];
}
return ip;
}
}
H. 如何查伺服器的真實IP地址
可以通過DOS命令來初步判斷,例如:netstat ip -a 具體請自行網路DOS命令每條命令的用途