Linux несколько таблиц маршрутизации

Обновлено: 05.07.2024

Настройка нескольких таблиц маршрутизации на одном сервере

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

Общий принцип настройки для всех систем один, мы рассматриваем настройку на примере Ubuntu.

Предположим, у нас есть сервер с двумя физическими интерфейсами — eth0 и eth1. На каждый из них добавлено по ip-адресу. Это могут быть как адреса из одного broadcast домена (к примеру, 10.10.10.2/30 и 10.10.10.3/30), так и из разных. В данном примере рассматривается второй случай, но принципиальной разницы нет:

Интерфейсы eth0 и eth1

Вывод команды ip address (просмотр сетевых параметров, сконфигурированных на интерфейсах сервера) для каждого из интерфейсов:

Маршруты на сервере:

Default маршрут настроен через интерфейс eth0 шлюз 10.10.1.1:

Это значит, что все ответные пакеты с данными будут отправляться через этот интерфейс eth0 и с source адресом 10.10.1.2. К примеру, если с такой конфигурацией сделать попытку подключиться по ssh к серверу по адресу 172.16.1.2, назначенному на eth1, сервер попытается ответить через eth0, и соединение не будет установлено, т.к. даже если разрешен проброс пакетов между интерфейсами, ответ будет отправлен не с тем source адресом:

eth0 и с source адресом 10.10.1.2

Чтобы заставить сервер отвечать с того же интерфейса, куда прилетел пакет, несмотря на default route, можно настроить несколько таблиц маршрутизации. Мы рассматриваем пример с настройкой двух дополнительных таблиц, но их количество может быть больше.

По умолчанию на сервере всегда присутствуют три стандартные таблицы:

Это таблицы local, main и default. Таблицы создаются в файле /etc/iproute2/rt_tables. Просмотреть содержимое конфигурационного файла можно командой:

Результат выполнения команды:

Т.е. для создания новых таблиц (назовем их table1 и table2), “привязанных” к eth0 и eth1 соответственно, добавляем в этот файл следующее:

Номер таблицы (100 и 101) нужно брать в диапазоне [2; 252]. В таком случае приоритет таблиц будет меньше, чем у таблиц main и default, и поиск маршрутов будет производиться сначала в таблицах table1 и table2. Итак, проверим, что таблицы созданы:

Результат выполнения команды:

Но в правилах они пока не отображены:

Добавляем правила и default маршруты для каждой из таблиц:

При создании правила используем интересующий нас адрес, добавленный на интерфейс сервера, например, для интерфейса eth0 используется адрес 10.10.1.2, при добавлении default маршрута прописываем адрес шлюза сети (в примере выше для 10.10.1.2/24 это 10.10.1.1) и интерфейс, через который отправлять пакет.

Теперь при обращении к адресу 10.10.1.2 сервер будет отвечать через интерфейс eth0 с source адресом 10.10.1.2, а при обращении к 172.16.1.2, соответственно, через интерфейс eth1 с source адресом 172.16.1.2:

Интерфейс eth1 с source адресом 172.16.1.2

При этом для исходящих соединений с сервера ничего не изменится, они будут идти по общему default маршруту, взятому из основной таблицы main.

Для просмотра маршрутов, содержащихся в определенной таблице,к команде ip route show добавляется table table_name:

Аналогичные настройки двух таблиц могут быть выполнены и если адреса назначены на одном интерфейсе. Например, если на сервере только один интерфейс eth0:

Это будет выглядеть следующим образом:

В завершение необходимо внести правки в файл /etc/network/interfaces, чтобы новая конфигурация была доступна в случае, если сервер перезагрузится, либо будет перечитана сетевая конфигурация. Ниже приведен пример содержания данного конфигурационного файла с добавлением правил и default маршрутов в созданные таблицы, в примере общий default маршрут прописан через интерфейс eth0 с указанием шлюза 10.10.1.1:

Если на сервере один интерфейс, то правила для таблиц будут прописаны в секции конфигурации eth0.

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

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

Вначале пробую маршрутизацию всего трафика через vpn:

Теперь пытаюсь использовать две таблицы маршрутизации:

теперь все, кроме 80 порта работает.

Допустим, у тебя на eth1 адрес 192.168.1.1/24. Тогда добавь следующий маршрут:

Также для всех сеток, доступных непосредственно с интерфейсов твоего шлюза.

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

для tun0 делал? маршруты, которые необходимо добавить, можно узнать так:


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


tcpdump. Запускаете на перехват пакетов на tun0 на 80 порт и пытаетесь что-нибудь загрузить с клиента. Там будет видно, проходят ли пакеты вобще (FORWARD), уходят ли с нужным src-ip адресом, чтобы ответ шёл тоже через тунель (SNAT), или вобще даже приходят ответные, но, опять таки, могут резаться в FORWARD.


iptables -A PREROUTING -t mangle -i eth1 -p tcp --dport 80 -j MARK --set-mark 1
iptables -A PREROUTING -t mangle -i eth1 -p tcp --dport 80 -j CONNMARK --set-mark 1

Я, кстати, не понял, что тебе нужно. Опиши подробнее (точнее).

uspen ★★★★★ ( 11.12.14 19:01:21 )
Последнее исправление: uspen 11.12.14 19:06:27 (всего исправлений: 1)

хочу заставить трафик на определенные порты ходить через vpn, а остальной напрямую через провайдера


таблицы:
main - маршрутизирует через tun0
myinet - маршрутизирует через eth0

проверяю с включенной маркировкой(направляем через myinet):

в tun0 - пусто
в eth0:

без маркировки(через main):

в eth0 - пусто
в tun0:

Ты бы хоть на мой вопрос ответил, получил бы ответ быстрее.

По поводу твоего теста с маркировкой - либо добавь правило

, либо отключи rp_filter на eth0. Лучше первое, т.к. решает конкретно твою задачу.

так маркированные пакеты как раз идут напрямую через провайдера и не используют vpn. зачем тогда добавлять tun0 в myinet?

твое правило никак не повлияло(сейчас посмотрю насчет rp_filter)

поведение пока что меняется только правилом:

так маркированные пакеты как раз идут напрямую через провайдера и не используют vpn. зачем тогда добавлять tun0 в myinet?

Я был под впечатлением, что маркированные пакеты должны уходить через туннель. Видимо не так прочитал, ок.

ничего не поменялось

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

0 надо не в default писать, а конкретно в нужный интерфейс.

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

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

Сетевые маршруты в Linux

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

Ниже мы рассмотрим как проверить текущие маршруты в системе, а также как настроить новые.

Как посмотреть таблицу маршрутизации

Перед тем как что-либо менять, нужно понять какие правила уже используются. В Linux для этого существует несколько команд. Чтобы посмотреть таблицу маршрутизации можно использовать команду route:



Тут вы уже можете видеть IP адрес цели (target), IP адрес шлюза (gateway), IP отправителя (source), протокол, и даже сетевой интерфейс. Но самый удобный способ посмотреть таблицу маршрутизации linux - это команда ip:


Вывод похож на результат предыдущей команды, но выглядит не совсем привычно, это потому, что вывод команды можно использовать в качестве аргумента для ip route add или ip route del. Это очень удобно. Как вы видите, в качестве шлюза по умолчанию везде используется 192.168.1.1. Рассмотрим подробнее что означает вывод этой команды:

  • default - в данной строке означает вариант по умолчанию. Здесь должен быть ip адрес цели или маска подсети;
  • via 192.168.1.1 - указывает через какой шлюз мы можем добраться до этой цели, у нас это 192.168.1.1;
  • dev enp2s0 - сетевой интерфейс, с помощью которого будет доступен этот шлюз;
  • proto static - означает, что маршрут был установлен администратором, значение kernel значит что он был установлен ядром;
  • metric - это приоритет маршрута, чем меньше значение - тем выше приоритет.

А теперь рассмотрим выполняется настройка маршрутов Linux.

Настройка маршрутов в Linux

Вы можете настраивать таблицу маршрутизации с помощью команды ip. Например, чтобы изменить маршрут по умолчанию достаточно выполнить:

ip route add default via 192.168.1.1

Так вы можете добавить маршрут для любого IP адреса, например, для 243.143.5.25:

sudo ip route add 243.143.5.25 via 192.168.1.1

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

В операционных системах семейства Red Hat используются конфигурационные файлы /etc/sysconfig/network-scripts/route-ethX. Каждый файл может описывать несколько маршрутов, например:

GATEWAY=10.10.0.1
NETMASK=255.0.0.0
IPADDR=10.10.0.22

Здесь gateway - шлюз по умолчанию для этого интерфейса, netmask - маска сети, а ipaddr - ip адрес интерфейса. В Debian и основанных на нем дистрибутивах можно настроить маршруты в файле /etc/network/interfaces. Здесь команда route добавляется в секцию iface. Например:

up route add -net 10.10.0.0 netmask 255.0.0.0 gw 10.10.0.1

С помощью опции -net мы указываем целевую сеть, netmask - это маска сети, а gw - шлюз. Все очень просто. Теперь добавленные маршруты останутся даже после перезагрузки.

Выводы

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

date

13.04.2020

directory

CentOS, Linux

comments

Комментариев пока нет

В этой статье мы рассмотрим особенности настройки маршрутизации и управления маршрутами в Linux (просмотр таблицы маршрутизации, добавление/удаление статических маршрутов и т.д.) на примере CentOS с помощью утилиты ip. Статья применима и для любого другого дистрибутива Linux с утилитой ip (Red Hat, Fedora и т.д.).

Для управления маршрутизацией в Linux предпочтительно исопльзовать утилиту ip , а не route . Команда route не позволяет настраивать расширенные возможности маршрутизации (например, политики маршрутизации), и не покажет специальные настройки маршрутизации, если они уже сделаны через ip.

Просмотр таблицы маршрутизации в Linux

Чтобы вывести текущую таблицу маршрутизации в Linux выполните команду:

вывести таблицу маршрутизации в linux centos ip router

  • default via 192.168.1.1 dev enp0s3 – шлюз по умолчанию, в данном примере работающий через интерфейс enp0s3. Если для target адреса в таблице маршрутизации отсутствует маршрут, то такой пакет отправляется через данный шлюз (маршрут по умолчанию)
  • 192.168.1.0/24 dev enp0s3 proto kernel scope link src 192.168.1.201 — статический маршрут для сети 192.168.1.0/24 через адрес 192.168.1.201, который прописан на интерфейсе
  • proto kernel – маршрут создан ядром ( proto static – маршрут добавлен администратором)
  • metric – приоритет маршрута (чем меньше значение metric, тем выше приоритет). При наличии двух маршрутов с одинаковой метрикой (не стоит так делать!), ядро начинает выбирать маршруты случайным образом.

Чтобы узнать через какой интерфейс (шлюз) должен маршрутизироваться трафик к определенному IP адресу используется команда:

Вы можете использовать ваш Linux сервер с двумя и более интерфейсами как маршрутизатор или интернет-шлюз. Чтобы разрешить маршрутизацию пакетов между несколькими интерфейсами, нужно включить параметр ядра net.ipv4.ip_forward = 1.

Как добавить или удалить статический маршрут?

Чтобы добавить новый маршрут к определенной IP подсети в таблицу маршрутизации Linux, нужно выполнить следующую команду:

Таким образом, мы добавим маршрут для IP сети 192.168.0.0/24 через шлюз 192.168.1.1.

Формат команды ip route очень похоже на синтаксис в Cisco IOS. Здесь также можно исопльзовать сокращений, например вместо ip route add можно написать ip pro ad .

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

Также можно добавить отдельный маршрут для одного IP адреса (хоста):

Можно сделать аналог null route маршрута в Cisco (ip route null0), пакеты в такую сеть удаляются по причине No route to host:

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

Чтобы удалить созданный вручную маршрут, выполните:

удалить маршрут из таблицы маршрутизации в linux centos

Как видите, маршрут удален из таблицы маршрутизации.

Чтобы добавить постоянный маршрут, нужно создать файл для этого маршрута, либо добавить правило в файл rc.local (выполняется при загрузке сервера).

Чтобы добавить постоянный (статический) маршрут, нужно знать имя сетевого интерфейса, который будет использоваться для маршрутизации. Узнать имя сетевого интерфейса можно командой:

В моем случае, интерфейс enp0s3.

сетевые интерфейсы в centos

Далее открываем следующий файл:

И добавляем туда строку с маршрутом:

После добавления маршрута в файл нужно перезапустить сервис network:

добавить постоянный (persistent) маршрут в centos linux

После перещаауска сетевого сервиса, в таблице маршрутизации появился статический маршрут.

Также можно добавить команду добавления нового маршрута в файл rc.local, чтобы он автоматически добавлялся при загрузке сервера. Откройте файл:

И укажите команду добавления маршрута:

добавление persistent маршрута через rc.local

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

Изменить маршрут в Linux

Чтобы изменить уже существующий маршрут, можно использовать команду ip route replace:

изменитть маршрут ip route replace

Чтобы сбросить все временные маршруты в таблице маршрутизации, просто перезапустите сетевой сервис:

Читайте также: