#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-запросов.