为多个位置配置无线接口

为多个位置配置无线接口

我想配置我的/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* 文件是空的)。如果是这种情况,那么您所需要的只是针对不同设备的不同配置......但无论如何,这对我们有用。如果您知道为什么会这样,请发表评论。

相关内容