Python думает, что я другой IP - PullRequest
2 голосов
/ 13 апреля 2010

Я пытаюсь настроить страницу, которая отображает IP-адрес посетителя. Все методы, которые я попробовал, показывают IP-адрес, отличный от IP-адреса моего компьютера. Я пробовал:

  1. Глядя вверх http://www.whatismyip.com/automation/n09230945.asp

  2. Использование socket.getaddrinfo (socket.gethostname (), Нет) [0] [4] [0]

Как узнать реальный IP-адрес посетителя?

Ответы [ 2 ]

4 голосов
/ 13 апреля 2010

Используя низкоуровневый сетевой интерфейс, вы фактически получаете адрес сервера, на котором работает интерпретатор python:

" socket.gethostname (): вернуть строку, содержащую имя хоста компьютера, на котором в настоящее время выполняется интерпретатор Python. "

Получение IP-адреса клиента с использованием низкоуровневого сетевого интерфейса

" socket.accept () Принять соединение. Сокет должен быть привязан к адресу и прослушивать соединения. Возвращаемое значение - пара (conn, address), где conn - это новый объект сокета, который можно использовать для отправки. и получить данные о соединении, а адрес - это адрес, связанный с сокетом на другом конце соединения."

# 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()

Подробнее о сетевом интерфейсе низкого уровня

Получение IP-адреса клиента из заголовков HTTP (при обслуживании 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 голосов
/ 13 апреля 2010

Я нашел простое решение:

import getenv
print getenv("REMOTE_ADDR")

Возвращает IP-адрес компьютера, подключенного к серверу.

...