====== Маршрутизация и трансляция адресов в Debian 11 ======
===== 1. Настройка сетевых интерфейсов =====
Перед настройкой маршрутизации и трансляции адресов необходимо провести настройку сетевых интерфейсов.
===== 2. Трансляция адресов =====
Трансляция сетевых адресов (NAT) – это технология преобразования множества внутренних IP-адресов сети в один или несколько внешних адресов, используемых для связи с Интернетом. Поддержка протокола позволяет решить проблему нехватки IP адресов и позволяет получать доступ в Интернет из локальной сети, используя единственный IP-адрес. Чтобы это сделать, ядро должно изменить IP-адрес источника в каждом пакете так, чтобы ответы возвращались на сервер, а не на частный IP-адрес (что невозможно в Интернете), с которого сделан запрос. Linux использует Connection Tracking (conntrack) для хранения записи о том, каким машинам принадлежат соединения, и перенаправляет каждый возвращенный пакет соответствующим образом. Таким образом, трафик, покидающий вашу сеть, "замаскирован", как будто исходит от машины, которая выполняет роль шлюза. В документации Microsoft этот процесс упоминается как технология Internet Connection Sharing. В связи с тем что в ходе лабораторных работ будет создаваться сегмент Интернета (экосистема), и этой экосистеме необходим доступ в Интернет, а используемые адреса в экосистеме лежат в сети 10.0.0.0/8, то корневой шлюз должен обеспечивать маскардинг IP адресов.
=== 2.1. Маскарадинг ufw ===
Маскарадинг IP может быть реализован использованием пользовательских правил //**ufw**//. Это возможно благодаря тому, что текущий бэкэнд для //**ufw**// – это //**iptables-restore**// с файлами правил, хранящихся в //**/etc/ufw/*.rules.**// Эти файлы – замечательный способ добавить родные правила //**iptables**// без участия //**ufw**//, и эти правила больше ориентированы на шлюз или мост сети. Правила разделены на два файла: те, которые должны быть выполнены до правил командной строки //**ufw**//, и те, которые выполняются после правил командной строки //**ufw**//.
==== 2.2. Переадресация пакетов ====
Переадресация пакетов – это ретрансляция пакетов из одного сегмента сети в другой узлами компьютерной сети. Переадресация пакетов по умолчанию отключена в большинстве дистрибутивов Linux, поэтому для выполнения любой маршрутизации вы должны включить переадресацию в ядре. Для этого необходимо отредактировать файл **///etc/sysctl.conf//** раскомментировав строку **//net.ipv4.ip_forward=1//**. Т.к. мы используем межсетевой экран Netfilter, а для его конфигурирования ufw, то и настройки переадресации пакетов также проведём через файл конфигурации ufw. Для этого необходимо отредактировать **///etc/ufw/sysctl.conf//** и раскомментировать строку:\\
net/ipv4/ip_forward=1
Аналогично, для форвардинга IPv6, раскомментируйте\\
net/ipv6/conf/default/forwarding=1
**///etc/ufw/sysctl.conf//**:\\
# Configuration file for setting network variables. Please note these settings
# override /etc/sysctl.conf and /etc/sysctl.d. If you prefer to use
# /etc/sysctl.conf, please adjust IPT_SYSCTL in /etc/default/ufw. See
# Documentation/networking/ip-sysctl.txt in the kernel source code for more
# information.
#
# Uncomment this to allow this host to route packets between interfaces
net/ipv4/ip_forward=1
#net/ipv6/conf/default/forwarding=1
#net/ipv6/conf/all/forwarding=1
Далее необходимо фаерволу разрешить переадресацию пакетов. Для этого необходимо выполнить команду ufw:\\
# ufw default allow routed
{{ :rias:рис1.png?600 |}}
==== 2.3. Добавление правила маскарадинга ====
Теперь мы добавим правила в файл **///etc/ufw/before.rules//**. Правила по умолчанию задают только таблицу фильтрации, а для включения маскарадинга должна быть отредактирована таблица nat. Добавьте нижеследующее в конец файла:\\
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Forward traffic through eth0 - Change to match you out-interface
-A POSTROUTING -s 10.0.0.0/8 -o enp0s3 -j MASQUERADE
# don't delete the 'COMMIT' line or these nat table rules won't
# be processed
COMMIT
Комментарии не обязательны, но считается хорошей практикой документировать свою конфигурацию. При этом, редактируя любой файл правил в /etc/ufw, убедитесь, что строка **COMMIT** является последней во всех изменённых таблицах:\\
# don't delete the 'COMMIT' line or these nat table rules won't
# be processed
# не удаляйте строку "COMMIT", иначе эти правила не будут
# обрабатываться
COMMIT
{{ :rias:рис2.png?600 |}}
Для каждой таблицы требуется соответствующий оператор правила COMMIT.
==== 2.4. Применение созданных правил ====
Наконец, отключите и заново включите ufw для того, чтобы изменения вступили в силу:\\
ufw disable && ufw enable
Маскарадинг IP должен быть включён.
====== 3. Маршрутизация ======
==== 3.1. Сетевые маршруты в Linux ====
Сетевые маршруты необходимы чтобы компьютеры могли определить по какой цепочке должен пойти пакет, чтобы достигнуть цели. Маршруты можно настроить на уровне интерфейса или маршрутизатора.\\
Когда компьютеру нужно отправить пакет в сеть он смотрит таблицу маршрутизации, в ней указанны IP-адреса пунктов назначения и адреса интерфейсов и роутеров в сети, которые могут отправить пакет по нужному адресу. Если для цели маршрут не указан то используется так называемый шлюз по умолчанию или маршрут по умолчанию. Точно такая же картина наблюдается на роутере. Устройство смотрит на IP-адрес назначения и сверяет его со своей таблицей маршрутизации, а потом отправляет дальше.
==== 3.2. Статическая маршрутизация ====
Статическая маршрутизация – вид маршрутизации, при котором маршруты указываются в явном виде при конфигурации маршрутизатора. Вся маршрутизация при этом происходит без участия каких-либо протоколов маршрутизации.\\
Далее будет рассмотрено как настроить статическую маршрутизацию.
=== 3.2.1. Переадресация пакетов ===
Включите переадресацию пакетов как было описано в главе 2.2.
=== 3.2.2. Как посмотреть таблицу маршрутизации ===
Перед тем как что-либо менять, нужно понять какие правила уже используются. В Linux для этого существует несколько команд. Чтобы посмотреть таблицу маршрутизации можно использовать команду **ip**:\\
# ip route
{{ :rias:рис33.png?600 |}}
Вот так выглядит таблица маршрутизации linux.\\
Вывод этой команды можно использовать в качестве аргумента для **ip route add** или **ip route del**. Это очень удобно. Как вы видите, в качестве шлюза по умолчанию используется 10.0.2.2. Рассмотрим подробнее что означает вывод этой команды:\\
* **//default//** — это первый параметр строки в таблице маршрутизации, здесь может быть ip адрес цели или маска подсети. В данной строке используется вариант по умолчанию;\\
* **//via 10.0.2.2//** - указывает через какой шлюз мы можем добраться до этой цели, у нас это 10.0.2.2;\\
* **//dev enp0s3//** - сетевой интерфейс, через который будет доступен этот шлюз;\\
* **//proto kernel//** - означает, что маршрут был установлен ядром. Так же может быть параметр static – это означает что маршрут был установлен администратором;\\
* **//scope link//** означает, что эта запись является действительной только для этого интерфейса (enp0s3);\\
* **//metric//** - это приоритет маршрута, чем меньше значение - тем выше приоритет;\\
* **//src 10.0.2.15//** задает IP-адрес отправителя для пакетов, попадающих под это правило роутинга, как правило это IP-адрес сетевого интерфейса.\\
Последним правилом в этой таблице (правило для сети 169.254.0.0/16) идёт, так называемая сеть с нулевой конфигурацией (zeroconf).\\
Zeroconf или Zero Configuration Networking – это набор технологий, которые автоматически создают IP-сеть без конфигурации или специальных серверов. Также известен как Automatic Private IP Addressing (APIPA), позволяя необученным пользователям соединять компьютеры, сетевые принтеры и другие устройства вместе и получать работающую сеть. Без Zeroconf или чего-нибудь подобного пользователь должен либо установить специальные сервисы, например DHCP и DNS, или настраивать всё вручную.\\
Zeroconf решает три проблемы:\\
* Выбор сетевого адреса для устройства;\\
* Нахождение компьютеров по имени;\\
* Обнаружение сервисов, например принтеров.
=== 3.2.3. Настройка маршрутов в Linux ===
Вы можете настраивать таблицу маршрутизации с помощью команды **ip**. Например, чтобы изменить маршрут по умолчанию достаточно выполнить:\\
# ip route add default via 192.168.1.1
Так же вы можете добавить маршрут для любого IP адреса, например, для 243.143.5.25:\\
# ip route add 243.143.5.25 via 192.168.1.1
Все очень просто, сначала указывается IP адрес цели, а затем шлюз в локальной сети, через который можно достичь этого адреса. Но такие маршруты будут активны только до перезагрузки, после перезагрузки компьютера они будут автоматически удалены. Чтобы маршруты сохранились их нужно добавить в файл конфигурации. Постоянные статические маршруты добавляются в файл конфигурации сети **///etc/network/interfaces//**, в описание необходимого интерфейса, либо добавлены в файл конфигурации в каталоге **///etc/network/interfaces.d//**. В лабораторных работах для каждого интерфейса мы создаём отдельный файл конфигурации, соответственно правила маршрутизации для интерфейса будем размещать в этом файле. Для примера добавим правила маршрутизации для сети 10.0.2.0/24 в файл конфигурации интерфейса enp0s3:\\
auto enp0s3
allow-hotplug enp0s3
iface enp0s3 inet static
address 10.0.0.10
netmask 255.255.255.0
gateway 10.0.0.1
post-up ip route add 10.0.2.0/24 via 10.0.0.20
pre-down ip route del 10.0.2.0/24 via 10.0.0.20
Здесь мы можем увидеть «командные» опции. Каждая из этих опций может быть задана несколько раз в одной строфе, в этом случае команды исполняются в том порядке, в котором они появляются в строфе.\\
* **//pre-up «command»//** – запустить команду до поднятия интерфейса. Если команда завершается с ошибкой, тогда ifup не отмечает интерфейс как настроенный, выводит сообщение об ошибке и завершается со статусом 0.\\
* **//up «command»//** \\
* **//post-up «command»//** – запустить команду после поднятия интерфейса. Если команда завершается с ошибкой, тогда ifup не отмечает интерфейс как настроенный (даже если он в действительности настроен), выводит сообщение об ошибке и завершается со статусом 0.\\
* **//down «command»//** \\
* **//pre-down «command»//** – запустить команду перед отключением интерфейса. Если команда завершается с ошибкой, тогда ifdown помечает интерфейс как не настроенный (даже если на самом деле его настройки не были сброшены) и завершается со статусом 0.\\
* **//post-down «command»//** – запустить команду после отключения интерфейса. Если команда завершается с ошибкой, ifdown помечает интерфейс как не настроенный и завершается со статусом 0. В будущем это поведение может измениться.\\
Для каждой из вышеперечисленных опций существует каталог **///etc/network/if-<опция>.d//**, сценарии в котором запускаются (без аргументов) с помощью run-parts после обработки самих опций.
==== 3.3. Динамическая маршрутизация ====
Динамическая маршрутизация – это вид маршрутизации, при которой таблица маршрутизации заполняется и редактируется программно.\\
При динамической маршрутизации происходит обмен маршрутной информацией между соседними маршрутизаторами, в ходе которого они сообщают друг другу, какие сети в данный момент доступны через них. Информация обрабатывается и помещается в таблицу маршрутизации.\\
Далее будет рассмотрено как настроить динамическую маршрутизацию.
=== 3.3.1. Переадресация пакетов ===
Включите переадресацию пакетов как было описано в главе 2.2.
=== 3.3.2. Установка необходимого программного обеспечения ===
В операционной системе Debian инструментом для динамической маршрутизации в настоящее время является программа **//frr//** в одноименном пакете. раньше использовались quagga, а до этого zebra пока развитие этих пакетов не прекратилось.\\
FRR (FRRouting) – это набор демонов, взаимодействующих для определения таблиц маршрутизации, которые будут использоваться ядром.\\
Для того что бы установить frr необходимо выполнить в терминале:\\
# apt install frr
{{ :rias:рис34.png?600 |}}
=== 3.3.3. Включение необходимых протоколов маршрутизации ===
После установки запуск FRR ничего не даст. Это связано с тем, что по умолчание не включен ни один протокол маршрутизации. Для включения соответствующего протокола необходимо включить соответствующего демона, путем редактирования файла в вашем каталоге конфигурации. Этот файл обычно находится по адресу **///etc/frr/daemons//** и определяет, какие демоны активируются при выдаче команды запуска/остановки службы через init или systemd. Изначально файл выглядит так (приведён фрагмент):\\
# This file tells the frr package which daemons to start.
# Sample configurations for these daemons can be found in
# /usr/share/doc/frr/examples/.
# ATTENTION:
#
# When activating a daemon for the first time, a config file, even if it is
# empty, has to be present *and* be owned by the user and group "frr", else
# the daemon will not be started by /etc/init.d/frr. The permissions should
# be u=rw,g=r,o=.
# When using "vtysh" such a config file is also needed. It should be owned by
# group "frrvty" and set to ug=rw,o= though. Check /etc/pam.d/frr, too.
#
# The watchfrr, zebra and staticd daemons are always started.
#
bgpd=no
ospfd=no
ospfd=no
ripd=no
ripngd=no
isisd=no
pimd=no
ldpd=no
nhrpd=no
eigrpd=no
babeld=no
sharpd=no
pbrd=no
bfdd=no
fabricd=no
vrrpd=no
Как вы видите имена демонов соответствуют именам протоколов и напротив каждого демона стоит текст «no». Для включения нужного протокола нужно «no» заменить на «yes»
==== Какой протокол маршрутизации использовать? ====
//**Frr**// поддерживает большое количество различных протоколов маршрутизации. Рассмотрение всех их займёт много времени, в этой связи остановимся на рассмотрении двух наиболее часто используемых протоколов.\\
Протоколы //**OSPF**// (Open Shortest Path First), и //**BGP**// (Border Gateway Protocol) являются протоколами маршрутизации, которые принимают решения о маршрутизации через Интернет. Они представляют собой набор правил или алгоритмов, которые инструктируют сетевые маршрутизаторы о том, как сообщаться друг с другом, чтобы они могли перенаправлять трафик на лучший путь.\\
Основное различие между //**OSPF**// и //**BGP**// состоит в том, что //**OSPF**// является протоколом внутридоменной маршрутизации, использующим маршрутизацию по состоянию канала, и операция маршрутизации выполняется внутри автономной системы. В то время как //**BGP**// является протоколом междоменной маршрутизации, который использует маршрутизацию вектора пути, причем операции маршрутизации выполняются между двумя автономными системами. Некоторые другие различия между //**OSPF**// и //**BGP**// включают в себя:\\
* **//Конфигурация//**: OSPF легко настраивается, в то время как конфигурация BGP намного сложнее.\\
* **//Скорость сходимости//**: OSPF может быстрее достичь сходимости (маршрутизатор тратит время, чтобы поделиться и обновить последнюю информацию о маршрутизации). Напротив, BGP имеет низкую скорость сходимости.\\
* **//Топология или дизайн сети//**: OSPF - это тип иерархической топологии или дизайна сети, в то время как BGP - это тип топологии или дизайна сетки.\\
* **//Потребность в ресурсах//**: OSPF требует интенсивного использования памяти и CPU ресурсов. С другой стороны BGP, размер таблицы маршрутизации определяет в зависимости от имеющихся ресурсов устройства.\\
* **//Масштаб//**: BGP является более гибким и масштабируемым, чем OSPF, и он также используется в более крупных сетях.\\
* **//Предпочитаемый путь//**: OSPF используется для определения самого быстрого маршрута, в то время как BGP делает акцент на определении лучшего маршрута.\\
* **//Протокол//**: в OSPF используется интернет-протокол. В BGP используется протокол управления передачей.\\
Схематически возможное применение этих протоколов приведено на рисунке:
{{ :rias:рис35.jpg?600 |}}
Также следует уделить внимание ещё одному часто используемому протоколу **RIP**.
==== RIP ====
RIP – так называемый протокол дистанционно-векторной маршрутизации, который оперирует транзитными участками (хоп, hop) в качестве метрики маршрутизации. Максимальное количество транзитных участков, разрешенное в RIP – 15 (метрика 16 означает «бесконечно большую метрику»). Каждый RIP-маршрутизатор по умолчанию вещает в сеть свою полную таблицу маршрутизации раз в 30 секунд, довольно сильно нагружая низкоскоростные линии связи. RIP работает в сетях TCP/IP, используя UDP порт 520.\\
В современных сетевых средах RIP – не самое лучшее решение для выбора в качестве протокола маршрутизации, так как его возможности уступают более современным протоколам, таким как EIGRP, OSPF. Ограничение на 15 транзитных участков не дает применять его в больших сетях. Преимущество этого протокола – простота конфигурирования.\\
В ходе проведения лабораторных работ мы будем строить небольшой сегмент внутридоменной сети. В этой связи оптимальным будет использовать протокол //**OSPF**//.\\
Для его включения в файле **///etc/frr/daemons//** необходимо включить соответствующий демон:\\
ospfd=yes
Помимо демонов отвечающих за соответствующий протокол маршрутизации, в frr постоянно включены три демона:\\
* **//watchfrr//** – это демон, который обрабатывает сбойные процессы демонов протоколов и интеллектуально перезапускает их по мере необходимости.\\
* **//zebra//** – менеджер ip-маршрутизации. Он обеспечивает обновление таблицы маршрутизации ядра, поиск интерфейсов и перераспределение маршрутов между различными протоколами маршрутизации.\\
* **//staticd//** – это демон, который управляет установкой и удалением статических маршрутов.\\
Теперь можно перезапустить сервис frr. Для этого необходимо выполнить следующую команду:\\
# systemctl restart frr
Однако после данной операции маршрутизатор ещё не заработает.
=== 3.3.4. Настройка маршрутизации на основе протокола OSPF ===
После перезапуска frr зайдём в консоль управления маршрутизатором. Для этого выполним:\\
# vtysh
Для конфигурации необходимо зайти в терминал конфигурации. Для этого в терминале vtysh выполним:\\
debian# configure terminal
debian(config)# router ospf
debian(config-router)# ospf router-id 10.0.30.10
debian(config-router)# network 10.0.30.0/24 area 0
debian(config-router)# network 10.0.50.0/24 area 1
debian(config-router)# exit
debian(config)# exit
debian# wr
Note: this version of vtysh never writes vtysh.conf
Building Configuration...
Integrated configuration saved to /etc/frr/frr.conf
[OK]
debian#
root@debian:/home/user# ufw allow to 224.0.0.5
Rules updated
root@debian:/home/user#