Читатель IPv6 в Python - PullRequest
       9

Читатель IPv6 в Python

0 голосов
/ 01 сентября 2018

У меня есть небольшой код Python для чтения IP-адреса клиента, посещающего мой веб-сайт Flask, размещенный на pythonanywhere.com:

from flask import Flask, request 

app = Flask(__name__)

@app.route('/')
def hello_world():
    ipread1 = request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
    print("The client IP1 is: %s" % (ipread1))
    return 'Hello  World!'

if __name__ == '__main__':
    app.run()

Это правильно возвращает мой IPv4-адрес в журнал сервера каждый раз, когда я обновляю веб-страницу. Тем не менее, я бы хотел вместо этого выдать свой IPv6-адрес (который я уже проверил).

Для этого я попытался изменить:

app.run() до app.run(host='::')

Но это все равно просто дает мой IPv4-адрес. Как заставить Python указать мой IPv6-адрес?

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Все запросы, обрабатываемые PythonAnywhere, поступают через IPv4, поэтому вы не увидите адрес IPv6.

0 голосов
/ 01 сентября 2018

Рассмотрим первый случай с app.run(). Вы получаете IPV4-адрес клиента, например:

The client IP1 is: 127.0.0.1

Теперь, если вы добавите аргумент host app.run(host='::'), вы прослушаете сокет IPv6 и получите что-то вроде:

The client IP1 is: ::ffff:127.0.0.1

Использует ли клиент IPv6?
Нет, клиент все еще использует свой адрес IPv4 и общается с сервером IPv4. Так что без разницы с его точки зрения. Что изменится, так это то, что вы получите v4-mapped-on-v6 address со следующей формой:

000 ... 000 |   FFFF  | IPv4 Address
   80 bits    16 bits     32 bits   

См., Например, соответствующий RFC .

Таким образом, с точки зрения сервера он будет выглядеть так, как будто он исходит от хоста IPv6, и он мог бы использовать IPv4 / IPv6 с двумя стеками.

Если вы хотите увидеть что-то другое, вам нужно изменить способ отправки клиентом своих запросов.

...