Linux

Исправить: Отсутствие маршрута к хосту на Ubuntu с несколькими сетями

Когда у вас сложная сетевая настройка, очень неприятно, когда возникает ошибка “Нет маршрута к хосту” начнет появляться после поднятия нового интерфейса. Это часто происходит из-за того, что маршрут по умолчанию либо изменен, либо отменен.

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

ip route show

нет маршрута к хосту-1

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

Чтобы машина могла выходить в Интернет, у нее должен быть маршрут по умолчанию, который можно добавить с помощью следующей команды

sudo ip route add default via 136.63.176.1

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

Первый скрипт получит ваш текущий ip. У меня $INTF установлен как STDIN, вы можете изменить его на ваш конкретный интерфейс, если вы не хотите вводить имя интерфейса.

Используя ваш любимый текстовый редактор, я люблю vim и имею папку с исходниками в моей домашней директории

mkdir ~/src && cd ~/src

vim getip.sh

#!/bin/bash

#fetch ip-адрес установлен для данного устройства

INTF=${1}

PTH=(~/src/)

объявить TMP_IP2

TMP_IP2=$(ip a | grep ${INTF} | grep inet | cut -d” ” -f6 | cut -d “/” -f1 > ${PTH}current_${INTF}.ip)

ip a | grep ${INTF} | grep inet | cut -d” ” -f6 | cut -d “/” -f1 | cut -d”.” -f1-3 | awk ‘{print $0″.0/24″}’ > ${PTH}net_${INTF}.ip

ip a | grep ${INTF} | grep inet | cut -d” ” -f6 | cut -d “/” -f1 | cut -d”.” -f1-3 | awk ‘{print $0″.1″}’ > ${PTH}gw_${INTF}.ip

объявить TMP_IP

TMP_IP=$(cat ${PTH}current_${INTF}.ip)

echo “current wan ip $TMP_IP”

Сохраните и выйдите из программы, сделайте ее исполняемой, а затем протестируйте ее.

sudo chmod a+x getip.sh

bash getip.sh eth0.2

нет маршрута к хосту-2

Предполагая, что все работает правильно, скопируйте его в /usr/local/bin/, чтобы он стал глобально исполняемым.

sudo cp getip.sh /usr/local/bin/getip

Теперь я могу просто набрать getip eth0.2 и будет получен ip.

Второй скрипт назначит маршрут по умолчанию, а также запустит первый скрипт.

vim setip.sh

#!/bin/bash

getip ${1}

#получение набора ip-адресов для заданного устройства

PTH=(~/src/)

объявить RT_IP

RT_IP=$(cat ${PTH}gw_${1}.ip)

ip route change default via $RT_IP

ip route add default via $RT_IP

echo “ip route — default via $RT_IP”

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

sudo chmod a+x setip.sh

sudo setip.sh eth0.2

нет маршрута к хосту-3

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

sudo ip route show

Вы можете скопировать скрипты в /usr/local/bin/, если хотите, чтобы они были глобально исполняемыми. Он по-прежнему требует sudo, поскольку вы изменяете интерфейс.

sudo cp setip.sh /usr/local/bin/setip

Добавить комментарий