我正在尝试在不使用 NetworkManager 的情况下连接到我的 wlan。启动后我运行以下命令:
iwconfig wlan0 enc <WEP passwd> mode managed essid <name> channel 6
ifconfig wlan0 up
dhclient wlan0
此时,dhclient 会暂停一段时间(可能 2 分钟),然后返回
PING 192.168.1.254 (192.168.1.254) from 192.168.1.65 wlan0: 56(84) bytes of data.
--- 192.168.1.254 ping statistics ---
3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 3000ms
pipe 3
..奇怪的是,当我pkill dhclient; dhclient wlan0
在此之后立即运行时,它会在大约<3秒内连接。
知道造成这个问题的原因是什么吗?
编辑:哦,我确实尝试在 dhclient 上使用 -timeout 标志,但似乎没有任何区别(它仍然停滞了很长时间)。
答案1
这是过时的 dhclient 的问题,该 dhclient 仍在所有 Linux 发行版中实现。dhclient 脚本必须处理租约超时。当您访问无线网络并运行 dhclient 时,它会将 IP 地址和子网掩码、DNS 服务器和其他一些选项绑定到您的无线接口 (wlan0)。DHCP 服务器将该 IP 租给您的接口一段有限的时间 (租约时间)。当您关闭计算机或 dhclient 脚本因任何原因崩溃时,客户端租约时间计数器将停止。然后您启动计算机或再次运行 dhclient。然后,dhclient 找到一个引用旧租约的预绑定配置,它不知道该租约是否仍然有效。问题就来了。dhclient 解决这个问题的方法是使用预绑定绑定接口,并尝试 ping 路由器 (网关)。如果 ping 成功,则预绑定有效并应用于无线接口 (wlan0)。否则,预绑定无效,将被丢弃。
这解释了休眠的原因(“dhclient 长时间停滞”),它正在等待 DHCP 服务器响应。如果没有响应,大约 2 分钟后,它会尝试采用预绑定配置并 ping 旧路由器(“PING 192.168.1.254”)。
我在我的 Slackware 中遇到了同样的问题,并在 dhclient-script 手册页中找到了所有信息。
(man dhclient脚本):
TIMEOUT DHCP 客户端无法联系任何 DHCP 服务器。但是,已识别出旧租约,并且已像 BOUND 一样传入其参数。客户端配置脚本应测试这些参数,如果有理由相信它们有效,则应以零值退出。如果无效,则应以非零值退出。测试租约的常用方法是像 REBIND 一样设置网络(因为可以调用此方法测试多个租约),然后 ping $routers 中定义的第一个路由器。如果收到响应,则租约对于接口当前连接的网络必须是有效的。尝试 ping $new_routers 中列出的所有路由器以及 $new_static_routes 中列出的路由器会更完整,但当前脚本不会这样做。
答案2
如果您手动配置连接,请确保 NetworkManager 服务根本没有启动。我过去曾遇到过这种情况,它会尝试接管并不断恢复我的配置更改。