Как установить статические маршруты в Ubuntu Server?


51

Я использовал Ubuntu начиная с Ubuntu 8.10; сегодня я работаю с Ubuntu 12.04 Server.

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

/sbin/route add -net <IP>/<MASK> <GW> dev <ethX>

в /etc/rc.localили я хотел бы создать файл ( с именем routes) внутри директории /etc/network/if-up/, но я заметил , что на Ubuntu 12.04 это не работает.

Если я набираю команды в оболочке, они работают, но те же команды не работают, когда они находятся в указанном файле.

Я уже пытался изменить имя файла на другое имя, думая, что мое имя файла ( routes) может быть ошибочным в Ubuntu 12.04, но это также не сработало.

Я также замечаю, что команда /sbin/ifconfigработает, за исключением /sbin/route.

Что изменилось в настройке сети?

Как я могу определить статические маршруты в Ubuntu 12.04?


Просто чтобы проверить: исполняемый файл rc.local начинается с строки shebang? Может быть, это проблема с вашей командой. Вы можете попробовать перенаправить stderr в файл ( your_command > stderr.txt 2>&1) и проверить его вывод ...
Salem

Вы должны установить маршруты в / etc / network / interfaces, а не в /etc/rc.local. И новые команды, которые вы должны использовать, это ip addи ip route. Одна команда для управления сетью. :)
Андерс

man 5 interfaces
Обязательно

Ответы:


64

Вы можете поместить статические маршруты в /etc/network/interfaces:

auto eth0
iface eth0 inet static
      address 192.168.1.2
      netmask 255.255.255.0
      up route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.1.1
      up route add -net 172.16.0.0 netmask 255.240.0.0 gw 192.168.1.1

13
Синтаксис для / sbin / ip:up ip route add 192.168.0.0/24 via 192.168.1.1
w00t

1
Не могли бы вы объяснить свои последние две строки в ответе или дать ссылку на источник знаний? Спасибо!
itols

Вы можете просмотреть -net 192.68.0.0 как подстановочный знак, говоря, что все пакеты, предназначенные для 192.168. *. *, Должны маршрутизироваться через шлюз по умолчанию 192.168.1.1. Затем ядро ​​попытается разрешить этот шлюз по умолчанию, но если у него уже есть запись ARP, то оно отправит пакет на интерфейс, который, как он узнал, находится на шлюзе с конечным MAC для следующего перехода. Надеюсь, это немного поможет.
Нил МакГилл,

Существует также /etc/network/interfaces.d/, который может быть лучшим местом для определения маршрута.
Элайджа Линн

Это работает, но это не описано на страницах руководства для сетевых интерфейсов. Это стандарт?
BЈовић

18

Я часто обнаруживал, что правильное место для определения статического маршрута находится в / etc / network / interfaces, и это нормально, если вы собираетесь глобально перезапустить сеть, например, с помощью /etc/init.d/networking restart. Но если вы собираетесь использовать ifdown и ifup для индивидуального выключения интерфейса, ifup завершится с ошибкой:

ifup eth1

RTNETLINK answers: File exists
Failed to bring up eth1.

Из-за этого пытается определить маршрут, но он уже определен. Интерфейс все равно будет включен, но ifup не будет обновлять / запускать / network / ifstate, поэтому в следующий раз, когда вы будете использовать нас, вы не сможете это сделать, если не используете флаг --force.

Чтобы заставить ifup продолжать настройку, даже если маршруты уже определены, вы можете использовать этот формат при определении маршрутов в / etc / network / interfaces

up ip route add 172.16.0.0/24 via 192.168.10.1 || true
up ip route add 192.168.0.0/16 via 192.168.10.1 || true

Таким образом, вы получите предупреждение на выходе, но настройка интерфейса будет завершена

ifup eth1

RTNETLINK answers: File exists
RTNETLINK answers: File exists
ssh stop/waiting
ssh start/running, process 18553

1
Почему бы просто не добавить «down ip route del 192.168.0.0/16 через 192.168.10.1» в конфигурацию?
w00t

Поскольку люди делают что-то вроде использования ifconfigвручную, а не запускают ifdown, то хотят иметь возможность восстановления с использованием правильных инструментов. Таким образом, полезно, если эти инструменты устойчивы к неожиданному состоянию, когда они пытаются исправить состояние. || trueПредложение является хорошим один. Добавление строки вниз тоже полезно.
Фил П

5
От случайного пользователя: используйте «заменить» вместо «добавить» в команде ip. Пример: up ip route replace 172.16.0.0/24 via 192.168.10.1«замена» добавит маршрут, если он еще не существует, но если маршрут с таким же селектором существует, он будет заменен текущим, даже если у них один и тот же пункт назначения.
Xen2050

9

Вы можете попробовать это (добавить его /etc/network/interfaces), это почти полный способ настройки маршрутов:

auto eth0
iface eth0 inet static
    post-up /sbin/route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.1.1
    post-up /bin/mount -t nfs 192.168.0.203:/motd/ /motd/

6

Существует пакет ifupdown-extra, доступный в Ubuntu.
Он предоставляет автоматические сценарии (установлены в /etc/network/*/), один из которых используется для добавления статических маршрутов.

Файл конфигурации для этого /etc/network/routes

В верхней части этого конфигурационного файла есть хорошее описание:

Этот файл конфигурации считывается сценарием статического маршрута if-updown и сценарием /etc/init.d/networking-routes для настройки списка маршрутов, связанных либо с данным интерфейсом, либо с глобальными маршрутами.

Пример маршрута, который я использую:

192.168.240.0 255.255.255.0 192.168.130.3 em3

1

что сработало для нас

sudo route add -net 192.168.0.2/32 gw 192.168.1.1 netmask 255.255.0.0

Я использовал для запуска на Mac:

sudo route -n add -net 192.168.0.2/32 192.168.1.1

но в Ubuntu отсутствует "gw" между IP-адресами и последней частью "сетевой маски" (также -n не требуется в Ubuntu)


10
это отлично работает для временных (непостоянных) маршрутов, вопрос в том, чтобы сделать маршруты постоянными
anneb

1

Я предпочитаю использовать nmcli.

nmcli device modify <device-name> ipv4.routes "<ip>/<mask> <gw>" ipv4.route-metric 25

Например:

nmcli device modify wlp2s0 ipv4.routes "1.1.1.0/24 192.168.0.1" ipv4.route-metric 25

После этого примените изменения, перезапустив службу NetworkManager:

sudo systemctl restart NetworkManager.service

1

Используя nmcliя смог запустить постоянное решение (решение @isapir не работало на моем устройстве).

sudo nmcli connection modify <conection-name> +ipv4.routes "<ip>/<mask> <gw> <mt>"

Например:

sudo nmcli connection modify ssid-name +ipv4.routes "1.1.1.0/24 192.168.0.1 100"

После этого применить изменения можно, установив соединение снова и снова (нет необходимости в полном перезапуске NetworkManager):

sudo nmcli con down ssid-name ; sudo nmcli con up ssid-name

Для просмотра текущих подключений выполните:

sudo nmcli connection
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.