Python认为我使用了不同的IP

2 投票
2 回答
642 浏览
提问于 2025-04-15 21:33

我正在尝试设置一个页面,显示访问者的IP地址。但是我用过的所有方法显示的IP地址都和我电脑的IP不一样。我尝试过:

  1. 查看这个网站 http://www.whatismyip.com/automation/n09230945.asp

  2. 使用这个代码: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地址。

撰写回答