Маршрутизация в Linux

40f511ce555605dbab69d32d977e0cad.jpg

Давайте поговорим о том, какие существуют виды маршрутизации и как их использовать. Рассмотрим основные принципы, разберемся в деталях, а так же приведем примеры.

Маршрутизация в Linux, общем виде предоставляет средства для определения того, какие пути следует использовать для доставки пакетов данных. В этой статье мы рассмотрим основы маршрутизации в Linux и шаги по настройке маршрутизации.

Статическая маршрутизация

Статическая маршрутизация в Linux осуществляется с использованием утилиты ip. Она предоставляет широкий спектр возможностей для управления сетевыми интерфейсами, адресами и маршрутами. Для работы с маршрутизацией используйте команду ip route.

Просмотр текущих маршрутов

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

ip route show

Добавление статического маршрута

Добавление статического маршрута позволяет явно указать, какую сеть следует использовать для доставки пакетов. Пример команды для добавления статического маршрута:

sudo ip route add 192.168.1.0/24 via 10.0.0.1 dev eth0

В данном примере указывается, что для сети 192.168.1.0/24 следует использовать интерфейс eth0 с шлюзом 10.0.0.1.

Для вывода списка текущих интерфейсов используйте команду:

ifconfig

Удаление маршрута

sudo ip route del 192.168.1.0/24

Эта команда удалит статический маршрут к сети 192.168.1.0/24.

Динамическая маршрутизация

Настройка маршрутизации между интерфейсами

Linux может использоваться в качестве маршрутизатора для пересылки пакетов между различными сетевыми интерфейсами. Для этого нужно включить опцию в системе,

Как посмотреть включена ли опция

Для того, чтобы узнать, включена ли эта опция в системе, можно воспользоваться командами:

sysctl net.ipv4.ip_forward

либо

cat /proc/sys/net/ipv4/ip_forward

либо посмотреть в файле /etc/sysctl.conf

sudo nano /etc/sysctl.conf

Если в результате выполнения вы видете значение 0, то опция выключена и ее необходимо включить, для этого необходимо изменить значение с 0 на 1

Как включить маршрутизацию

sysctl -w net.ipv4.ip_forward=1

либо

echo 1 > /proc/sys/net/ipv4/ip_forward

либо изменить в файле

sudo nano /etc/sysctl.conf

ВАЖНО!

В случае изменений через файл: необходимо так же рассказать системе о необходимости эти изменения применить. Сделать это можно командой

sysctl -p

Управление сетевым трафиком через цепочки маршрутизации

Вот мы и добрались до основного механизма управления маршрутами — цепочки маршрутизации.

Цепочки iptables в Linux предоставляют мощные средства для фильтрации и манипуляции сетевым трафиком. Четыре основные цепочки — PREROUTING, POSTROUTING, FORWARD и INPUT — играют важную роль в обработке пакетов на разных этапах их передачи через систему.

Для управления маршрутами в Linux под капотом используется NAT.

Что за NAT и с чем его едят

NAT

Network Address Translation (NAT) — это технология, используемая в сетевых устройствах, для преобразования сетевых адресов и портов пакетов данных при их прохождении через устройство. Основная цель NAT заключается в том, чтобы позволить нескольким устройствам в локальной сети использовать один и тот же публичный IP-адрес для доступа в интернет.

Применение NAT

  1. Экономия IP-адресов: NAT позволяет локальным устройствам использовать небольшой набор публичных IP-адресов для доступа в Интернет, экономя тем самым драгоценные IPv4-адреса.

  2. Безопасность: NAT может служить дополнительным слоем безопасности, так как скрывает структуру локальной сети от внешнего мира.

  3. Маскировка (Masquerading): Это особый вид NAT, используемый для анонимизации всей локальной сети за единым IP-адресом при выходе в Интернет.

Виды NAT

  1. Static NAT: В этом режиме каждому локальному устройству сопоставляется постоянный публичный IP-адрес. Это полезно, когда локальные устройства предоставляют какие-то службы, доступные извне.

  2. Dynamic NAT: Публичные IP-адреса выделяются динамически из пула доступных адресов. Каждому устройству присваивается уникальный публичный IP-адрес на определенное время, а затем возвращается в пул.

  3. PAT (Port Address Translation) или NAPT (Network Address and Port Translation): Это разновидность Dynamic NAT, где не только адреса, но и порты изменяются. Это позволяет нескольким устройствам использовать один и тот же публичный IP-адрес, различаясь по портам.

Принцип работы NAT

  1. Локальная сеть: Внутри локальной сети устройства имеют локальные IP-адреса, которые обычно не маршрутизируются в глобальной сети Интернет. Локальные адреса используются для идентификации устройств внутри локальной сети.

  2. Публичный IP-адрес: У маршрутизатора, поддерживающего NAT, есть как минимум один публичный IP-адрес, который используется для общения с внешней сетью, например, Интернетом.

  3. Таблица соответствия (Translation Table): Маршрутизатор NAT поддерживает таблицу соответствия, где отслеживаются соответствия между локальными и публичными адресами. Эта таблица используется для преобразования пакетов данных.

  4. Преобразование адресов и портов: При выходе пакета из локальной сети в Интернет, маршрутизатор NAT изменяет локальный адрес и порт на свой публичный адрес и уникальный порт (порт маскировки). Этот процесс называется исходным NAT (Source NAT или SNAT).

  5. Обратное преобразование: Когда ответный пакет приходит обратно от Интернета, маршрутизатор NAT использует таблицу соответствия для определения, куда направить этот ответ в локальной сети. Затем происходит обратное преобразование адресов и портов (Destination NAT или DNAT), возвращая пакет исходному устройству.

NAT тесно связан с цепочками маршрутизации в Linux и iptables. NAT применяется на этапах маршрутизации, и его правила могут быть добавлены в различные цепочки для обработки трафика.

Прежде чем понять, как NAT связан с цепочками маршрутизации, давайте вспомним, как работает NAT:

  1. PREROUTING: На этом этапе NAT может использоваться для изменения адреса и/или порта пакетов до того, как они будут переданы на решение о маршрутизации. Например, на этом этапе могут применяться правила маскировки (Source NAT, или SNAT).

  2. POSTROUTING: На этом этапе NAT применяется к исходящим пакетам после прохождения решения о маршрутизации. Здесь, например, может использоваться правило маскировки (Destination NAT, или DNAT).

  3. FORWARD: Если ваша система работает в режиме маршрутизатора, то между сетями применяются правила NAT в цепочке FORWARD, так что они применяются к трафику, который проходит через ваш маршрутизатор.

Подробнее об элементах цепочки маршрутизации

Какие задачи решают элементы цепочки

PREROUTING

  • Таблица: nat

  • Описание: Эта цепочка является частью процесса Network Address Translation (NAT). Она вызывается перед тем, как пакет пройдет маршрутизацию. Операции в цепочке PREROUTING выполняются сразу после прихода пакета на сетевой интерфейс.

  • Сценарии использования:

    • Изменение адресов назначения с использованием DNAT (Destination NAT).

    • Применение переадресации портов.

    • Изменение характеристик пакета перед маршрутизацией.

  • Пример:

iptables -t nat -A PREROUTING ...

POSTROUTING

  • Таблица: nat

  • Описание: Эта цепочка также является частью процесса NAT и вызывается после того, как пакет был маршрутизирован. Операции в цепочке POSTROUTING выполняются непосредственно перед тем, как пакет покидает сетевой интерфейс.

  • Сценарии использования:

    • Изменение исходных адресов с использованием SNAT (Source NAT).

    • Masquerading — Маскировка (изменение исходного адреса на адрес хоста).

    • Применение операций перед тем, как пакет покидает хост.

  • Пример:

iptables -t nat -A POSTROUTING ...

FORWARD

  • Таблица: filter

  • Описание: Цепочка FORWARD является частью процесса фильтрации пакетов и участвует в обработке пакетов, которые пересылаются через хост. Проверяется на пакеты, которые не предназначены и не созданы самим хостом.

  • Сценарии использования:

    • Настройка правил для пересылки трафика между интерфейсами.

    • Фильтрация пакетов, которые пересылаются через хост.

  • Пример:

iptables -A FORWARD ...

В общем виде их взаимодействие можно представить в виде конвеера

      +---------------------------------------+
      |                PREROUTING              |
      |                                       |
      v                                       |
+-------------+            +-------------+     |
|   Routing   |------------| Forwarding  |     |
|  Decision   |            |             |     |
+-------------+            +-------------+     |
      |                                       |
      v                                       |
+-------------+            +-------------+     |
|   INPUT     |            |  FORWARD    |     |
|             |            |             |     |
+-------------+            +-------------+     |
      |                                       |
      v                                       |
+-------------+            +-------------+     |
|  OUTPUT     |            | POSTROUTING |     |
|             |            |             |     |
+-------------+            +-------------+     |
      |                                       |
      v                                       |
+-----------------------------------------------+
|                  Network Stack                  |
+-----------------------------------------------+

ВАЖНО!

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

Подытожим:

Эти цепочки, вместе с другими, такими как INPUT и OUTPUT, позволяют администраторам определять правила для обработки пакетов, фильтрации и NAT на различных этапах путешествия пакета через стек сетевых протоколов.

  • INPUT: Здесь обрабатываются пакеты, адресованные самой системе. Происходит после цепочки PREROUTING.

  • PREROUTING: Вызывается перед маршрутизацией, часто используется для изменения адресов назначения. Здесь применяются манипуляции до базовых проверок, таких как фильтрация в цепочке INPUT.

  • POSTROUTING: Вызывается после маршрутизации, часто используется для изменения исходных адресов. Манипуляции с пакетами после выхода из системы, но до окончательной передачи в сеть. Происходит после цепочки OUTPUT.

  • FORWARD: Часть процесса фильтрации пакетов, применяется к пакетам, пересылаемым через хост. Цепочка для пакетов, маршрутизируемых через систему, но не адресованных самой системе.

Примеры

В качестве примера давайте рассморим случай, когда наш Linux хост выступает в роли маршрутизатора.

Для простоты будем использовать 2 сети, в реальном мире должно быть минимум 3 — третья DMZ. В ней должны располагаться хосты, напрямую взаимодействующие с внешним миром

Давайте представим, что у нас есть 2 сети — Local (192.168.0.0/24) и Internet (0.0.0.0/8).

Роутер имеет 2 интерфейса — один смотрит в интернет (eth0), другой в локальную сеть (eth1). В локальной сети имеется 2 хоста:

  • первый выступает в роли веб — сервера: имеет адрес 192.168.0.10 и ожидает запросы на портах 80\443

  • второй — имеет адрес 192.168.0.11 и ожидает запросы на порту 1234

Схематичное взаимодействие представлено в виде диаграммы:

+------------------------+      +------------------------+      +------------------------+
|       Local Network    |      |         Router         |      |        Internet        |
|   (192.168.0.0/24)     |      | (Public IP on eth0)    |------|      (0.0.0.0/8)       |
|                        |------| (Private IP on eth1)   |      |                        |
|   +----------------+   |      |   +----------------+   |      |                        |
|   |   Web Server   |   |      |   |   iptables     |   |      |                        |
|   |                |   |      |   |(PREROUTING,    |   |      |                        |
|   |(192.168.0.10)  |   |      |   | POSTROUTING,   |   |      |                        |
|   |(Port 80)       |   |      |   |   FORWARD)     |   |      |                        |
|   +----------------+   |      |   +----------------+   |      +------------------------+
|   +----------------+   |      |                        |
|   |   Host 2       |   |      |                        |
|   |                |   |      |                        |
|   |(192.168.0.11)  |   |      |                        |
|   |(Port 1234)     |   |      |                        |
|   +----------------+   |      |                        |
+------------------------+      +------------------------+

Попробуем перенаправить запросы поступающие на роутер по портам 80\443\1234 к этим хостам.

Предположим, что мы используем дистрибутив Ubuntu Server.

Для начала давайте установим и сконфигурируем firewall. Для этого выполним команды:

sudo apt-get update
sudo apt-get install ufw
sudo ufw allow 80/tcp       # Разрешить веб-сервер на порту 80
sudo ufw allow 443/tcp      # Разрешить веб-сервер на порту 443
sudo ufw allow 1234/tcp     # Разрешить порт 1234 для Host 2

Перед тем, как включить firewall, если вы работаете по ssh, не забудте разрешить и этот порт, иначе вы больше не сможете подключиться к серверу:

sudo ufw allow 22/tcp       # Разрешить SSH на порту 22

Теперь спокойно включаем firewall:

sudo ufw enable             # Включить UFW

Для перенаправления запросов на указанные порты к соответствующим хостам в локальной сети, мы можем использовать iptables и настроить правила маскировки (NAT) в цепочках PREROUTING и POSTROUTING.

# Определяем интерфейсы
EXTERNAL_IF="eth0"
INTERNAL_IF="eth1"

# Правило для перенаправления портов 80 и 443 на хост с адресом 192.168.0.10
iptables -t nat -A PREROUTING -i $EXTERNAL_IF -p tcp --dport 80 -j DNAT --to-destination 192.168.0.10:80
iptables -t nat -A PREROUTING -i $EXTERNAL_IF -p tcp --dport 443 -j DNAT --to-destination 192.168.0.10:443

# Правило для перенаправления порта 1234 на хост с адресом 192.168.0.11
iptables -t nat -A PREROUTING -i $EXTERNAL_IF -p tcp --dport 1234 -j DNAT --to-destination 192.168.0.11:1234

# Правило для маскировки исходящего трафика от хостов в локальной сети
iptables -t nat -A POSTROUTING -o $EXTERNAL_IF -j MASQUERADE

# Разрешаем пересылку пакетов между интерфейсами
echo 1 > /proc/sys/net/ipv4/ip_forward

Вот и казалось бы, все! — Но есть еще один важный момент — данные изменения не переживут перезагрузку. Для решения данного вопроса будем использовать утилиту командной строки iptables-persistent.

Установим ее

sudo apt-get install iptables-persistent

и сохраним внесенные изменения

sudo iptables-save

Теперь, после перезагрузки сервера, ufw и iptables будут использовать сохраненные правила. Если вы внесете изменения в правила ufw, они также будут автоматически сохранены при использовании ufw enable или ufw reload.

Благодарю за внимание!

© Habrahabr.ru