Маршрутизация в Linux
Давайте поговорим о том, какие существуют виды маршрутизации и как их использовать. Рассмотрим основные принципы, разберемся в деталях, а так же приведем примеры.
Маршрутизация в 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
Экономия IP-адресов: NAT позволяет локальным устройствам использовать небольшой набор публичных IP-адресов для доступа в Интернет, экономя тем самым драгоценные IPv4-адреса.
Безопасность: NAT может служить дополнительным слоем безопасности, так как скрывает структуру локальной сети от внешнего мира.
Маскировка (Masquerading): Это особый вид NAT, используемый для анонимизации всей локальной сети за единым IP-адресом при выходе в Интернет.
Виды NAT
Static NAT: В этом режиме каждому локальному устройству сопоставляется постоянный публичный IP-адрес. Это полезно, когда локальные устройства предоставляют какие-то службы, доступные извне.
Dynamic NAT: Публичные IP-адреса выделяются динамически из пула доступных адресов. Каждому устройству присваивается уникальный публичный IP-адрес на определенное время, а затем возвращается в пул.
PAT (Port Address Translation) или NAPT (Network Address and Port Translation): Это разновидность Dynamic NAT, где не только адреса, но и порты изменяются. Это позволяет нескольким устройствам использовать один и тот же публичный IP-адрес, различаясь по портам.
Принцип работы NAT
Локальная сеть: Внутри локальной сети устройства имеют локальные IP-адреса, которые обычно не маршрутизируются в глобальной сети Интернет. Локальные адреса используются для идентификации устройств внутри локальной сети.
Публичный IP-адрес: У маршрутизатора, поддерживающего NAT, есть как минимум один публичный IP-адрес, который используется для общения с внешней сетью, например, Интернетом.
Таблица соответствия (Translation Table): Маршрутизатор NAT поддерживает таблицу соответствия, где отслеживаются соответствия между локальными и публичными адресами. Эта таблица используется для преобразования пакетов данных.
Преобразование адресов и портов: При выходе пакета из локальной сети в Интернет, маршрутизатор NAT изменяет локальный адрес и порт на свой публичный адрес и уникальный порт (порт маскировки). Этот процесс называется исходным NAT (Source NAT или SNAT).
Обратное преобразование: Когда ответный пакет приходит обратно от Интернета, маршрутизатор NAT использует таблицу соответствия для определения, куда направить этот ответ в локальной сети. Затем происходит обратное преобразование адресов и портов (Destination NAT или DNAT), возвращая пакет исходному устройству.
NAT тесно связан с цепочками маршрутизации в Linux и iptables. NAT применяется на этапах маршрутизации, и его правила могут быть добавлены в различные цепочки для обработки трафика.
Прежде чем понять, как NAT связан с цепочками маршрутизации, давайте вспомним, как работает NAT:
PREROUTING: На этом этапе NAT может использоваться для изменения адреса и/или порта пакетов до того, как они будут переданы на решение о маршрутизации. Например, на этом этапе могут применяться правила маскировки (Source NAT, или SNAT).
POSTROUTING: На этом этапе NAT применяется к исходящим пакетам после прохождения решения о маршрутизации. Здесь, например, может использоваться правило маскировки (Destination NAT, или DNAT).
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
.
Благодарю за внимание!