Я хочу настроить my /etc/network/interfaces
для обнаружения различных точек доступа и подключения к ним соответствующим образом. Вот текущее состояние этого файла:
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug eth0
iface eth0 inet dhcp
auto ra0
iface ra0 inet dhcp
wpa-ssid MyNet
wpa-psk 00d8f778e1e86be0961aa767564d7364ee44fcbd704e4e31ee6c4af0f855c32f
Это успешно обнаруживает соединение Ethernet и подключается к MyNet, когда оно доступно. Как мне настроить его, чтобы он мог обнаруживать несколько точек доступа?
ЗдесьКажется, это ответ, но я не смог понять инструкции.
Я пробовал несколько GUI (nm, wicd и т. д.), но ни один из них не работает на моем ноутбуке. В любом случае, я предпочитаю делать это через командную строку.
решение1
Чтобы работать с несколькими конфигурациями/SSID Wi-Fi, лучше работать на wpa_supplicant
уровне.
Просто оставьте свой интерфейс следующим образом:
auto ra0
iface ra0 inet dhcp
Установите wpa_supplicant с помощью:
apt get install wpasupplicant
Вы можете определить несколько мест в wpa_supplicant.conf
, где SSID определяет, какая конфигурация будет использоваться. Например:
network={
ssid="ssid2"
psk="ssid2 PASSWORD"
}
network={
ssid="ssid1"
psk="ssid1 PASSWORD"
}
Перезапускайте службу каждый раз при добавлении конфигурации для нового SSID.
При подключении к точке доступа, в зависимости от имени SSID, wpa_supplicant
автоматически выбирается соответствующая конфигурация.
решение2
Для настройки /etc/network/interfaces
работы с несколькими местоположениями необходимо понимать разницу между логическими и физическими интерфейсами. Физические интерфейсы соответствуют аппаратным устройствам, которые вы установили в своей системе, и они идентифицируются определенной схемой именования (wlan0, wlan1, eth0, ra0 и т. д.).
В вашем /etc/network/interfaces
, вы можете указать только одну конфигурацию для каждого физического интерфейса, поэтому здесь в игру вступают логические интерфейсы. Вы можете иметь несколько логических интерфейсов для одного физического интерфейса. Это называется сопоставлением. Чтобы сопоставить логический интерфейс с физическим интерфейсом, вы добавляете это в/etc/network/interfaces
mapping ra0 # map physical interface ra0...
map home work # ...to 'home' and 'work' logical interfaces
Затем вы пишете конфигурацию для каждого из этих интерфейсов:
iface home inet dhcp # configuration stanza for 'home' logical interface
wpa-ssid Home
wpa-psk 00d8f778e1e86be0961aa767564d7364ee44fcbd704e4e31ee6c4af0f855c32f
iface work inet dhcp # configuration stanza for 'work' logical interface
wpa-ssid Work
wpa-psk 00d8f778e1e86be0961aa767564d7364ee44fcbd704e4e31ee6c4af0f855c32f
Конечно, это не сработает, поскольку система не знает, какой интерфейс использовать, поэтому мы воспользуемся , guessnet
чтобы помочь системе выбрать конфигурацию.
sudo apt-get install guessnet
Затем мы используем guessnet
в строфе сопоставления:
mapping ra0
script /usr/sbin/guessnet-ifupdown # <-- We added this
map home work
Guessnet
действует, проверяя сети по некоторым критериям (IP, ESSID, MAC-адреса) и выбирая конфигурацию, которая не проваливает эти тесты. В следующем примере, если доступна сеть с ESSID 'Work', интерфейс, ra0
который мы определили ранее, подключится к ней и применит эту конфигурацию:
iface work inet dhcp
test wireless essid Work # We test if the ESSID of the network is 'Work'
wpa-ssid Work
wpa-psk 00d8f778e1e86be0961aa767564d7364ee44fcbd704e4e31ee6c4af0f855c32f
решение3
В нашем случае мы хотели выделить разные wlan для определенных устройств. Для этого мы создали шаблон systemd:
# cat /usr/lib/systemd/system/wpa_supplicant\@.service
[Unit]
Description=WPA supplicant for %i
Before=network.target
After=dbus.service
Wants=network.target
IgnoreOnIsolate=true
[Service]
ExecStart=/sbin/wpa_supplicant -s -O /run/wpa_supplicant-%i -c/etc/wpa_supplicant/wpa_supplicant-%i.conf -i%i
[Install]
WantedBy=multi-user.target
Затем создал такие конфигурации:
==> /etc/wpa_supplicant/wpa_supplicant-wlan0.conf <==
network={
ssid="net0"
psk="secretpass0"
}
==> /etc/wpa_supplicant/wpa_supplicant-wlan1.conf <==
network={
ssid="net1"
psk="secretpass1"
}
и начал их следующим образом:
systemctl enable --now wpa_supplicant@wlan0
systemctl enable --now wpa_supplicant@wlan1
Предостережение:
Странно, но он, похоже, проигнорировал мою службу и запустил ее под dhcpcd
:
# ps ax|grep wpa
653 ? Ss 0:00 wpa_supplicant -B -c/etc/wpa_supplicant/wpa_supplicant-wlan1.conf -iwlan1
668 ? Ss 0:00 wpa_supplicant -B -c/etc/wpa_supplicant/wpa_supplicant-wlan0.conf -iwlan0
# systemctl status 668
● dhcpcd.service - DHCP Client Daemon
Loaded: loaded (/lib/systemd/system/dhcpcd.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/dhcpcd.service.d
└─wait.conf
Active: active (running) since Sat 2023-07-08 21:16:25 BST; 1min 23s ago
Docs: man:dhcpcd(8)
Process: 545 ExecStart=/usr/sbin/dhcpcd -w -q (code=exited, status=0/SUCCESS)
Tasks: 3 (limit: 1993)
Memory: 4.3M
CPU: 775ms
CGroup: /system.slice/dhcpcd.service
├─653 wpa_supplicant -B -c/etc/wpa_supplicant/wpa_supplicant-wlan1.conf -iwlan1
├─668 wpa_supplicant -B -c/etc/wpa_supplicant/wpa_supplicant-wlan0.conf -iwlan0
└─701 /usr/sbin/dhcpcd -w -q
Возможно, сетевой стек Debian или dhclient
поддерживает wpa_supplicant-<device>.conf
файлы напрямую и делает это автоматически (обратите внимание, что мои файлы /etc/network/interfaces* пусты). Если это так, то все, что вам нужно, это разные конфигурации для разных устройств... но в любом случае, это работает для нас. Пожалуйста, прокомментируйте, если выясните, почему это так.