SDB:Tracking down wireless problems
目的
设置无线连接的主要组件是
常见陷阱
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。监管域处理已在无线堆栈中实现,但在 kernel 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 等)或重新启动以启用新的监管域。
由于使用 CRDA,Factory 中已修复此问题
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 特有的,wpa_supplicant 上游中未实现信号处理程序
如何手动设置连接
停止 NetworkManager 和 wpa_supplicant
为了手动设置连接,请确保此时没有运行 NetworkManager 或 wpa_supplicant 的任何实例。
> rcnetwork stop > killall wpa_supplicant
如果您的接入点不使用任何安全措施,您可以使用纯 iwconfig 设置连接。即使 WEP 保护的连接也可以这样设置。对于所有其他连接类型(WPA-PSK、WPA-EAP、使用动态 WEP 的 802.1x),需要 wpa_supplicant。
基本命令
首先运行 iwconfig 以找出要使用的无线接口。
> iwconfig
lo no wireless extensions.
eth1 no wireless extensions.
eth0 unassociated ESSID:""
Mode:Managed Frequency=2.412 GHz Access Point: Not-Associated
Bit Rate:0 kb/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:0 Signal level:0 Noise level: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
...
Cell 02 - Address: XX:XX:XX:XX:XX:XX
ESSID:"XXXXXX"
Protocol:IEEE 802.11bg
Mode:Master
Channel:2
Frequency:2.417 GHz (Channel 2)
Encryption key:off
Bit Rates: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
Quality=37/100 Signal level=-78 dBm
Extra: 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="your_ssid_here"
key_mgmt=NONE
group=WEP40 WEP104
# Passphrase keys must be in double-quotes. Hex and ASCII are ok unquoted
wep_key0=FFFFFFFFFF
# wep_key1="passphrase"
# wep_key2=CCCCC
# wep_key3="another_passphrase"
priority=5
#Be sure to set the wep_keyX you want to try first using this
wep_tx_keyidx=0
auth_alg=OPEN
}
对于 wpa-psk 保护的网络,只需使用此配置并修改 ssid 和 psk 参数。
network={
ssid="your_essid_here"
psk="your_password_here"
key_mgmt=WPA-PSK
priority=5
proto=WPA
}
WPA-EAP
network={
ssid="your_essid_here"
identity="your_usename_here"
psk="your_password_here"
# wpa_supplicant debug output will tell you what to put here
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/your_config_file -dddt
-Dwext 告诉 wpa_supplicant 使用 wext 驱动程序与低级驱动程序通信,大多数当前驱动程序都应该可以很好地使用此设置(至少添加基于 mac80211 的驱动程序)。
-ieth0 描述应使用哪个接口进行无线连接
-c/etc/your_config_file 只是告诉 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_cli 和 wpa_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 实例一起工作,因为它使用 D-Bus 进行通信。它与 ifup 启动的实例完美配合,甚至不需要配置文件。
获取 IP 地址
DHCP
如果您的网络使用 dhcp 进行 IP 地址分配,您需要首先检查是否有 dhcpcd 或 dhclient 实例正在运行并停止它们(如果有)。
# 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 statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2008ms rtt min/avg/max/mdev = 151.011/152.976/156.665/2.648 ms
如果输出如下所示,则连接正常工作!
如果您没有得到此响应,您可能需要检查是否至少可以访问 AP。在此示例中,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 statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3012ms rtt min/avg/max/mdev = 1.754/1.874/2.145/0.160 ms
如果您可以 ping AP 但无法访问 Internet 地址,则名称解析可能存在问题。这可能是由启用两个 NIC(即有线和无线),每个 NIC 都有 dhcpcd 运行引起的。
请关闭这两个接口,然后启动无线 NIC 并从头开始重试。
# ifdown eth0 # ifdown wlan0 # ifup wlan0
TODO:解释现在该怎么做..
捕获数据包,又称监视模式
所需软件
要捕获无线接口上的数据包,可以使用 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 接收的所有帧。
常见问题解答
问:我的连接每隔几分钟就会断开
答:某些接入点如果客户端处于非活动状态一段时间,则会断开连接。有时可以在接入点的配置界面中更改此行为。
链接到 Novell 和 openSUSE 页面
- 论坛 Wireless 在 forums.opensuse.org 上
外部链接
作者
<hschaa@suse.de>