OpenVPN 导致 Linux 中的 WLAN/WiFi 断开连接?

OpenVPN 导致 Linux 中的 WLAN/WiFi 断开连接?

如果我在启动时配置我的无线网络(wpa_supplicant 和 dhclient),那么连接就很好,直到我启动 OpenVPN。

此时无线接口断开连接(直到隧道建立),我必须通过重新启动网络或执行 ifdown/ifup 手动将其恢复。这确实有效,但真的很麻烦。

dmesg 报告:

ADDRCONF(NETDEV_CHANGE) wlan0: link becomes ready
wlan0: disassociating from 00:00:00:00:00:00 by local choice (reason=3)
cfg80211: Calling CRDA to update world regulatory domain
ADDRCONF(NETDEV_CHANGE) wlan0: link is not ready

除了一旦 WiFi 断线就无法连接服务器之外,OpenVPN 不会抛出任何错误消息。

我尝试过创建不使用 OpenVPN 的 tun/tap 设备,这完全没问题,可以为它们分配 IP 地址。

一旦接口关闭,wpa_supplicant 和 wpa_cli 仍在运行,所以我必须运行

ifdown --force wlan0

我已经将 OpenVPN 配置精简到最低限度示例配置并且同样的问题仍然存在。

我也尝试过使用 rt2800 和 rtl8187 设备,都遇到了相同的情况。

我的配置文件如下,但在尝试让 OpenVPN 工作之前,我没有遇到问题。

接口文件

#/etc/network/interfaces
auto wlan0
iface inet wlan0 manual
    wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
    wpa-driver wext

iface inet default dhcp

wpa_supplicant

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=netdev
update_config=1
eapol_version=1
ap_scan=1
fast_reauth=1

network={
    ssid="myap"
    scan_ssid=1
    key_mgmt=WPA-EAP
    eap=TTLS
    ca_cert="/etc/ssl/certs/certificate.pem"
    identity="me"
    password="mypassword"
    phase1="peaplabel=0"
    phase2="auth=MSCHAPV2"
    priority=1
}

编辑:

经过一段时间的调试,我确定这与 wpa-roam 选项有关,将其更改为 wpa-conf 可以解决问题(wpa_cli 未启动)。当我将范围缩小到导致问题的特定信号时,我将再次更新。

编辑2:

我已经将 wpa_supplicant 从 1.0 更新到 2.0,但同样的问题仍然存在,当 openvpn 隧道形成时,WiFi 只是与 AP 分离,无线接口实际上并没有被关闭(发生这种情况时不会调用 pre、down、post)

答案1

问题的背景略有不同,但答案就在这里......

Debian eth0 到 wlan0 转发,使用 openvpn

基本上,ifplugd 会关闭 WiFi 接口。因为一次只能有一个漫游接口处于活动状态。

当调用它时:

/etc/ifplugd/action.d/action_wpa tun0 up

该脚本循环断开所有 wpa 漫游设备......

for CTRL in /var/run/wpa_supplicant/*; do

    [ -S "${CTRL}" ] || continue

    IFACE="${CTRL#/var/run/wpa_supplicant/}"

    # skip if ifplugd is managing this interface
    if [ "${IFPLUGD_IFACE}" = "${IFACE}" ]; then
        continue
    fi

    if wpa_action "${IFACE}" check; then
        wpa_cli -i "${IFACE}" "${COMMAND}"
    fi
done

需要扩展此脚本以检查 ifplugd 管理的其他接口,而不仅仅是检查用脚本调用的接口。

相关内容