пятница, 7 ноября 2008 г.

Два сетевых интерфейса.

Давно у меня не доходили руки сделать у жены на ноуте одну простую фичу. А именно:

Имеем два интерфейса, один кабельный, второй Wi-Fi соответственно. Надо что бы при подключении кабеля работала "земля", а при отрубании - "воздух". Сначала попробовал сделать все это через bonding (объединение двух и более интерфейсов в один логический, что-то типа сановского IPMP). Но возникла проблема: wpa_supplicant не может корректно подрубится к точке доступа, если используется bond0 интерфейс. :( Хотя в инете народ после не продолжительных плясок с бубном это поднимал, но у меня не вышло. Решил пойти другим путем. ;) И так мое решение:

  1. Ставим ifplugd и конфигурим его мониторить eth0.
  2. В /etc/network/interfaces (это для убунты/дебиан, на других системах будет по другому, но в общем принип один и тот же) прописываем что-то типа:

    iface eth0 inet static
    address X.X.X.10
    netmask 255.255.255.0
    gateway X.X.X.1

    auto wlan0
    iface eth0 inet static
    address X.X.X.10
    netmask 255.255.255.0
    gateway X.X.X.1
    wpa-conf /etc/wpa_supplicant/my.conf


  3. В папку /etc/ifplugd/action.d добавляем файл (я его назвал 00-start-stop, но в принципе это не важно, так как из этой папки при поднятии/опускании интерфейса, который мы мониторим выполняются все скрипты) содержащий следующий набор комманд:


  4. #!/bin/sh
    set -e

    case "$2" in
    up)
    /sbin/ifdown --force wlan0
    ;;
    down)
    /sbin/ifup wlan0
    ;;
    esac


    Понятное дело, что это тоже довольно грубо: по хоршему надо бы проверить какие и как работают у нас интерфейсы, какие из них wifi или прочесть это из конфиг файла, но мне было лень заморачиваться. ;)
Собственно все, можно только немного уменьшить таймаут интерфейса с 10 (по умолчанию) секунд, до 5. При переключении с "воздуха" на землю пинг терял 4-5 пакетов, при обратном - около 20-30 (ну это и понятно, надо же стартануть wpa_supplicant, да подключится к точке), что в общем-то для домашнего компа, я считаю, очень не плохо. ;)