Ответ
Я настраиваю статическую маршрутизацию в 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 систем.