Перейти к основному содержимому

Настройка системы маршрутизации на сервере Linux Ubuntu

· 13 мин. чтения
Молчанов Артём
Создатель данного хендбука

Ubuntu

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

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

Теоретическая часть

Основы IP-маршрутизации

Маршрутизация основывается на таблице маршрутизации (routing table), которая содержит информацию о том, куда должны направляться пакеты с различными IP-адресами назначения. Каждая запись в таблице маршрутизации содержит следующие основные параметры:

  • Destination — сеть назначения (в формате IP/маска)
  • Gateway — IP-адрес шлюза (следующего маршрутизатора)
  • Genmask — маска подсети назначения
  • Flags — флаги маршрута (U - активен, G - через шлюз, H - хост)
  • Metric — метрика (приоритет) маршрута
  • Iface — сетевой интерфейс для отправки пакетов

Типы маршрутов

Статические маршруты — конфигурируются администратором вручную и остаются неизменными до тех пор, пока не будут изменены или удалены.

Динамические маршруты — создаются автоматически протоколами динамической маршрутизации (RIP, OSPF, BGP) и адаптируются к изменениям топологии сети.

Маршрут по умолчанию (default gateway) — используется для отправки пакетов в сети, для которых нет конкретного маршрута в таблице.

Прямые маршруты (directly connected) — создаются автоматически для сетей, к которым непосредственно подключен сервер.

Подготовка системы

Проверка сетевой конфигурации

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

# Просмотр сетевых интерфейсов
ip link show

# Просмотр IP-адресов на интерфейсах
ip addr show

# Альтернативный способ (устаревший, но все еще используемый)
ifconfig

Пример вывода команды ip addr show:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP
inet 192.168.1.10/24 brd 192.168.1.255 scope global eth0
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP
inet 10.0.0.1/24 brd 10.0.0.255 scope global eth1

Просмотр текущей таблицы маршрутизации

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

# Современный способ с использованием iproute2
ip route show

# Альтернативные команды
route -n
netstat -rn

Пример таблицы маршрутизации:

default via 192.168.1.1 dev eth0 proto static
10.0.0.0/24 dev eth1 proto kernel scope link src 10.0.0.1
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10

Расшифровка:

  • Первая строка указывает маршрут по умолчанию через шлюз 192.168.1.1
  • Вторая и третья строки — прямые маршруты к подключенным сетям

Включение IP-форвардинга

IP-форвардинг (пересылка IP-пакетов) — это возможность Linux-системы передавать пакеты между различными сетевыми интерфейсами. По умолчанию эта функция отключена из соображений безопасности.

Временное включение

Для временного включения форвардинга (до перезагрузки системы):

# Включение IPv4 форвардинга
sudo sysctl -w net.ipv4.ip_forward=1

# Проверка текущего состояния
sysctl net.ipv4.ip_forward

# Или альтернативный способ
cat /proc/sys/net/ipv4/ip_forward

Значение 1 означает включено, 0 — выключено.

Постоянное включение

Для сохранения настроек после перезагрузки необходимо отредактировать файл /etc/sysctl.conf:

sudo nano /etc/sysctl.conf

Добавьте или раскомментируйте строку:

net.ipv4.ip_forward=1

Для IPv6 (если используется):

net.ipv6.conf.all.forwarding=1

Применить изменения без перезагрузки:

sudo sysctl -p

Проверка форвардинга для конкретных интерфейсов

Иногда требуется более гранулярный контроль:

# Просмотр настроек для конкретного интерфейса
cat /proc/sys/net/ipv4/conf/eth0/forwarding

# Включение форвардинга для всех интерфейсов
sudo sysctl -w net.ipv4.conf.all.forwarding=1

# Включение для конкретного интерфейса
sudo sysctl -w net.ipv4.conf.eth1.forwarding=1

Настройка статической маршрутизации

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

Использование команды ip route

Современный и рекомендуемый способ — использование утилиты ip из пакета iproute2:

# Добавление маршрута к конкретной сети через шлюз
sudo ip route add 172.16.0.0/24 via 192.168.1.254 dev eth0

# Добавление маршрута к сети через интерфейс (без указания шлюза)
sudo ip route add 10.10.0.0/16 dev eth1

# Добавление маршрута к конкретному хосту
sudo ip route add 203.0.113.5 via 192.168.1.1

# Добавление маршрута по умолчанию
sudo ip route add default via 192.168.1.1 dev eth0

Параметры команды ip route

Команда ip route поддерживает множество дополнительных параметров:

# Добавление маршрута с метрикой
sudo ip route add 192.168.100.0/24 via 10.0.0.254 metric 100

# Добавление маршрута с указанием source address
sudo ip route add 192.168.50.0/24 via 10.0.0.1 src 10.0.0.5

# Добавление маршрута с MTU
sudo ip route add 192.168.200.0/24 via 10.0.0.1 mtu 1400

# Добавление маршрута через конкретную таблицу
sudo ip route add 172.20.0.0/16 via 192.168.1.254 table 100

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

# Удаление конкретного маршрута
sudo ip route del 172.16.0.0/24

# Удаление маршрута по умолчанию
sudo ip route del default

# Удаление маршрута через конкретный шлюз
sudo ip route del 10.10.0.0/16 via 192.168.1.254

Изменение существующих маршрутов

# Изменение маршрута
sudo ip route change 192.168.100.0/24 via 10.0.0.100

# Замена маршрута (удаляет старый, если существует)
sudo ip route replace 192.168.100.0/24 via 10.0.0.200

Постоянные статические маршруты в Ubuntu

Маршруты, добавленные командой ip route, не сохраняются после перезагрузки. Существует несколько способов сделать их постоянными:

Метод 1: Использование Netplan (Ubuntu 18.04+)

Netplan — это современная утилита конфигурации сети в Ubuntu. Файлы конфигурации находятся в /etc/netplan/.

Создайте или отредактируйте файл (например, /etc/netplan/01-netcfg.yaml):

network:
version: 2
renderer: networkd
ethernets:
eth0:
addresses:
- 192.168.1.10/24
routes:
- to: 172.16.0.0/24
via: 192.168.1.254
metric: 100
- to: default
via: 192.168.1.1
nameservers:
addresses:
- 8.8.8.8
- 8.8.4.4
eth1:
addresses:
- 10.0.0.1/24
routes:
- to: 192.168.100.0/24
via: 10.0.0.254

Применить конфигурацию:

sudo netplan apply

# Или с более подробным выводом
sudo netplan --debug apply

# Проверка конфигурации перед применением
sudo netplan try

Метод 2: Использование /etc/network/interfaces (старые версии)

Для систем без Netplan можно использовать традиционный файл /etc/network/interfaces:

sudo nano /etc/network/interfaces

Добавьте маршруты:

auto eth0
iface eth0 inet static
address 192.168.1.10
netmask 255.255.255.0
gateway 192.168.1.1
up ip route add 172.16.0.0/24 via 192.168.1.254
down ip route del 172.16.0.0/24

auto eth1
iface eth1 inet static
address 10.0.0.1
netmask 255.255.255.0
up ip route add 192.168.100.0/24 via 10.0.0.254

Метод 3: Создание скрипта в /etc/network/if-up.d/

Создайте исполняемый скрипт:

sudo nano /etc/network/if-up.d/static-routes

Добавьте содержимое:

#!/bin/bash

# Добавление статических маршрутов
ip route add 172.16.0.0/24 via 192.168.1.254 dev eth0
ip route add 192.168.100.0/24 via 10.0.0.254 dev eth1
ip route add 10.20.0.0/16 via 192.168.1.253 dev eth0

Сделайте скрипт исполняемым:

sudo chmod +x /etc/network/if-up.d/static-routes

Продвинутая маршрутизация

Множественные таблицы маршрутизации

Linux поддерживает до 255 таблиц маршрутизации, что позволяет реализовывать сложные сценарии маршрутизации на основе различных критериев.

Создание и использование дополнительных таблиц

Сначала определите таблицу в файле /etc/iproute2/rt_tables:

sudo nano /etc/iproute2/rt_tables

Добавьте свои таблицы:

# Зарезервированные таблицы
255 local
254 main
253 default
0 unspec

# Пользовательские таблицы
100 provider1
101 provider2
200 internal

Добавление маршрутов в конкретную таблицу:

# Добавление маршрутов в таблицу provider1
sudo ip route add default via 203.0.113.1 dev eth0 table provider1
sudo ip route add 203.0.113.0/24 dev eth0 scope link table provider1

# Добавление маршрутов в таблицу provider2
sudo ip route add default via 198.51.100.1 dev eth1 table provider2
sudo ip route add 198.51.100.0/24 dev eth1 scope link table provider2

# Просмотр конкретной таблицы
ip route show table provider1

Policy-based routing (маршрутизация на основе правил)

Policy-based routing позволяет выбирать маршруты на основе различных критериев: исходящего IP-адреса, входящего интерфейса, типа службы и т.д.

Создание правил маршрутизации

# Направить трафик от конкретной сети через таблицу provider1
sudo ip rule add from 192.168.10.0/24 table provider1

# Направить трафик к конкретной сети через таблицу provider2
sudo ip rule add to 172.16.0.0/12 table provider2

# Маршрутизация на основе входящего интерфейса
sudo ip rule add iif eth0 table provider1

# Маршрутизация на основе метки (fwmark) от iptables
sudo ip rule add fwmark 1 table provider1

# Маршрутизация с приоритетом
sudo ip rule add from 10.0.0.0/8 table internal priority 100

# Просмотр всех правил
ip rule show

Пример вывода ip rule show:

0:      from all lookup local
100: from 10.0.0.0/8 lookup internal
32765: from 192.168.10.0/24 lookup provider1
32766: from all lookup main
32767: from all lookup default

Практический пример: балансировка нагрузки между двумя провайдерами

Настроим систему для использования двух интернет-каналов:

# Настройка таблиц маршрутизации
# Файл /etc/iproute2/rt_tables уже содержит provider1 и provider2

# Настройка таблицы provider1
sudo ip route add 203.0.113.0/24 dev eth0 src 203.0.113.10 table provider1
sudo ip route add default via 203.0.113.1 table provider1

# Настройка таблицы provider2
sudo ip route add 198.51.100.0/24 dev eth1 src 198.51.100.10 table provider2
sudo ip route add default via 198.51.100.1 table provider2

# Правила для выбора таблиц на основе исходящего адреса
sudo ip rule add from 203.0.113.10 table provider1
sudo ip rule add from 198.51.100.10 table provider2

# Балансировка нагрузки в основной таблице
sudo ip route add default scope global \
nexthop via 203.0.113.1 dev eth0 weight 1 \
nexthop via 198.51.100.1 dev eth1 weight 1

Маркировка пакетов с помощью iptables для маршрутизации

Использование firewall-меток (fwmark) позволяет маршрутизировать трафик на основе сложных правил фильтрации:

# Маркировка HTTP-трафика меткой 1
sudo iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 1

# Маркировка HTTPS-трафика меткой 2
sudo iptables -t mangle -A PREROUTING -p tcp --dport 443 -j MARK --set-mark 2

# Правила маршрутизации на основе меток
sudo ip rule add fwmark 1 table provider1
sudo ip rule add fwmark 2 table provider2

# Маркировка трафика от конкретного пользователя
sudo iptables -t mangle -A OUTPUT -m owner --uid-owner 1000 -j MARK --set-mark 3
sudo ip rule add fwmark 3 table internal

Source-based routing (маршрутизация на основе источника)

# Трафик от подсети 192.168.1.0/24 идет через provider1
sudo ip rule add from 192.168.1.0/24 table provider1

# Трафик от подсети 192.168.2.0/24 идет через provider2
sudo ip rule add from 192.168.2.0/24 table provider2

# Трафик от конкретного хоста
sudo ip rule add from 192.168.1.50 table provider1 priority 100

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

Протоколы динамической маршрутизации

Для автоматического обмена маршрутной информацией между маршрутизаторами используются протоколы динамической маршрутизации. В Linux наиболее популярным решением является FRRouting (FRR).

Установка FRRouting

# Добавление репозитория FRR
curl -s https://deb.frrouting.org/frr/keys.asc | sudo apt-key add -
echo deb https://deb.frrouting.org/frr $(lsb_release -s -c) frr-stable | sudo tee /etc/apt/sources.list.d/frr.list

# Обновление списка пакетов и установка
sudo apt update
sudo apt install frr frr-pythontools -y

Базовая настройка FRR

Конфигурационные файлы FRR находятся в /etc/frr/.

# Включение необходимых демонов
sudo nano /etc/frr/daemons

Измените на:

bgpd=yes
ospfd=yes
ripd=yes
zebra=yes

Основной файл конфигурации:

sudo nano /etc/frr/frr.conf

Пример конфигурации OSPF

! Базовая конфигурация
hostname ubuntu-router
log syslog informational

! Настройка интерфейсов
interface eth0
ip address 192.168.1.1/24

interface eth1
ip address 10.0.0.1/24

! Настройка OSPF
router ospf
ospf router-id 1.1.1.1
network 192.168.1.0/24 area 0
network 10.0.0.0/24 area 0
passive-interface eth0

line vty

Пример конфигурации RIP

router rip
version 2
network 192.168.1.0/24
network 10.0.0.0/24
redistribute connected

Пример базовой конфигурации BGP

router bgp 65001
bgp router-id 1.1.1.1
neighbor 203.0.113.1 remote-as 65002
!
address-family ipv4 unicast
network 192.168.1.0/24
neighbor 203.0.113.1 activate
exit-address-family

Перезапуск службы:

sudo systemctl restart frr
sudo systemctl enable frr

Управление FRR через vtysh

FRR использует интерфейс командной строки, похожий на Cisco IOS:

# Вход в интерфейс FRR
sudo vtysh

# Просмотр конфигурации
show running-config

# Просмотр таблицы маршрутизации
show ip route

# Просмотр OSPF соседей
show ip ospf neighbor

# Просмотр BGP соседей
show ip bgp summary

# Переход в режим конфигурации
configure terminal

# Сохранение конфигурации
write memory

# Выход
exit

NAT и маскарадинг

Network Address Translation (NAT) часто используется совместно с маршрутизацией для преобразования адресов.

Source NAT (SNAT) / Masquerading

Маскарадинг используется для предоставления доступа в Интернет компьютерам внутренней сети:

# Маскарадинг для всего трафика через eth0
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# SNAT с указанием конкретного IP (более производительный)
sudo iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 203.0.113.10

# SNAT для конкретной подсети
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

Destination NAT (DNAT) / Port Forwarding

Проброс портов для перенаправления входящих соединений:

# Проброс порта 80 на внутренний сервер
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 \
-j DNAT --to-destination 192.168.1.100:80

# Проброс диапазона портов
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8000:8100 \
-j DNAT --to-destination 192.168.1.100:8000-8100

# Проброс с изменением порта
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 2222 \
-j DNAT --to-destination 192.168.1.100:22

Сохранение правил iptables

Правила iptables не сохраняются автоматически:

# Установка пакета для сохранения правил
sudo apt install iptables-persistent -y

# Сохранение текущих правил
sudo netfilter-persistent save

# Или вручную
sudo iptables-save > /etc/iptables/rules.v4
sudo ip6tables-save > /etc/iptables/rules.v6

# Восстановление правил
sudo iptables-restore < /etc/iptables/rules.v4

Диагностика и устранение неполадок

Основные команды диагностики

# Трассировка маршрута
traceroute 8.8.8.8
tracepath 8.8.8.8

# MTR (комбинация ping и traceroute)
mtr 8.8.8.8

# Проверка связности
ping -c 4 8.8.8.8

# Проверка с указанием интерфейса
ping -I eth1 192.168.1.1

# Проверка с указанием source IP
ping -I 10.0.0.1 192.168.100.1

Анализ таблицы маршрутизации

# Подробный вывод таблицы маршрутизации
ip route show table all

# Просмотр кеша маршрутов
ip route show cache

# Проверка маршрута для конкретного назначения
ip route get 8.8.8.8

# Просмотр статистики маршрутов
ip -s route

Мониторинг в реальном времени

# Мониторинг изменений в таблице маршрутизации
ip monitor route

# Мониторинг изменений правил
ip monitor rule

# Просмотр сетевых соединений
ss -tunap

# Просмотр статистики интерфейсов
ip -s link

# Постоянный мониторинг с помощью watch
watch -n 1 'ip route show'

Захват и анализ трафика

# Установка tcpdump
sudo apt install tcpdump -y

# Захват трафика на интерфейсе
sudo tcpdump -i eth0

# Захват с фильтрацией по хосту
sudo tcpdump -i eth0 host 192.168.1.100

# Захват ICMP пакетов
sudo tcpdump -i eth0 icmp

# Сохранение в файл для последующего анализа
sudo tcpdump -i eth0 -w capture.pcap

# Просмотр захваченного файла
tcpdump -r capture.pcap

Проверка форвардинга пакетов

# Проверка счетчиков пакетов
sudo iptables -t filter -L FORWARD -v -n

# Добавление правила для логирования форвардинга
sudo iptables -I FORWARD -j LOG --log-prefix "FORWARD: " --log-level 4

# Просмотр логов
sudo tail -f /var/log/syslog | grep FORWARD

Типичные проблемы и решения

Проблема: Пакеты не проходят между интерфейсами

Решение:

# Проверьте включен ли IP forwarding
sysctl net.ipv4.ip_forward

# Проверьте правила firewall
sudo iptables -L FORWARD -v -n

# Разрешите форвардинг
sudo iptables -P FORWARD ACCEPT

Проблема: Маршрут существует, но не работает

Решение:

# Проверьте конкретный маршрут
ip route get DESTINATION_IP

# Проверьте ARP таблицу
ip neigh show

# Очистите ARP кеш
sudo ip neigh flush all

# Проверьте правила policy routing
ip rule show

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

Решение:

# Отключение rp_filter (reverse path filtering)
sudo sysctl -w net.ipv4.conf.all.rp_filter=0
sudo sysctl -w net.ipv4.conf.eth0.rp_filter=0

# Для постоянного применения добавьте в /etc/sysctl.conf:
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0

Оптимизация и безопасность

Параметры sysctl для оптимизации маршрутизации

sudo nano /etc/sysctl.conf

Добавьте следующие параметры:

# Основные параметры маршрутизации
net.ipv4.ip_forward=1
net.ipv4.conf.all.forwarding=1

# Защита от IP spoofing
net.ipv4.conf.all.rp_filter=1
net.ipv4.conf.default.rp_filter=1

# Игнорирование ICMP redirects
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.all.send_redirects=0

# Защита от SYN flood
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_max_syn_backlog=2048
net.ipv4.tcp_synack_retries=2

# Оптимизация производительности
net.ipv4.tcp_fin_timeout=15
net.ipv4.tcp_keepalive_time=300
net.ipv4.tcp_tw_reuse=1

# Увеличение размера таблицы маршрутизации
net.ipv4.route.max_size=2147483647

# Кеширование маршрутов
net.ipv4.route.gc_timeout=100

# IPv6 параметры (если используется)
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.all.accept_redirects=0

Применение:

sudo sysctl -p

Базовые правила безопасности firewall

# Политики по умолчанию
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

# Разрешение loopback
sudo iptables -A INPUT -i lo -j ACCEPT

# Разр