У меня есть сетевой интерфейс, которому я назначил все адреса 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
?