Http-сервер Python REMOTE_ADDR возвращает другой локальный IP (Linux)

1
3

(Я использую Linux)

Локальный IP моего ПК - 172.16.1.2
Команда ip a возвращает 172.16.1.2

Затем я могу добавить еще один IP к тому же сетевому интерфейсу:

теперь команда ip a возвращает 2 IP

Затем я привязываю Python простой http-сервер к 192.168.1.10:

Затем просто откройте http://192.168.1.10:8000 в браузере или через curl

Мой вопрос в том, почему он печатает 192.168.1.10, а не 172.16.1.2?
Поскольку я получаю доступ к серверу с моего локального IP-адреса, который 172.16.1.2, я ожидаю, что это будет REMOTE_ADDR

ip addr add 192.168.1.10 dev eth0
172.16.1.2
192.168.1.10
from wsgiref.simple_server import make_server

def hello_world_app(environ, start_response):
    print(environ['REMOTE_ADDR'])  # why not 172.16.1.2
    start_response(status='200 OK', headers=[])
    return [b"Hello World"]


IP = '192.168.1.10'
PORT = 8000
make_server(IP, PORT, hello_world_app).serve_forever()
Агата
Вопрос задан19 сентября 2024 г.

1 Ответ

2

Проблема с тем, что HTTP-сервер на Python возвращает другой локальный IP-адрес в поле REMOTE_ADDR, может быть связана с несколькими факторами:

1. Использование прокси-сервера:

  • Прокси-сервер: Если вы используете прокси-сервер (например, Apache, Nginx) перед своим Python-сервером, то поле REMOTE_ADDR будет содержать IP-адрес прокси-сервера, а не фактический IP-адрес клиента.
  • Решение: Чтобы получить реальный IP-адрес клиента, нужно использовать заголовки X-Forwarded-Forили X-Real-IP, которые могут быть установлены прокси-сервером.

2. Неправильная конфигурация сетевых интерфейсов:

  • Виртуальные сети: Если ваш сервер использует виртуальную сеть или VPN, то IP-адрес, который видит ваш сервер, может отличаться от IP-адреса, который видит клиент.
  • Решение: Проверьте конфигурацию сетевых интерфейсов и убедитесь, что они правильно настроены.

3. Использование NAT (Network Address Translation):

  • NAT: Если ваш сервер находится за NAT, то IP-адрес, который видит ваш сервер, будет внутренним IP-адресом, а не внешним IP-адресом клиента.
  • Решение: В этом случае вы можете использовать заголовки X-Forwarded-For или X-Real-IP, чтобы получить реальный IP-адрес клиента, но это зависит от того, как ваш NAT работает.

Как получить реальный IP-адрес клиента:

  1. Проверка заголовков: Проверьте, есть ли заголовки X-Forwarded-For или X-Real-IP в запросе. Если они есть, то значение этих заголовков будет содержать IP-адрес клиента.
  2. Использование библиотек: Используйте библиотеки, которые автоматически обрабатывают прокси-серверы и NAT, например:
    • requests - для отправки запросов:
    import requests
    response = requests.get('http://example.com', proxies={'http': 'http://your-proxy:port'})
    print(response.headers['X-Forwarded-For'])
    
    • Flask - для создания веб-приложений:
    from flask import Flask, request
    app = Flask(__name__)
    
    @app.route('/')
    def index():
        remote_addr = request.headers.get('X-Forwarded-For', request.remote_addr)
        return f"Ваш IP-адрес: {remote_addr}"
    
    if __name__ == '__main__':
        app.run(debug=True)
    

Дополнительные советы:

  • Проверьте журналы: Проверьте журналы прокси-сервера или NAT, чтобы узнать, как они обрабатывают IP-адреса.
  • Проверьте конфигурацию: Убедитесь, что ваша конфигурация сети правильно настроена.
  • Используйте инструменты сетевого анализа: Используйте инструменты сетевого анализа, такие как tcpdump или wireshark, чтобы проанализировать сетевой трафик и увидеть, какие IP-адреса участвуют в процессе.

Важно: Правильное получение IP-адреса клиента зависит от конфигурации вашей сети и от того, как вы используете прокси-серверы и NAT.

 

Валерий
Ответ получен9 сентября 2024 г.

Ваш ответ

Загрузить файл.