Как настраивать статическую маршрутизацию в Linux?

«Как настраивать статическую маршрутизацию в Linux?» — вопрос из категории Сети, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Я настраиваю статическую маршрутизацию в Linux в зависимости от дистрибутива и use case. Вот практические примеры из моей работы с серверами и контейнерами:

1. Временная настройка (для тестирования):

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

# Маршрут через конкретный интерфейс (point-to-point)
sudo ip route add 172.16.0.0/16 dev tun0

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

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

# Удаление маршрута
sudo ip route del 192.168.100.0/24 via 10.0.0.1

2. Постоянная настройка (разные дистрибутивы):

Для Ubuntu/Debian (netplan):

# /etc/netplan/01-netcfg.yaml
network:
  version: 2
  ethernets:
    eth0:
      addresses:
        - 10.0.0.10/24
      routes:
        - to: 192.168.100.0/24
          via: 10.0.0.1
        - to: 0.0.0.0/0
          via: 10.0.0.254
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]

Применение: sudo netplan apply

Для RHEL/CentOS/Rocky Linux (nmcli):

# Добавление статического маршрута
sudo nmcli connection modify eth0 +ipv4.routes "192.168.100.0/24 10.0.0.1"

# Или через файл в /etc/sysconfig/network-scripts/
# route-eth0
192.168.100.0/24 via 10.0.0.1

# Перезапуск сети
sudo nmcli connection up eth0

3. Практические сценарии из DevOps практики:

Сценарий 1: Доступ к внутренней сети через VPN

# После подключения OpenVPN
sudo ip route add 10.8.0.0/24 dev tun0
sudo ip route add 172.16.0.0/16 via 10.8.0.1

# Сохранение для автоматического применения
echo "up ip route add 172.16.0.0/16 via 10.8.0.1" >> /etc/network/interfaces

Сценарий 2: Multi-homed сервер с двумя провайдерами

# Основной шлюз для интернета
sudo ip route add default via 192.168.1.1 dev eth0 metric 100

# Резервный шлюз
sudo ip route add default via 10.0.0.1 dev eth1 metric 200

# Специфичные сети через определенный интерфейс
sudo ip route add 203.0.113.0/24 via 10.0.0.1 dev eth1

Сценарий 3: Kubernetes node с календанным интерфейсом для storage network

# В cloud-init или systemd service
sudo ip addr add 172.20.0.10/24 dev eth1
sudo ip link set eth1 up
sudo ip route add 172.20.0.0/24 dev eth1

# Для Ceph или GlusterFS
sudo ip route add 172.20.1.0/24 via 172.20.0.1 dev eth1

4. Отладка и проверка:

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

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

# Проверка доступности через конкретный интерфейс
ping -I eth1 172.20.0.1

# Просмотр метрик маршрутов
ip route show | grep metric

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

5. Автоматизация в инфраструктуре как код:

# В Terraform для AWS instance
resource "aws_route" "internal_network" {
  route_table_id         = aws_route_table.main.id
  destination_cidr_block = "10.100.0.0/16"
  instance_id            = aws_instance.vpn.id
}

# В Ansible
- name: Add static route
  community.general.nmcli:
    conn_name: "Wired connection 1"
    type: "802-3-ethernet"
    ip4: "192.168.1.10/24"
    gw4: "192.168.1.1"
    route4:
      - "10.0.0.0/8 192.168.1.254"
    state: present

В production средах я предпочитаю управлять маршрутизацией через cloud provider (AWS Route Tables, GCP Routes) или SDN решения (Calico, Cilium в k8s), а статическую маршрутизацию на отдельных серверах использую только для специфичных случаев типа VPN gateway или multi-homed систем.