Python认为我';我是另一个IP

Python认为我';我是另一个IP,python,ip,Python,Ip,我正在尝试设置一个显示访问者IP的页面。我尝试过的所有方法都显示IP与我的计算机的IP不同。我试过: 仰望 使用socket.getaddrinfo(socket.gethostname(),None)[0][4][0] 如何找到访问者的真实IP?使用低级网络接口,您实际上可以获得运行python解释器的服务器的地址: “socket.gethostname():返回一个字符串,其中包含Python解释器当前正在执行的计算机的主机名。” 使用低级网络接口获取客户端ip socket.accept

我正在尝试设置一个显示访问者IP的页面。我尝试过的所有方法都显示IP与我的计算机的IP不同。我试过:

  • 仰望

  • 使用socket.getaddrinfo(socket.gethostname(),None)[0][4][0]


  • 如何找到访问者的真实IP?

    使用低级网络接口,您实际上可以获得运行python解释器的服务器的地址:

    “socket.gethostname():返回一个字符串,其中包含Python解释器当前正在执行的计算机的主机名。”

    使用低级网络接口获取客户端ip

    socket.accept()接受连接。套接字必须绑定到地址并侦听连接。返回值是一对(conn,address),其中conn是一个新的套接字对象,可用于发送和接收连接上的数据,address是绑定到连接另一端的套接字的地址

    从HTTP头获取客户端IP(如果提供html)

    REMOTE\u ADDR
    是包含客户端ip地址的头,您应该首先检查该地址

    您还应该检查HTTP_X_FORWARDED标题,以防您的访问者通过代理。请注意,
    HTTP\u X\u FORWARDED
    是一个数组,它可以包含多个逗号分隔的值,具体取决于代理的数量

    另外,请注意,您可能会感到不适()。如果你的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"];
    }
    

    我找到了一个简单的解决方案:

    import getenv
    print getenv("REMOTE_ADDR")
    

    这将返回连接到服务器的计算机的IP地址。

    您是在文件墙后面还是在nat路由器后面?python是不是说你的代码是192.168。。。。还是10.10?你想知道你的外部IP地址吗?根据whatismyip,我的IP是128.2.xxx.xxx,根据Python,我的IP是72.47.xxx.xxx,你的Python服务器在哪里,在本地工作网络上还是在internet上?如果您不知道,tracert或traceroute之类的工具可以帮助您确定服务器的位置。我的Python服务器在internet上(Mediatemple)。Python是获取运行代码的服务器的IP(在本例中为Mediatemple)还是获取访问页面的访问者的IP?抱歉,请重新阅读您的文章。您确实获得了服务器的地址。我将在下面为您完成我的回答。正如我在上面的回答中提到的,您可以使用该标题,但它不考虑代理。更多信息在我的答案
    import getenv
    print getenv("REMOTE_ADDR")