為多個位置配置無線介面

為多個位置配置無線介面

我想配置我的/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

這將成功檢測到乙太網路連接並在可用時連接到 MyNet。如何配置它才能偵測多個接入點?

這裡似乎是答案,但我無法理解說明。

我嘗試了多種 GUI(nm、wicd 等),但它們似乎都無法在我的筆記型電腦上運行。無論如何,我更喜歡透過命令列來完成它。

答案1

要解決多個 wifi 配置/ssid,您最好在該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 的配置時,請重新啟動服務。

連接AP時,根據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

在我們的例子中,我們希望將不同的無線區域網路專用於特定的裝置。為此,我們建立了一個 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* 檔案是空的)。如果是這種情況,那麼您所需要的只是針對不同設備的不同配置......但無論如何,這對我們有用。如果您知道為什麼會這樣,請發表評論。

相關內容