Wicharek.name
домашние страницы о всяком
Входи:

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


12 Июн 2009 23:28

Условия задачи: имеется ноутбук, тягаемый туда-сюда, как и полагается ноутбуку. Есть пара основных мест, где он бывает: дом и работа. И там и сям он подключается к локальной сети через 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
  • Таньга
    Таньга
    14 Июн 2009 14:39

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

    (ответить)

  • Анонимус
    Анонимус
    12 Сен 2009 23:20

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

    (ответить)

    wicharek
    13 Сен 2009 22:39

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

    (ответить)