SDB:无线故障检测

跳转至: 导航, 搜索
Icon-cleanup.png 此頁面需要清理 因為他不遵循我們的 維基規範Seems to be not up to date - e. g. no warning about Wired Equivalent Privacy (WEP) as a deprecated and insecure old technique. --Pistazienfresser 16:32, 6 February 2011 (MST)
如果您想要貢獻,請務必要熟悉這些規範。如果您有任何問題,別猶豫,快 聯絡我們, 我們十分樂意能幫助您! :-)
Template:Wireless navbar


由于无论是通过 NetworkManager 还是 YaST 设置无线连接时都涉及到好多部件,因此需要这样一份无线故障检测指南。

目的

设置无线连接时使用的主要部件有:

常见陷阱

MAC 地址过滤

确保在无线连接点 (WAP,AP) 中禁用了 MAC 地址过滤或者已将您的无线网卡 MAC 地址加入到白名单中。

硬件开关

大多数内置无线网卡都可以使用 硬件开关 激活/禁用。请确保您物理激活了无线设备。如果硬件开关是关闭的那么驱动是没有机会设置网络的。

固件

有些无线设备 (例如 iwl3945, iwlagn, b43, ...) 需要一个所谓的固件,固件是由操作系统提供的。openSUSE 已经以 RPM 软件包的方式提供了一些固件文件 (例如 iwl3945-ucode 或 ralink-firmware),但由于版权原因也没有提供一些固件文件。因此需要手动安装它们。有些固件可以使用 /usr/sbin 中提供的脚本下载 (例如 install_acx100_firmware, install_bcm43xx_firmware 和 install_intersil_firmware)。

要确定您是否需要安装固件:

dmesg | less

并浏览输出来查找错误消息。

频道 12,13 和 14 被禁用 (错误的管理域)

截至 openSUSE 11.0 多数无线驱动都依赖 mac80211。在无线堆栈中已经实现了管理域处理,但是内核版本 2.6.27 之前是没有的。为了与 FCC 兼容,无线堆栈只启用了可用频道的最小子集 (bg 频带的 1-11 频道)。例如在德国频道 12 和 13 也是允许的但是默认是禁用的。可以通过覆盖管理域来启用这些频道 (允许的参数有 US, EU 和 JP):

echo "options cfg80211 ieee80211_regdom=EU" > /etc/modprobe.d/cfg80211 

之后重新装载全部无线模块 (mac80211, cfg80211, iwl3945, 等) 或重启来应用新的管理域。

该问题在 Factory 已修复,由于采用了 CRDA

NetworkManager

需要的日志

为了检测 NetworkManager 无线问题,在连接尝试失败后需要以下日志:

  • /var/log/NetworkManager
  • /var/log/wpa_supplicant (如果可以的话最好是带详细调试输出的版本)
  • dmesg 的输出

启用 wpa_supplicant 调试输出

永久

要取得 wpa_supplicant 的最大调试输出您需要修改文件 /usr/share/dbus-1/system-services/fi.epitest.hostap.WPASupplicant.service.

修改这行

Exec=/usr/sbin/wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant.conf -u -f /var/log/wpa_supplicant.log

Exec=/usr/sbin/wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant.conf -u -dddt -f /var/log/wpa_supplicant.log

并以 root 身份运行如下命令:

> rcnetwork stop
> killall wpa_supplicant
> rcnetwork start

现在 wpa_supplicant 将写入非常详细的调试输出到 /var/log/wpa_supplicant.log

短期

如果只需要短期启用调试输出 (例如调试一次连接尝试) 可使用下面命令修改调试级别:

> kill -SIGUSR1 `pidof wpa_supplicant`

supplicant 日志 (/var/log/wpa_supplicant) 将打印一行表示切换到了新的调试级别:

Signal 10 received - changing debug level to MSGDUMP

JFI: 这是 openSUSE 专有的,上游的 wap_supplicant 并没有实现信号处理器。

如何手动设置连接

停用 NetworkManager 和 wpa_supplicant

要手动设置连接请确保当前并未运行 NetworkManager 或 wpa_supplicant 实例。

> rcnetwork stop
> killall wpa_supplicant

如果您的访问点没有使用任何安全设置您可以单纯使用 iwconfig 设置该连接。也可以使用该方法设置 WEP 加密连接。其它连接类型 (WPA-PSK, WPA-EAP, 802.1x with dynamic WEP) 需要 wpa_supplicant。

基本命令

首先运行 iwconfig 来找出您想要使用的无线接口。

> iwconfig
lo        没有无线扩展。

eth1      没有无线扩展。

eth0      未连接  ESSID:""
          模式:受管的  频率=2.412 GHz  访问点: 未连接
          比特率:0 kb/s   天线强度=20 dBm   敏感度=8/0
          重试限制:7   RTS thr:off   Fragment thr:off
          加密密钥:关闭
          电源管理:关闭
          连接质量:0  信号级别:0  噪声级别:0
          Rx invalid nwid:0  Rx invalid crypt:3  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:53   Missed beacon:0

本例中 eth0 是无线接口。

如果您不知道您的无线网络名称 (ESSID),您可能需要运行一次扫描。

> iwlist eth0 scan
...
          蜂巢 02 - 地址: XX:XX:XX:XX:XX:XX
                    ESSID:"XXXXXX"
                    协议:IEEE 802.11bg
                    模式:主控
                    频道:2
                    频率:2.417 GHz (频道 2)
                    加密密钥:关闭
                    比特率:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 6 Mb/s; 9 Mb/s
                              11 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s; 36 Mb/s
                              48 Mb/s; 54 Mb/s
                    质量=37/100  信号级别=-78 dBm
                    额外: Last beacon: 488ms ago
...

该命令将分区段打印出全部访问点。如果您的访问点未显示在列表中,那它可能没有广播它的 ESSID。尝试扫描该指定网络。

> iwlist eth0 scan essid your_essid_here
...

iwconfig

不安全的连接

如果您正在使用 mac80211 驱动 (如 iwl3934, iwl4965, ath5k, b43, rtl8187, rt2x00, ...),在建立连接前需要先打开接口:

> ip link set eth0 up

使用 iwconfig 设置不安全的无线连接非常简单。

> iwconfig eth0 essid your_essid_here

等几秒后,再运行 iwconfig 查看是否建立了连接。

> iwconfig eth0
eth0      IEEE 802.11g  ESSID:"XXXXXX"
          Mode:Managed  Frequency:2.417 GHz  Access Point: XX:XX:XX:XX:XX:XX
          Bit Rate:54 Mb/s   Tx-Power=20 dBm   Sensitivity=8/0
          Retry limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality=58/100  Signal level=-68 dBm  Noise level=-90 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:10

重要信息有

  • 访问点:XX:XX:XX:XX:XX:XX - 应该包含您的访问点的 MAC 地址
  • 连接质量=58/100 - 不应该是 0
  • 信号级别=-68 dBm - 不应该是 0
  • 噪声级别=-90 dBm - 不应该是 0

现在无线连接就设置好了:)

但是在您真正使用此连接前您需要取得一个 IP 地址,方法见下 (获取 IP 地址)。

WEP 加密连接

待写

wpa_supplicant

使用 wpa_supplicant 设置连接比设置不安全无线网络连接要稍微复杂一些。您首先需要写一个包括全部所需信息的配置文件。该配置文件首先包含一些基本信息,这些信息对您要连接的每个网络都是相同的。

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0
eapol_version=1
ap_scan=1
fast_reauth=1

下一步是在配置文件中写所需的网络信息。无线安全类型不同,需要的网络信息也不同。

开放式系统 WEP

network={
        ssid="在此输入您的 SSID"
        key_mgmt=NONE
        group=WEP40 WEP104
        # 密码必须以双引号括起来。Hex 和 ASCII 可以不括起来
        wep_key0=FFFFFFFFFF
        # wep_key1="密码"
        # wep_key2=CCCCC
        # wep_key3="另一个密码"
        priority=5
        # 请使用下面选项设置您想要首先尝试的 wep_keyX 
        wep_tx_keyidx=0
        auth_alg=OPEN
}

带共享密钥的 WPA (PSK)

对于一个 wpa-psk 加密的网络,请使用该配置并修改参数 ssidpsk

network={
	ssid="在此输入您的 ESSID"
	psk="在此输入您的密码"
	key_mgmt=WPA-PSK
	priority=5
	proto=WPA
}

WPA-EAP

 network={
       ssid="在此输入您的 ESSID"
       identity="在此输入您的用户名"
       psk="在此输入您的密码"
       # wpa_supplicant 调试输出会告诉你在这里填什么
       subject_match="/C=US/ST=Utah/L=Provo/O=Novell, Inc./CN=foo.novell.com"
       proto=WPA
       key_mgmt=WPA-EAP
       group=CCMP TKIP
       eap=PEAP
       phase2="auth=MSCHAPV2"
       ca_path="/etc/ssl/certs"
 }

启动连接

要使用 wpa_supplicant 启动之前配置好的连接,请运行如下命令:

> wpa_supplicant -Dwext -ieth0 -c/etc/您的配置文件 -dddt

-Dwext 告诉 wpa_supplicant 使用 wext 驱动与底层驱动通信,大多数驱动使用该设置都应该可以工作(至少基于 mac80211 的驱动是可以的) -ieth0 描述了无线连接应使用的接口 -c/etc/您的配置文件 告诉 wpa_supplicant 应使用的配置 -dddt 启用最大调试输出

几秒后,wpa_supplicant 最好是显示像下面这样的信息:

1213018160.349324: State: GROUP_HANDSHAKE -> COMPLETED
1213018160.349334: CTRL-EVENT-CONNECTED - Connection to XX:XX:XX:XX:XX:XX completed (auth) [id=0 id_str=]
1213018160.349341: wpa_driver_wext_set_operstate: operstate 0->1 (UP)
1213018160.349348: WEXT: Operstate: linkmode=-1, operstate=6
1213018160.349880: EAPOL: External notification - portValid=1
1213018160.349899: EAPOL: External notification - EAP success=1
1213018160.349905: EAPOL: SUPP_PAE entering state AUTHENTICATING
1213018160.349911: EAPOL: SUPP_BE entering state SUCCESS
1213018160.349917: EAP: EAP entering state DISABLED
1213018160.349924: EAPOL: SUPP_PAE entering state AUTHENTICATED
1213018160.349930: EAPOL: SUPP_BE entering state IDLE
1213018160.349954: RTM_NEWLINK: operstate=1 ifi_flags=0x11043 ([UP][RUNNING][LOWER_UP])
1213018160.349965: RTM_NEWLINK, IFLA_IFNAME: Interface 'wlan0' added
1213018161.356786: RSN: processing PMKSA candidate list
1213018161.356821: RSN: not in suitable state for new pre-authentication
1213018161.852768: EAPOL: startWhen --> 0

这时无线连接就设置好了,您可以在新控制台使用 iwconfig 验证它,方法见上面。

wpa_gui

为了活得轻松点,wpa_supplicant 有两个伴侣应用程序 wpa_cliwpa_gui。虽然 wpa_cli 是 wpa_supplicant 软件包的一部分,但是您需要单独安装 wpa_gui。

# zypper in wpa_supplicant-gui

要让 wpa_gui 能与 wpa_supplicant 协作,我们需要使用 gedit 或您喜欢的编辑器编辑 /etc/wpa_supplicant/wpa_supplicant.conf 文件。

# gedit /etc/wpa_supplicant/wpa_supplicant.conf

添加 "update_config=1" 到现有的行之后并保存文件。wpa_supplicant 配置参考请见 /usr/share/doc/packages/wpa_supplicant/wpa_supplicant.conf

现在启动 wpa_supplicant

# wpa_supplicant -Dwext -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf -B

然后运行

# wpa_gui

在 wpa_gui 对话框打开后,按扫描将弹出一个列有全部检测到的访问点的窗口。双击任意项将打开另外一个对话框让您输入密码,点击添加,网络将被添加到 wpa_gui,连接也就创建好了。这适用于开放网络,WEP 和 WPA 加密网络。wpa_gui 也能向 wpa_supplicant.conf 写入合适的参数,如果您感兴趣写了什么,可以

# cat /etc/wpa_supplicant/wpa_supplicant.conf

注意:wpa_gui 不能与 NetworkManager 启动的 wpa_supplicant 实例一起工作,因为 NM 使用 D-Bus 通信。然而它能完美地与 ifup 启动的实例协作,甚至不需要配置文件。

获取 IP 地址

DHCP

如果您的网络使用 DHCP 进行 IP 地址分配,您需要先检查 dhcpcddhclient 实例是否运行,如果运行着请停止它们。

# killall -TERM dhcpcd dhclient

现在您可以使用 dhcpcd wlan0 | eth1 或 dhclient wlan0 | eth1 来请求 IP 地址了。

# dhcpcd wlan0

如果 dhccpcd 响应命令行的话接口现在应该已经分配了一个 IP 地址。可以通过 ip 命令验证。

> ip addr
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 50
    link/ether XX:XX:XX:39:49:b4 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.173/24 brd 196.168.0.255 scope global eth0
    inet6 fe80::212:f0ff:fe39:49b4/64 scope link 
       valid_lft forever preferred_lft forever

相关的部分是 192.168.0.173

手动 IP 设置

可使用 iproute2 设定想要的 IP 地址

> ip addr add 192.168.0.145/24 dev eth0

校验连接是否正常

确定连接是否正常的方法是 ping 一个网站

>  ping google.com
PING google.com (64.233.167.99) 56(84) bytes of data.
64 bytes from py-in-f99.google.com (64.233.167.99): icmp_seq=1 ttl=242 time=156 ms
64 bytes from py-in-f99.google.com (64.233.167.99): icmp_seq=2 ttl=242 time=151 ms
64 bytes from py-in-f99.google.com (64.233.167.99): icmp_seq=3 ttl=242 time=151 ms
^C
--- google.com ping 统计 ---
3 个数据包已传输,3 个数据包已收到,0% 丢包,时间 2008ms
rtt min/avg/max/mdev = 151.011/152.976/156.665/2.648 ms

如果输出像上面一样连接就是正常的!

如果您没有得到上面的响应,您可能希望至少检查一下访问点是可访问的。以 192.168.0.1 为例:

ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=1.75 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=64 time=2.14 ms
64 bytes from 192.168.0.1: icmp_seq=3 ttl=64 time=1.75 ms
64 bytes from 192.168.0.1: icmp_seq=4 ttl=64 time=1.84 ms
^C
--- 192.168.0.1 ping 统计 ---
4 个数据包已传输,4 个数据包已收到,0% 丢包,时间 3012ms
rtt min/avg/max/mdev = 1.754/1.874/2.145/0.160 ms

如果您可以 ping 访问点但是没有互联网地址,那就是名称解析出现了问题。这可能是由于启用了两个 NIC (例如有线和无线) 而每个都跑了一个 dhcpd 造成的。

请关闭两个接口然后打开无线 NIC 并重试上述步骤。

# ifdown eth0
# ifdown wlan0 
# ifup wlan0

TODO: Explain what to do now..

抓包 aka 监视模式

需要的软件

要在无线接口抓包您可以使用 kismet。之后 Wireshark 可以读取 kismet 制作的抓包文件并以用户友好的方式显示数据包。

启用监视模式

如果您有第二块无线网卡可以用来监视无线流量,可进行如下步骤启动流量捕获:

> ip link set wlan0 down
> iwconfig wlan0 mode monitor
> ip link set wlan0 up
> iwconfig wlan0 channel X
> wireshark -i wlan0 -k

这将打开 wireshark 并开始抓取 wlan0 在频道 X 上收到的全部帧。

问答

Q: 我的连接每几分钟就断开
A: 有些连接点会在客户端超过一定时间不活动时尝试断开连接。有时这种行为可以在连接点配置界面修改。

到 Novell 和 openSUSE 页面的链接

外部链接

作者

Helmut Schaa <hschaa@suse.de>