[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: wpasupplicant & несколько сетей



On Wed, Jul 25, 2012 at 11:54:37PM +0400, Mikhail A Antonov wrote:
> Страсти какие-то.
> 
> Вот intefaces:
> auto wlan0
> iface wlan0 inet dhcp
              ^^^^^^^^^
>         wpa-driver nl80211,wext
>         wpa-conf /etc/wpa_supplicant.conf

В такой ^^^ конфигурации (она описана в доках как "Managed Mode", и
предназначена для работы с одной сеткой) dhclient автоматически
отрабатывает только при первичном поднятии интерфейса. Соответственно,
при переходе в новую сетку IP интерфейса не поменяется и потребуется
ручное передёргивание ifdown && ifup.

В Managed Mode постоянно висит в памяти и запущен *лишь один* процесс
wpa_supplicant:
% ps aux | egrep '/sbin/wpa_(s|c)'                   
root      2541  0.0  0.0  39620  1624 ?        Ss   12:42   0:00
/sbin/wpa_supplicant -s -B -P /var/run/wpa_supplicant.wlan0.pid -i wlan0 -D nl80211 -c /etc/wpa_supplicant/wpa_supplicant.conf

Более правильная конфигурация, удобная при частых переездах между разными
сетями, подробно описана в /usr/share/doc/wpa_supplicant/README.Debian.gz
в секции "3. Mode #2: Roaming Mode" (т.е., режим роуминга).

В режиме роуминга wpa_supplicant работает в связке с wpa_cli. В этом
режиме одновременно запущены *два* процесса:

% ps aux | egrep '/sbin/wpa_(s|c)'
root      1977  0.0  0.0  39620  1376 ?        Ss   12:21   0:00 /sbin/wpa_supplicant -s -B -P /var/run/wpa_supplicant.wlan0.pid -i wlan0 -W -D nl80211 -c /etc/wpa_supplicant/wpa_supplicant.conf
root      2054  0.0  0.0   4128   280 ?        Ss   12:21   0:00 /sbin/wpa_cli -B -P /var/run/wpa_action.wlan0.pid -i wlan0 -p /var/run/wpa_supplicant -a /sbin/wpa_action

Процесс wpa_cli следит за сообщениями от wpa_supplicant и сам инициирует
"передёргивание затвора", когда надо, т.е., вызывает ifdown && ifup.
Делается это через посредство скрипта /sbin/wpa_action.

Причём, для того, чтобы иметь возможность задавать разные настройки для
разных сетей (статика vs. DHCP, маршруты, и т.п.) wpa_action использует
продвинутую фичу ifupdown, которая по-английски называется "interface
name mapping". Фича эта позволяет определить в /etc/network/interfaces
*несколько* вариантов настроек для *одного* физического интерфейса.
Описана эта фича в man interfaces.

В /etc/network/interfaces нужно для этого прописать (ниже привожу кусок
своего конфига) *один* блок, описывающий физический интерфейс, и
*несколько* логических блоков, задающих нужные настройки для разных
сеток. При этом физический интерфейс конфигурируется как "inet manual",
а логические - так, как того требует конкретная сетка ("inet dhcp" или
"inet static" со своими up/down командами, если надо, и т.п.).

Имена логических интерфейсов ("zon", "wnt" в моем примере ниже) должны
совпадать с id_str в параметрах соответствующей сетки в
wpa_supplicant.conf. Если id_str не указан, то используются
настройки из блока с именем "default" (iface default). В простейшем
случае достаточно иметь один блок настроек физического интерфейса
(iface wlan0 inet manual) и один блок default (iface default inet dhcp). 

------------------ 8< -----------------

allow-hotplug wlan0

# The roaming wireless interface
iface wlan0 inet manual
	wpa-driver nl80211
	wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf

# wireless static
iface zon inet static
	address 192.168.0.133
	netmask 255.255.255.0
	gateway 192.168.0.1
	metric 10
	dns-nameservers 8.8.8.8 8.8.4.4

# wireless static
iface wnt inet static
	address 192.168.1.171
	netmask 255.255.255.0
	gateway 192.168.1.1
	metric 10
	dns-nameservers 8.8.8.8 8.8.4.4

# 'default' is used for wireless networks without an id_str
iface default inet dhcp
	metric 10
	dns-nameservers 8.8.8.8 8.8.4.4

----------------- >8 -----------------

Для ясности, привожу выдержку из wpa_supplicant.conf

----------------- 8< -----------------

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=0

network={
	ssid="WNT"
	....
	id_str="wnt"
}

network={
	ssid="ZON"
	....
	id_str="zon"
}

network={
	ssid=""
	key_mgmt=NONE
	....
	# no 'id_str' parameter is given, block 'default'
        # from /etc/network/interfaces is used
}

----------------- >8 -----------------

Надеюсь, что этим письмом разжевал тему достаточно подробно.

-- 
Stanislav


Reply to: