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

Ещё про VirtualBox

VBoxManage:

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

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

NAT

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

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

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

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

Проблемы:

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

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

Примеры SNAT и DNAT

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

TODO это в лекцию не влезло, надо сделать отдельный spin-off

Проблема: клиент1 - сервер1[NAT] - [NAT]сервер2 - клиент2. Как переслать пакет клиенту2 от клиента1?

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

  1. Полная ретрансляция через координатор. Делается с помощью 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.

Пример организации STUN вручную (не успеем).

Протокол установдения «соединения» между клиентом1 и клиентом2 (все «пакеты» далее — UDP):

  1. клиент1 сообщает координатору, что хочет установить соединение с клиентом2; клиент2 (который тоже на связи с координатором) узнаёт от этом

  2. клиент2 отправляет пакет Iip2:Iport2 → координатор

    • На сервере2 образуется запись в conntrack

      • Iip2:Iport2 ⇒ координатор:… / Eip2:Eport2

  3. координатор получает этот пакет и отправляет клиенту1 информацию о Eip2:Eport2

  4. клиент1 отправляет пакет Iip1:Iport1 → координатор

    • На сервере1 образуется запись в conntrack

      • Iip1:Iport1 → координатор:… / Eip1:Eport1

  5. координатор получает этот пакет и отправляет клиенту2 информацию о Eip1:Eport1

  6. клиент2 отправляет пакет Iip2:Iport2 → Eip1:Eport1

    • На сервере2 образуется запись в conntrack

      • Iip2:Iport2 → Eip1:Eport1 / Eip2:Eport2

  7. клиент1 отправляет пакет Iip1:Iport1 → Eip2:Eport2

    • На сервере1 образуется запись в conntrack

      • Iip1:Iport1 → Eip2:Eport2 / Eip1:Eport1

  8. Этот пакет доходит до сервера2, и согласно записи в conntrack передаётся клиенту2 как «ответ» на пакет (5)

  9. клиент2 отправляет пакет Iip2:Iport2 → Eip1:Eport1

  10. Этот пакет доходит до сервера1, и согласно записи в conntrack передаётся клиенту1 как «ответ» на пакет (6)

Если клиент1 и клиент2 не будут тупить дольше времени жизни записи в conntrack, процесс будет продолжаться без участия координатора

По концам такого туннеля можно организовать ip over UDP с помощью ip fou

TCP: а что делать с seqn?

Простой пример для linux iptables … -j MASQUERADE, в котором

client - nat2[NAT:10.3.0.4] - stun - [NAT:10.2.0.2]nat1 - srv

Syn flood атака и SYNPROXY

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

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

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

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

Проблема: Bufferbloat

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

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

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

Исходное состояние:

# tc qdisc show 
# tc -s qdisc show
# ping -f -c1000 10.9.0.2

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

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

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

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

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

# 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.1.2

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

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

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

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

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

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

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

Д/З

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

Задание 7

TODO в 2024 году машина B всё ещё называется «shaped», хотя в задании не шейпер, а задержка. Потом поменяю.

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

    • A — адрес shaped

    • 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 shaped

      • Настроить (с помощью 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.shaped) переслать одним письмом в качестве приложений на uneexlectures@cs.msu.ru

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

LecturesCMC/LinuxNetwork2024/07_TransportShapeNAT (последним исправлял пользователь FrBrGeorge 2024-04-09 21:12:56)