Когда у вас сложная сетевая настройка, очень неприятно, когда возникает ошибка “Нет маршрута к хосту” начнет появляться после поднятия нового интерфейса. Это часто происходит из-за того, что маршрут по умолчанию либо изменен, либо отменен.
Чтобы проверить маршрут по умолчанию, введите
ip route show
Как показано выше, у меня есть три физических интерфейса, один направлен наружу, а два — во внутренние сети. Маршрут по умолчанию пропал из сети при сбросе соединения, в результате чего остальная часть моей сети работает нормально, и только эта машина не знает, где выйти в Интернет.
Чтобы машина могла выходить в Интернет, у нее должен быть маршрут по умолчанию, который можно добавить с помощью следующей команды
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
Предполагая, что все работает правильно, скопируйте его в /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
Вы можете еще раз проверить таблицу маршрутизации, чтобы убедиться, что все в порядке.
sudo ip route show
Вы можете скопировать скрипты в /usr/local/bin/, если хотите, чтобы они были глобально исполняемыми. Он по-прежнему требует sudo, поскольку вы изменяете интерфейс.
sudo cp setip.sh /usr/local/bin/setip