Сетевой уровень: адресация и маршрутизация

/!\ Из-за технических трудностей сегодняшняя лекция вышла сумбурной и урезанной. Здесь будет три раздела

  1. что рассказано,
  2. что надо самому посмотреть,
  3. и что перенесено на следующую лекцию

Слегка запоздалое объявление: Сети для самых маленьких — хороший ресурс (недостаток: специфика не-linux сетевого оборудования, где его в домашних условиях взять?).

Задачи:

  1. Глобальная идентификация (адресация)
    1. Структура адреса
    2. Механизм раздачи

  2. Алгоритм доставки (маршрутизация)
    1. Известный маршрут и маршрут по умолчанию внутри крупной сети
    2. Связность крупных сетей (карта достижимости / стоимость)

IPv4

rfc791

Протоколы сетевого и сетевого/интерфейсного уровня

Настройка IP в Linux и табличная маршрутизация

Сетевая маска: количество старших разрядов в двоичном представлении адреса, соответствующих «адресу сети». Оставшиеся младшие биты — адрес абонента в этой сети:

При настройке IP на сетевом интерфейсе Linux указывается размер подсети, тем самым заполняется таблица маршрутизации записью вида: «такая-то IP-подсеть находится непосредственно за этим сетевым интерфейсом»

   1 srv:~# ip link set dev eth1 up
   2 [root@srv] # ip addr add dev eth1 10.20.30.1/24
   3 srv:~# ip r
   4 10.20.30.0/24 dev eth1 proto kernel scope link src 10.20.30.1 linkdown 
   5 srv:~# ping 10.20.30.2
   6 PING 10.20.30.2 (10.20.30.2) 56(84) bytes of data.
   7 ^C
   8 1 packets transmitted, 0 received, 100% packet loss, time 0ms
   9 srv:~# ip n
  10 10.20.30.2 dev eth1  INCOMPLETE
  11 srv:~# ping 10.20.31.2
  12 ping: connect: Network is unreachable
  13 

Подключим к этой машине маршрутизатор, а ко второму интерфейсу маршрутизатора — ещё одну машину

Надо сделать ещё два действия:

Простая табличная маршрутизация:

  1. Получаем пакет
  2. Просматриваем все записи в таблице, из них выбираем те, для которых адрес сети совпадает с адресом сети получателя пакета (если к нему применить соответствующую маску)
    • Если настроен маршрут по умолчанию (с сетевой маской длины 0), он всегда подходит
  3. Среди подходящих записей выбирается та, что имеет самую длинную сетевую маску (т. е. в которой меньше абонентов)
  4. Если это запись вида «сеть dev интерфейс», обращаемся за адресом к ARP-таблице, если «сеть via адрес» — используем этот адрес
  5. Пересылаем пакет на найденный адрес

Сети /32 и proxy ARP

Присоединим к маршрутизатору ещё один компьютер посредством ещё одной сети через интерфейс eth3, причём IP-адрес возьмём из диапазона 10.40.60.0/24. Как сделать его достижимым?

Есть два пути. Можно поисследовать IP-адреса всех имеющихся в «старой» сети 10.40.60.0/24 (которая видна на router за интерфейсом eth2), и разбить её на две сети /25. При этом «старые» абоненты (у нас такой вообще один) останутся в сети 10.40.60.0/25, а «новые» будем снабжать ip-адресами из сети 10.40.60.128/25, и интерфейсу eth3 на router тоже выдать адрес из этого диапазона (можно воспользоваться ipcalc, чтобы посмотреть, почему 128). Поменять /24 на /25 надо будет на всех абонентах, принадлежащих этим диапазонам.

(TODO нужен ли пример?)

Но что если за интерфейсом eth2 уже много самых разных абонентов, и нет возможности / желания менять все настройки?

Тогда воспользуемся вариантом маршрутизации вида «сеть/32 → интерфейс» и «абонент/32 → интерфейс»:

   1 router:~# ip addr add dev eth3 10.40.60.102/32
   2 router:~# ip l set eth3 up
   3 router:~# ip route add 10.40.60.100/32 dev eth3
   4 router:~# ip addr
   5 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
   6     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   7     inet 127.0.0.1/8 scope host lo
   8        valid_lft forever preferred_lft forever
   9 2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
  10     link/ether 08:00:27:cd:9b:53 brd ff:ff:ff:ff:ff:ff
  11     altname enp0s3
  12 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
  13     link/ether 08:00:27:f3:ec:2d brd ff:ff:ff:ff:ff:ff
  14     altname enp0s8
  15     inet 10.20.30.2/24 scope global eth1
  16        valid_lft forever preferred_lft forever
  17 4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
  18     link/ether 08:00:27:97:d9:52 brd ff:ff:ff:ff:ff:ff
  19     altname enp0s9
  20     inet 10.40.60.2/24 scope global eth2
  21        valid_lft forever preferred_lft forever
  22 5: eth3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
  23     link/ether 08:00:27:77:03:e7 brd ff:ff:ff:ff:ff:ff
  24     altname enp0s10
  25     inet 10.40.60.102/32 scope global eth3
  26        valid_lft forever preferred_lft forever
  27 router:~# ip route
  28 10.20.30.0/24 dev eth1 proto kernel scope link src 10.20.30.2 
  29 10.40.60.0/24 dev eth2 proto kernel scope link src 10.40.60.2 
  30 10.40.60.100 dev eth3 scope link 
  31 

На новом абоненте (назовём его single):

   1 single:~# ip link set dev eth1 up
   2 single:~# ip addr add dev eth1 10.40.60.100/32
   3 single:~# ip route add 10.40.60.102/32 dev eth1
   4 single:~# ip route add default via 10.40.60.102
   5 single:~# ip r
   6 default via 10.40.60.102 dev eth1 
   7 10.40.60.102 dev eth1 scope link
   8 single:~# ping -c1 10.20.30.1
   9 PING 10.20.30.1 (10.20.30.1) 56(84) bytes of data.
  10 64 bytes from 10.20.30.1: icmp_seq=1 ttl=63 time=1.29 ms
  11 

Proxy ARP

Однако не всё ещё работает. Например, single недоступен с абонента clone, находящегося в «старой» сети:

Почему так? Маршрут вида 10.40.60.0/24 dev eth1 говорит о том, что за интерфейсом eth1 находится вся сеть 10.40.60.0/24 и, стало быть, мы вправе ожидать появления 10.40.60.100 в ARP-таблице. Но взяться ему там неоткуда: в действительности же этот абонент находится совсем в другой сети, и на arp-запрос ответа не приходит.

Решение: попросить router отвечать на приходящий из старой сети ARP-запрос адреса 10.40.60.100 что-то вроде «всё в порядке, это мой IP». Тогда у абонентов создастся впечатление, что router просто имеет два IP-адреса на соответствующем интерфейсе, и они начнут использовать при инкапсуляции на интерфейсный уровень тот же самый MAC-адрес. Получив такой фрейм, router обнаружит там IP-пакет для 10.40.60.100, и перешлёт его.

Теперь работает:

   1 clone:~# ping -c1 10.40.60.100
   2 PING 10.40.60.100 (10.40.60.100) 56(84) bytes of data.
   3 64 bytes from 10.40.60.100: icmp_seq=1 ttl=63 time=603 ms
   4 clone:~# ip n
   5 10.40.60.100 dev eth1 lladdr 08:00:27:97:d9:52 REACHABLE
   6 10.40.60.2 dev eth1 lladdr 08:00:27:97:d9:52 STALE
   7 

Proxy ARP можно включить на нескольких интерфейсах целиком, за это отвечает специальный sysctl, (net.ipv4.conf.интерфейс.proxy_arp, он же /proc/sys/net/ipv4/conf/интерфейс/proxy_arp). С точки зрения абонентов устройство с такой настройкой будет работать как bridge, то есть роутер уровня 2 — интерфейсного. Много интерфейсов — единое адресное пространство, в ARP-таблицах видны все абоненты. Однако в действительности маршрутизация будет идти на уровне 3, то есть IP, сетевом: полученный фреймы будут декапсулироваться до IP-пакетов, и на основании IP-адреса будет происходит пересылка (с последующей инкапсуляцией в фрейм).


Здесь начинается часть, которой не было на лекции.

TODO: хорошо бы действующий пример OSPF для пробрасывания таблиц.

На следующий раз

Policy routing

Бонус: настройка выхода в интернет

на Базовой машине:

Везде:

IPv6

Д/З

Задание 4

  1. Суть: объединить четыре компьютера тремя сетями по простой линейной схеме:
    • clone ←сеть3→ router2 ←сеть2→ router1 ←сеть1→ base

    • На машинах clone и base — по одному интерфейсу

    • На машинах router2 и router1 — два, там настроить маршрутизацию

    • Обеспечить доступность между clone и base

  2. Отчёт (выполнятся с нуля на ненастроенных машинах):
    1. report 4 clone

      • Настройка/поднятие интерфейса
      • Дополнительные настройки маршрутизации (если нужны)
      • tcpdump -c4 (должен показать пинги)

    2. report 4 router2

      • Настройка/поднятие двух интерфейсов
      • Дополнительные настройки маршрутизации (если нужны)
    3. report 4 router1

      • Настройка/поднятие двух интерфейсов
      • Дополнительные настройки маршрутизации (если нужны)
    4. report 4 base (выполняется последним)

      • Настройка/поднятие интерфейса
      • Дополнительные настройки маршрутизации (если нужны)
      • ping -c4 адрес_clone (должен проходить)

  3. Четыре отчёта (названия сохранить(должно быть: report.04.base, report.04.clone, report.04.router1, report.04.router2)) переслать одним письмом в качестве приложений на uneexlectures@cs.msu.ru

LecturesCMC/LinuxNetwork2022/04_AddressAndRoute (последним исправлял пользователь ArsenyMaslennikov 2023-03-08 01:38:35)