Отправка HTTP-запросов с разными исходными IP-адресами с использованием запросов

#python #python-3.x #networking #python-requests #ipv6

#python #python-3.x #сеть #python-запросы #ipv6

Вопрос:

У меня есть сетевой интерфейс, которому я назначил все IPv6-адреса, скажем, из 2a00:3344:2000:1300::30/56 подсети.

Теперь я хочу выдавать n HTTP-запросы с использованием requests , чтобы исходный IP-адрес каждого запроса варьировался в пределах этой /56 подсети. Реализация этого с использованием пользовательского транспортного адаптера, такого как

 import requests
from urllib3.poolmanager import PoolManager


class SourceIPManager(requests.adapters.HTTPAdapter):
    def init_poolmanager(self, connections, maxsize, block=False):
        self.poolmanager = PoolManager(
            num_pools=connections, maxsize=maxsize,
            block=block, source_address=('2a00:f48:2000:1300::30', 710))


s = requests.Session()
a = SourceIPManager()
s.mount('http://', a)

r = s.get('http://www.google.de')
  

работает, только если я установил source_address значение 2a00:f48:2000:1300::30 (если это основной IP, который ip addr show dev eth0 отображается). Указание 2a00:f48:2000:1300::31 выдает следующую ошибку:

 requests.exceptions.ConnectionError: HTTPConnectionPool(host='www.google.de', port=80): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fbf23601a20>: Failed to establish a new connection: [Errno -9] Address family for hostname not supported',))
  

несмотря на то, что интерфейсу также присвоен этот IP-адрес.

Что я делаю не так и как я могу добиться отправки разных запросов с разными исходными адресами с помощью requests ?

Комментарии:

1. Я серьезно сомневаюсь, что у вас могут быть 4,722,366,482,869,645,213,696 адреса, назначенные одному интерфейсу. Для этого у вас не будет достаточно оперативной памяти, и, хотя IPv6 не накладывает ограничений на количество адресов, назначенных интерфейсу, ОС разрешит использовать только, возможно, пару десятков адресов для интерфейса. При 1,000,000 адресах, назначаемых в секунду, вам потребовалось бы более 149,642,763 лет, чтобы назначить такое количество адресов.

2. Я думаю, вы запутались. Если вы назначаете 2a00:3344:2000:1300::30/56 интерфейсу, это действительно назначение одного адреса. Дело в том, что IPv4 использует явную маску, например, 255.255.255.0 , где IPv6 использует только длину маски, например, /56 . Вы также должны использовать только /64 сети для IPv6. ИНТЕРНЕТ-провайдер может делегировать /56 префикс, тогда вам следует использовать делегирование префикса IPv6 для назначения /64 сетей на основе этого префикса.

3. @RonMaupin Это вполне возможно. Посмотрите AnyIP в ядре Linux serverfault.com/questions/590038 /…

4. @Sirens, существует большая разница между назначением огромного количества адресов интерфейсу и маршрутизацией сетевого трафика в интерфейс.. Например, ваш маршрутизатор будет успешно маршрутизировать трафик для всего Интернета из вашей сети, но он не будет завершать и обрабатывать трафик так, как это требуется TCP для HTTP-запросов.