Проникновение в сеть: пробивание отверстий TCP, пробивание отверстий UDP и UPnP.
Проникновение в сеть: пробивание отверстий TCP, пробивание отверстий UDP и UPnP.

В современных сетях многие устройства находятся за NAT (трансляцией сетевых адресов) или межсетевыми экранами, что затрудняет прямой доступ к этим устройствам. В этом случае технология проникновения в сеть становится очень важной. В этой статье будут представлены три широко используемые технологии проникновения в сеть: пробивание отверстий TCP, пробивание отверстий UDP и UPnP.

1. Пробивание отверстий TCP

1.1 Что такое пробивание отверстий в TCP?

TCP Hole Punching — это метод, который позволяет двум клиентам за NAT установить прямое соединение через сторонний сервер. NAT обычно не позволяет внешним хостам напрямую взаимодействовать с внутренними хостами, поэтому для установления соединения требуется внешний сервер.

1.2 Принцип работы
  1. Установить соединение с сервером ретрансляции:два NAT клиент после A и B Сначала отделите его от общедоступного сервера. S Учреждатьсоединять。
  2. обмен внешним адресом:сервер S учиться A и B внешний IP и порты и отправить эту информацию друг другу.
  3. Попробуйте подключиться напрямую:A и B По отдельности попробуйте использовать друг друга внешне. IP и порт осуществляет соединение, если оба конца NAT Если устройство это позволяет, то подключение выполнено успешно.
1.3 Пример кода

Ниже приведен простой пример Python, демонстрирующий процесс подключения через пробивание отверстий TCP.

Язык кода:javascript
копировать
import socket

# Server listens for incoming connections and exchanges client information
def server():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(('0.0.0.0', 12345))
    s.listen(2)
    
    print("Server waiting for connections...")
    conn_a, addr_a = s.accept()
    print(f"Client A connected: {addr_a}")
    
    conn_b, addr_b = s.accept()
    print(f"Client B connected: {addr_b}")
    
    # Exchange addresses
    conn_a.send(f"{addr_b[0]}:{addr_b[1]}".encode())
    conn_b.send(f"{addr_a[0]}:{addr_a[1]}".encode())
    
    conn_a.close()
    conn_b.close()
    s.close()

# Clients attempt to connect to each other using exchanged information
def client():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('server_ip', 12345))  # Replace 'server_ip' with the actual IP of the server
    
    peer_info = s.recv(1024).decode()
    peer_ip, peer_port = peer_info.split(':')
    
    # Attempt to connect to peer
    try:
        peer_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        peer_socket.connect((peer_ip, int(peer_port)))
        print("Connected to peer!")
    except Exception as e:
        print(f"Failed to connect to peer: {e}")
    
    s.close()

2. Пробивание отверстий UDP

2.1 Что такое пробивание отверстий в UDP?

Перфорация UDP аналогична перфорации TCP. Это технология, которая позволяет двум хостам за NAT устанавливать прямое соединение UDP через сторонний сервер. В отличие от TCP, UDP — это протокол без установления соединения, позволяющий узлу NAT более легко принимать запросы на подключение извне.

2.2 Принцип работы
  1. Общаться с сервером:Два клиента A и B отдельный и публичный сервер S Совершайте сообщения, записывайте их внешне IP и порт.
  2. обменный адрес:сервер Воля A и B внешний IP и Порты передаются друг другу.
  3. Отправлять UDP-пакеты напрямую:A и B Попробуйте передать друг другу внешний адрес. UDP-пакеты напрямую,использовать NAT Таблица сеансов для передачи данных.
2.3 Пример кода
Язык кода:javascript
копировать
import socket

# UDP Server to exchange addresses
def udp_server():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.bind(('0.0.0.0', 12345))
    
    print("Server waiting for messages...")
    data_a, addr_a = s.recvfrom(1024)
    print(f"Received from A: {addr_a}")
    
    data_b, addr_b = s.recvfrom(1024)
    print(f"Received from B: {addr_b}")
    
    # Exchange addresses
    s.sendto(f"{addr_b[0]}:{addr_b[1]}".encode(), addr_a)
    s.sendto(f"{addr_a[0]}:{addr_a[1]}".encode(), addr_b)

# UDP Client to communicate through hole punching
def udp_client():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.sendto(b'Hello from client', ('server_ip', 12345))  # Replace 'server_ip' with actual server IP
    
    peer_info, _ = s.recvfrom(1024)
    peer_ip, peer_port = peer_info.decode().split(':')
    
    # Send message to peer
    s.sendto(b'Hello peer!', (peer_ip, int(peer_port)))
    
    try:
        response, _ = s.recvfrom(1024)
        print(f"Received from peer: {response}")
    except socket.timeout:
        print("No response from peer")
    
    s.close()

3. UPnP (универсальный Plug and Play)

3.1 Что такое UPnP?

UPnP (Universal Plug and Play) — это сетевой протокол, который позволяет устройствам автоматически обнаруживать другие устройства в сети и взаимодействовать с ними. В среде NAT UPnP может автоматически открывать порты маршрутизатора, позволяя внешним устройствам получать доступ к устройствам, расположенным во внутренней сети.

UPnP в основном используется в домашних сетях и небольших локальных сетях. Он упрощает процесс связи устройств в сети за счет автоматической настройки устройств.

3.2 Принцип работы
  1. Обнаружение устройств:Клиентское устройство отправляет через Запрос SSDP (Simple Service Discovery Protocol), ищите в сети UPnP оборудование.
  2. Получить описание устройства роутера:проходить SSDP Обнаруженные устройства предоставляют описание устройства. XML Файл, описывающий его функциональность и конечные точки.
  3. Запросить сопоставление портов:клиентпроходить Отправить запрос на роутер,Необходимо сопоставить внешний порт с определенным портом на внутреннем сетевом устройстве.
3.3 Пример кода

Можно использовать сторонние библиотеки. miniupnpc осознать UPnP Сопоставление портов, следующее Python Пример.

Язык кода:javascript
копировать
pip install miniupnpc
Язык кода:javascript
копировать
import miniupnpc

def upnp_port_mapping():
    upnp = miniupnpc.UPnP()
    upnp.discoverdelay = 200
    upnp.discover()  # Discover UPnP devices
    upnp.selectigd()  # Select Internet Gateway Device
    
    external_port = 12345
    internal_port = 54321
    local_ip = upnp.lanaddr  # Get local IP address
    
    # Add port mapping (TCP)
    upnp.addportmapping(external_port, 'TCP', local_ip, internal_port, 'Test Port Mapping', '')
    
    print(f"Port {external_port} mapped to {local_ip}:{internal_port} (TCP)")
    
    # Optionally, remove the port mapping
    # upnp.deleteportmapping(external_port, 'TCP')
    
upnp_port_mapping()

4. Резюме

  • пробивание отверстий TCP:проходитьтретья сторонасерверобмен внешним адресом, попробуйте создать директ TCP соединять。
  • Пробивка отверстий UDP:похожий пробивание отверстий TCP, но используя UDP Соглашения имеют больше шансов на успех.
  • UPnP:проходить Автоматическое сопоставление портов,Упростите доступ к внутренним сетевым устройствам для внешних устройств.

Эти три технологии очень важны в приложениях P2P, особенно в средах NAT или межсетевых экранах, поскольку они могут значительно повысить вероятность успешных соединений.

boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода