Настройка статических маршрутов ubuntu

Обновлено: 08.07.2024

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

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

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

В случае отсутствия маршрута для узла, применяется так называемый default шлюз, default маршрут. Подобное можно наблюдать на маршрутизаторе. Он сравнивает необходимый IP-address с таблицей маршрутизации, затем посылает дальше.

Ниже будем рассматривать проверку проходящих маршрутов в системе, процесс настройки новых.

Способы просмотра таблицы маршрутизации в Линукс

Для просмотра таблицы в ОС Линукс можно использовать команду:

netstat

Как видно из скриншота выше, команда показала всего две записи. В первой записи указан шлюз (gateway) 192.168.168.254, вторая запись говорит о наличии доступа в подсеть 192.168.168.0 на интерфейсе eth0.

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

route

Бывает, выводимых данных route и netstat недостаточно, так как в них выводится легкая информация, ее не хватает для понимания всей картины. Чтобы получить более подробную таблицу, можно воспользоваться утилитой "routel".

routel

В этой информации содержится:

  • target (цель) - IP-адрес.
  • gateway - адрес шлюза.
  • source - адрес отправителя.
  • dev - интерфейс.

Наиболее подходящий метод для просмотра таблицы маршрутизации в ОС Линукс – использовать утилиту "ip".

ip route

  • default – IP-адрес по умолчанию.
  • via 192.168.168.254 - адрес шлюза, куда будут отправлять пакеты по умолчанию.
  • dev eth0 - интерфейс сети, за счёт него открывается доступ к шлюзу.
  • proto kernel - обозначает, что маршрут устанавливался ядром, если static, то установка выполняется администратором.

Настройка

Для настройки таблицы маршрутизации будем использовать команду ip route. Добавим временный статический маршрут 192.168.22.0/24 через шлюз 192.168.168.254.

ip route add 192.168.22.0/24 via 192.168.168.254

ВАЖНО! При выполнении такой команды добавиться временный статический маршрут, после перезагрузки системы он сотрется.

Для проверки необходимо проверить, проходит ли пакет из сети 192.168.22.0. Для этого будем использовать ip route get.
ip route get 192.168.22.30

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

post-up route add -net 192.168.22.0 netmask 255.255.255.0 gw 192.168.168.254
pre-down route del -net 192.168.22.0 netmask 255.255.255.0 gw 192.168.168.254

  1. post-up - запустить команду после включения интерфейса.
  2. pre-down - запустить команду перед отключением интерфейса.
  3. net - задает целевую сеть
  4. netmask - сетевая маска.
  5. gw - шлюз.

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

Рассмотрим еще несколько примеров.

Изменяем статический маршрут:

ip route change 192.168.22.0/24 via 192.168.168.254

ip route del 192.168.22.0/24

ЗАКЛЮЧЕНИЕ

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

Каждому из маршрутизаторов нужно знать на какой компьютер передавать пакет дальше. Именно это мы и обсудим в этой статье. Сегодня нас будет интересовать маршрутизация в 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, а также зачем это нужно. Надеюсь, эта информация была полезной для вас.

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


  1. Машины сегментов должны быть подключены к выделенным сетям.
  2. Надо настроить на интерфейсах IP-адреса.
  3. Из сегмента 1 требуется маршрут в сеть b.b.b.b через GW (a.a.a.254).
  4. Из сегмента 2 требуется маршрут в сеть a.a.a.a через GW (b.b.b.254).

Пример для Windows

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

  • route — программа работы с маршрутами;
  • ADD – команда для добавления маршрута;
  • -p – этот ключ нужен, чтобы сохранить маршрут;
  • MASK – маски сети;
  • METRIC 1 – параметр, определяющий приоритет указанного выше шлюза, 1 — наивысший приоритет.

Проверить прописанные маршруты можно командой route print .

Пример для Ubuntu/Debian

Чтобы прописать маршруты в ОС Ubuntu, проверьте существующие маршруты командой route или netstat -nr :

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

Добавьте статический маршрут в подсеть 192.168.2.0 с 24 маской (255.255.255.0), в роли шлюза укажите, например, 192.168.0.100. Команда будет выглядеть следующим образом:

Проверьте существующие маршруты:

Начиная с версии Ubuntu 17.10 Netplan используется по умолчанию как утилита для конфигурирования сетевых настроек.

В предыдущих версиях Ubuntu использовалась утилита ifconfig и конфигурационный файл /etc/network/interfaces .

В нашем случае все образы OS Linux используют систему Cloud-init для инициализации системы при первом запуске. В ОС Ubuntu утилита Netplan установлена, но не используется.

Обратите внимание! Если произойдет перезагрузка сервера, то маршрут пропадет, как и с семейством RHEL.

Сохранение маршрута при перезагрузке сервера

Чтобы при перезагрузке сервера маршрут не пропал, нужно для соответствующего сетевого интерфейса, в нашем случае это eth0 , пропишите нужный маршрут в файле конфигурации /etc/network/interfaces.d/50-cloud-init.cfg :

Отключите возможность настройки сети через Cloud-init и создайте файл:

Добавьте в созданный файл необходимые параметры конфигурации Cloud-init, отключающие конфигурирование сети:

Добавьте в файл конфигурации маршрут up route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.0.100 :

Для Ubuntu 18 используйте команду:

Проверьте существующие маршруты:

Маршрут успешно прописался и не пропадет, если перезагрузить сервис.

Пример для CentOS/Fedora/RHEL

Проверьте существующие маршруты командой route или netstat -nr :

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

Добавьте статический маршрут в подсеть 192.168.2.0 с 24 маской (255.255.255.0), в роли шлюза укажите, например, 192.168.0.100. Команда будет выглядеть следующим образом:

Проверьте добавленные маршруты:

Маршрут успешно добавлен.

Обратите внимание! Если произойдет перезагрузка системы, то добавленный маршрут будет удален.

Сохранение маршрута при перезагрузке сервера

Чтобы при перезагрузке системы маршрут не был удален, в каталоге /etc/sysconfig/network-scripts создайте файл с именем route-eth0 (соответствует нужному интерфейсу eth0):

Отключите возможность настройки сети через Cloud-init и создайте файл:

Добавьте в созданный файл необходимые параметры конфигурации Cloud-init, отключающие конфигурирование сети:

Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.254.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
192.168.254.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1
0.0.0.0 192.168.254.1 0.0.0.0 UG 0 0 0 eth0
0.0.0.0 192.168.254.1 0.0.0.0 UG 0 0 0 eth1

Если таблица пуста, то вы увидите только заголовки столбцов. Тогда надо использовать route. С помощью команды route можно добавить или удалить один (за один раз) статический маршрут. Вот ее формат:

route -f операция -тип адресат шлюз интерфейс

Здесь аргумент операция может принимать одно из двух значений: add (маршрут добавляется) или delete (маршрут удаляется). Аргумент адресат может быть IP-адресом машины, IP-адресом сети или ключевым словом default . Аргумент шлюз -- это IP-адрес компьютера, на который следует пересылать пакет (этот компьютер должен иметь прямую связь с вашим компьютером). Команда

route -f

удаляет из таблицы данные обо всех шлюзах. Необязательный аргумент тип принимает значения net или host. В первом случае в поле адресата указывается адрес сети, а во втором -- адрес конкретного компьютера
(хоста).
Как правило, бывает необходимо настроить маршрутизацию по упоминавшимся выше трем интерфейсам:
* локальный интерфейс (lo),
* интерфейс для платы Ethetnet (eth0),
* интерфейс для последовательного порта (PPP или SLIP).

Локальный интерфейс поддерживает сеть с IP-номером 127.0.0.1. Поэтому для маршрутизации пакетов с адресом 127. используется команда:

route add -net 127.0.0.1 lo

Если у вас для связи с локальной сетью используется одна плата Ethernet, и все машины находятся в этой сети (сетевая маска 255.255.255.0), то для настройки маршрутизации достаточно вызвать:

route add -net 192.168.36.0 netmask 255.255.255.0 eth0

Если же вы имеете насколько интерфейсов, то вам надо определиться с сетевой маской и вызвать команду route для каждого интерфейса. Поскольку очень часто IP-пакеты с вашего компьютера могут отправляться не в одну единственную сеть, а в разные сети (например, при просмотре разных сайтов в Интернете), то в принципе надо было бы задать очень много маршрутов. Очевидно, что сделать это было бы очень сложно, точнее просто невозможно. Поэтому решение проблемы маршрутизации пакетов перекладывают на плечи специальных компьютеров - маршрутизаторов, а на обычных компьютерах задают маршрут по умолчанию, который используется для отправки всех пакетов, не указанных явно в таблице маршрутизации. С помощью маршрута по умолчанию вы говорите ядру "а все остальное отправляй туда". Маршрут по умолчанию настраивается следующей командой:

route add default gw 192.168.1.1 eth0

auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.17.8
hwaddress ether 00:E0:4C:A2:C4:48
netmask 255.255.255.0
broadcast 192.168.17.255
auto eth1
iface eth1 inet static
address 192.168.254.2
netmask 255.255.255.0
gateway 192.168.254.1
broadcast 192.168.254.255

Интерфейс eth0 это связь с локальной сетью состоящей из 20 подсетей 192.168.1.х-192.168.20.х

Интерфейс eth1 это связь с ADSL модемом с выходом в интернет. Так большинство запросов идут в Инет на этом интерфейсе прописываем шлюз (gateway 192.168.254.1) данный параметр указывает в системе шлюз по-умолчанию, обращаю внимание, что шлюз надо прописывать только на одном интерфейсе, иначе в системе появятся 2 маршрута по умолчанию и естно будет затупление в работе. С интернетом разобрались.
Но требуется еще просматривать ресурсы локальной сети для этого надо выполнить вот эти команды

route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.17.254 eth0
route add -net 192.168.12.0 netmask 255.255.255.0 gw 192.168.17.254 eth0
route add -net 192.168.21.0 netmask 255.255.255.0 gw 192.168.17.254 eth0

На этом примере маршрутизируются 3 подсети

Все эти команды и многие другие можно прописать в файлк
/etc/network/interfaces в итоге получится следующее:

auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.17.8
hwaddress ether 00:E0:4C:A2:C4:48
netmask 255.255.255.0
broadcast 192.168.17.255
up route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.17.254 eth0
up route add -net 192.168.12.0 netmask 255.255.255.0 gw 192.168.17.254 eth0
up route add -net 192.168.21.0 netmask 255.255.255.0 gw 192.168.17.254 eth0
auto eth1
iface eth1 inet static
address 192.168.254.2
netmask 255.255.255.0
gateway 192.168.254.1
broadcast 192.168.254.255

Ну вот и все по аналогии настраиваются любое кол-во маршрутов и сетевых интерфейсов

Дополнение 1.

hwaddress ether 00:E0:4C:A2:C4:48

так легко можно изменить MAC, не забываем после редактирования файла делать рестарт

sudo /etc/init.d/networking restart

Дополнение 2.

Следует отметить, что:
1) Для того, чтобы просмотреть таблицу маршрутов достаточно запуска команды route без параметров или route -n, если в сети нет DNS.
2) Маска может быть записана проще, в виде /x, где x - число единичных битов, например:

route add -net 192.168.36.0/24 eth0
вместо
route add -net 192.168.36.0 netmask 255.255.255.0 eth0

Настройки сети размещаются в файле /etc/network/interfaces. При подключение к Inet через VPN (ppp0. ), необходимо заменять маршрут по умолчанию на ppp0. А проще указать в файле /etc/ppp/options следующее:

тогда маршрут заменяется сам и при отключении восстанавливается.

Дополнение 3.

Есть прога, серверная часть которой стоит во внутренней сети, например Radmin Server, чтобы к нему подключиться клиентская прога (Radmin Viewer) запрашивает соединение по порту 4799 (например). Все работает внутри локальной сети. Есть шлюз (с внешним IP), через который обеспечивает доступ в и-нет всех компов внутренней сети. Теперь вопрос, как настроить шлюз, чтобы при обращении из вне клиентсокой частью к IP шлюза по порту 4799, он пробрасывал этот запрос дальше, например на 192.168.0.2 по томуже порту?

Для этого есть команда iptables:

iptables -t nat -D PREROUTING -i <интерфейс> -s <IP откуда будет коннект> -p tcp --dport 4899 -j DNAT --to-destination 192.168.0.2:4899


Если ограничивать входящие IP не требуется, то опцию -s можно опустить.
Пример:

iptables -t nat -D PREROUTING -i vlan1 -s 213.87.34.20/24 -p tcp --dport 4899 -j DNAT --to-destination 192.168.128.24:4899

iptables -t nat -A PREROUTING -i eth0 -p udp --dport 3658 -j DNAT --to-destination 192.168.0.2:3658

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