Python认为我使用了不同的IP
我正在尝试设置一个页面,显示访问者的IP地址。但是我用过的所有方法显示的IP地址都和我电脑的IP不一样。我尝试过:
使用这个代码:socket.getaddrinfo(socket.gethostname(), None)[0][4][0]
我该如何找到访问者的真实IP地址呢?
2 个回答
4
使用底层网络接口时,你实际上是在获取运行Python解释器的服务器地址:
"socket.gethostname(): 返回一个字符串,包含当前执行Python解释器的机器的主机名。"
通过低级网络接口获取客户端IP
"socket.accept() 接受一个连接。这个socket必须绑定到一个地址并且在监听连接。返回值是一个元组(conn, address),其中conn是一个新的socket对象,可以用来在这个连接上发送和接收数据,address是连接另一端绑定到socket的地址。"
# Echo server program
import socket
HOST = '' # Symbolic name meaning all available interfaces
PORT = 50007 # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
data = conn.recv(1024)
if not data: break
conn.send(data)
conn.close()
从HTTP头获取客户端IP(如果在提供HTML服务)
REMOTE_ADDR
是包含客户端IP地址的头信息,你应该先检查这个。
你还应该检查HTTP_X_FORWARDED
头,特别是当你的访客通过代理访问时。要注意的是,HTTP_X_FORWARDED
是一个数组,可能包含多个用逗号分隔的值,这取决于代理的数量。
还要注意,你可能会遇到NAT(网络地址转换)。如果你的IP是内部地址(比如10.x.x.x或192.168.x.x等),那么你肯定是在一个NAT路由器后面,只有你的外部IP会暴露给网站。
这里有一小段C#代码,展示了如何确定客户端的IP,逻辑很简单,可以很容易地转换成Python,服务器的头信息是相同的:
string clientIp = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if( !string.IsNullOrEmpty(clientIp) ) {
string[] forwardedIps = clientIp.Split( new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries );
clientIp = forwardedIps[forwardedIps.Length - 1];
} else {
clientIp = context.Request.ServerVariables["REMOTE_ADDR"];
}
0
我找到了一种简单的解决办法:
import getenv
print getenv("REMOTE_ADDR")
这个代码会返回连接到服务器的电脑的IP地址。