Свой /etc/hosts для каждой wi-fi сети (через NetworkManager)

Условия задачи: имеется ноутбук, тягаемый туда-сюда, как и полагается ноутбуку. Есть пара основных мест, где он бывает: дом и работа. И там и сям он подключается к локальной сети через wi-fi. И там и сям имеются некие сервера, которые из оружающего мира видны через внешний IP, а из локальной сети только через локальный IP (порты форвардятся на роутере) по некой причине, которую я сам не до конца догоняю, но поделать с этим ничего нельзя. Если вы находясь в той же сети, что и сервер, попробуете зайти на него, используя его доменное имя, а не прямой локальный IP, то вас ждёт облом, ибо DNS выдаст вам внешний IP. Решение есть такое: прописать всем компам в локальной сети в файле hosts локальный айпишник для заданных доменных имён. Для стационарных компов это сделано и забыто, но как быть с упомянутым выше ноутом?

Решение: под Виндой я написал скрипт, которым вручную переключал hosts на нужную сеть (скрипт просто копировал заранее подготовленный файл). Но вот недавно я после полугодового перерыва, вновь окунулся в чудесный мир Линукс (об этом отдельно) и подумал, что переключать руками как-то западло.

Тут можно выделить две задачи, которые нужно решить:

  1. Вызвать скрипт в момент подключения к сети.
  2. Определить имя (SSID) сети.

Остальное — дело техники. Самый простой вариант просто скопировать соответствующий данной сети файл hosts. У меня эти файлы хранятся по следующему пути: /etс/hosts.ssid_сети. Конфиг на случай, если мы находимся в некоторой сети, для которой нет специального конфига, называется /etc/hosts.other.

Сеть у меня работает через NetworkManager. Первая задача решается не просто, а очень просто: директория /etc/NetworkManager/dispatcher.d содержит скрипты, которые будут последовательно выполнены при установке или разрыве соединения. Скрипт при вызове получает два параметра:

  1. Имя сетевого интерфейса (в моём случае — wlan0).
  2. Установлено (up) или прервано (down) соединение.

Для решения второй задачи используем nm-tool, утилиту из стандартной поставки NetworkManager'а. Она умеет писать в стандартный вывод текущее состояние сети: что, куда и как подключено. Среди прочего говорит и SSID текущей сети. несложными манипуляциями с текстом, мы извлекаем и эту информацию.

Скрипт в общем выглядит вот так (делюсь):

#!/bin/sh
 
export LC_ALL=C
 
if [ $2 == "up" ]; then
  # the network is up
  if [ $1 == "wlan0" ]; then
    WLAN_NAME=$(nm-tool | awk '/\*([^\:])+\:/ { print substr($1,2,length($1)-2) }')
    HOSTS_FILE_NAME="/etc/hosts."${WLAN_NAME}
 
    if [ -f $HOSTS_FILE_NAME ]; then
      cp $HOSTS_FILE_NAME /etc/hosts
    else
      cp /etc/hosts.other /etc/hosts
    fi
  else
    cp /etc/hosts.other /etc/hosts
  fi
fi
Опубликовать в Google Plus
Опубликовать в LiveJournal

Комментарии

  1. avatar
    Таньга

    почти прочла, однако ничего все равно не понятно(

  2. avatar
    Анонимус

    а не кошернее поднять днс-зону?????????????? и не ипать моск??

    • Честно говоря, не знаю с какой стороны к этому подойти. Где «поднять», при условии что интернет раздаёт DSL-роутер? На самом роутере? Прошивка, вроде, ничего такого не умеет. На сервере? Хотелось бы, чтобы интернет не пропадал и при выключенном сервере (это ж у меня дома). Или вы так, чисто попиздеть? :)

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

Ваш e-mail не будет опубликован.

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">