Транспортный уровень: трансляция адресов и формирование трафика

Ещё про VirtualBox

VBoxManage:

Всё это умеют сценарии из лекций

Проброс портов из хост-системы в VirtualBox.

NAT

Network address translation — что такое и зачем нужно:

NAT без транспортного уровня

Идея замены конкретного IP другим конкретным IP (и обратно) — например, если «внутренний» IP из интранет-диапазона.

Табличная подмена IP

Проблемы:

NAT с идентификацией потока (NAPT)

Динамическая подмена IP на основании «состояния»

Примеры SNAT и DNAT

Пример: client ← deepnet → firewall ← localnet → srv:

Обход NAT с помощью STUN (на примере UDP)

доделать отдельный spin-off

Проблема: клиент - nat1[NAT] - … - [NAT]nat2 - сервер. Как переслать пакет серверу от клиента, если на участке «- … -» неизвестен IP ни того, ни другого?

А если нет административного доступа к NAT-серверам? Очевидно, нужен ещё один сервер, к которому оба клиента могут обратиться (как минимум, для того, чтобы узнать, что до них кто-то хочет достучаться):

  1. Полная ретрансляция через координатор.

    • ПО (например, socat), которое слушает на координатор:порт2 и координатор:порт3 и перекладывает трафик между ними

      • socat TCP-listen:2223,reuseaddr TCP-listen:2222,reuseaddr

    • ПО (например, socat) на сервере, которое постоянно подключено к server - координатор:порт2 и перекладывает трафик на server:порт

      • socat TCP:10.12.0.27:2223 TCP:localhost:22

    • Подключение к координатор:порт3 перенаправится на server:порт

    • (Делается с помощью ssh, например)

  2. STUN (Session Traversal Utilities for NAT).

    • Включают в себя несколько протоколов (в том числе полную ретрансляцию, Traversal_Using_Relay_NAT); остальные протоколы работают не всегда

    • Базируется на двух (необоснованных) предположениях:
      1. Если с клиента послать UDP-пакет какому-то серверу, в conntrack в течение некоторого времени находится запись, позволяющая получить UDP-«ответ» на этот пакет со стороны сервера, с порта получателя на порт отправителя

        • Так работают прикладные протоколы (например, DNS), но датаграмма не подразумевает ответ

      2. Предположим, в UDP-пакете, предназначенном координатору, указан порт отправителя A, а при выходе из NAT на сервере1 порт отправителя превратился в B, о чём была сделана запись в conntrack. Тогда если послать ещё один UDP-пакет, на этот раз серверу2, указав тот же самый порт отправителя A, то на сервере1 порт отправителя тоже не изменится и будет B.

(если успеем) Простой пример для linux

Площадка: client - nat2 - stun - nat1 - srv

Настройка:

Проверка:

Собственно STUN:

TCP: а что делать с seqn? А ничего, не работает TCP ☹

Syn flood атака и SYNPROXY

Введение в обработку трафика

<!> Эта тема на целый семестр! Поэтому про главную задачу — traffic shaping — только упомянем.

Задача: если сетевое устройство пересылает несколько потоков данных, надо обеспечить:

Общая идея: маршрутизируемые пакеты нельзя просто перекладывать по одному

Проблема: Bufferbloat

Дисциплина по умолчанию: tc-fq_codel:

Пример: дисциплина Network Emulator

Потестируем её с помощью «flood ping» (безудержной отправки ping-ов с максимальной скоростью)

Исходное состояние (используем stun):

# tc -col qdisc show 
# tc -s qdisc show
# ping -f -c1000 10.1.0.27

Медленная сеть:

# tc qdisc add dev eth1 root netem delay 400ms
# tc qdisc show 
# ping -f -c100 10.1.0.27

Плохая сеть, в которой пакеты пропадают:

# tc qdisc del root dev eth1
# tc qdisc add dev eth1 root netem loss 10%
# tc qdisc show 
# ping -f -c500 10.1.0.27

Очень плохая сеть, и медленная, и пакеты портятся:

# tc qdisc del root dev eth1
# tc qdisc add dev eth1 root netem delay 400ms corrupt 5%
# tc qdisc show 
# ping -f -c500 10.1.0.27

Немного про shape:

Будем исследовать пропускную способность с помощью IPerf

Исходная ситуация (эмулятор гигаибтной сетевой карты):

# tc qdisc del root dev eth1
# iperf3 -t5 -4c 10.1.0.27

Понизим пропускную способность до мегабита в секунду:

# tc qdisc add dev eth1  root tbf rate 1mbit burst 32kbit latency 400ms
# tc qdisc show 
# iperf3 -t5 -4c 10.1.0.27

К сожалению, наиболее популярную дисциплину — HTB — рассмотреть не успеем. Тема большая.

Д/З

Образ не изменился

Задание 7

  1. Суть: воспроизвести примеры из лекции, с выходным NAT-ом, пробросом порта и задержкой на интерфейсе.
  2. Площадка (сетевые адреса и маршруты настроены заранее, в отчёт не входят)
    • LecturesCMC/LinuxNetwork2025/07_TransportShapeNAT/SNAT_DNAT_DELAY.svg

    • A — адрес delayed

    • B — адрес client

    • R — «внешний» (для доступа из srv) адрес router

  3. Отчёт:
    1. report 7 router

      • Настроить исходящий NAT на интерфейсе R, который работал бы для A и B (Например, для всей их сети)

      • Настроить проброс порта 1234 при подключении к R → на порт 1234 адреса B

      • Запустить tcpdump на «внешнем» интерфейсе, который отловит все пакеты TCP-соединения от client на srv и несколько пакетов ping-а, а затем сам остановится (ключ -c). Если сложно — просто остановите перед продолжением отчёта.

    2. report 7 srv

      • Принять одно TCP-соединение на порт 1212 (в tcpdump на router-е должно быть видно, что это соединение от R, потому что SNAT)

    3. report 7 delayed

      • Настроить (с помощью netem) задержку при отсылке пакетов в 200ms

      • Немного по ping-ать srv (чтобы запущенный там tcpdump остановился)

    4. report 7 client

      • Отправить несколько строк на порт 1212 машины srv

      • Запустить ping адреса A (в отчёте должна быть видна задержка ⩾ 200ms)

      • Принять одно TCP-соединение на порт 1234
    5. (продолжение отчёта srv)

      • Отправить несколько строк на порт 1234 адреса R (его должен принять B, потому что DNAT)

  4. Четыре отчёта (названия сохранить, должно быть: report.07.router, report.07.srv, report.07.client, report.07.delayed) переслать одним письмом в качестве приложений на uneexlectures@cs.msu.ru

    • В теме письма должно встречаться слово LinuxNetwork2026

LecturesCMC/LinuxNetwork2026/07_TransportShapeNAT (последним исправлял пользователь FrBrGeorge 2026-03-30 16:09:43)