Linux 下的无线 AP 配置

介绍在 Linux 下通过无线网卡配置无线的经验。

我使用的网卡是 TL-WN841N,这样的大牌子可以很好的得到内核的驱动支持。
TP-LINK 官方是有在维护他的产品针对 Linux 驱动的。

本文工作发行版使用ArchLinux,不保证其他发行可用,
但除了包管理器的差别外,大部分配置通常是可以通用的。

1) 启用驱动

使用如下命令启用驱动,需要重启:

1sudo modprobe ath9k

当然也可以不用重启,但是我这里推荐你所有配置完成以后,还是重启一下比较好。

2) 配置网卡设备名

/etc/udev/rules.d/10.network.rules

1SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="ff:ff:ff:ff:ff:ff", NAME="wlan1"

注意将上述配置中的 ff:ff:ff:ff:ff:ff 替换为你的无线网卡 MAC 地址。

这样配置是由于 systemd 的新命名机制,导致网卡命名不像以前 eth*,而是一串不容易记忆的名称。
这里我们统一配置为 wlan1,方便后面使用。

3) 配置 dhcpd 服务器

因为无线 AP 需要提供 DHCP 服务,供无线设备使用,因此这里需要安装 DHCP。

首先安装 dhcpd 软件包:

1sudo pacman -S dhcp

然后我们做一个简单的子网配置:
/etc/dhcpd.conf

1subnet 192.168.100.0 netmask 255.255.255.0 {
2  range 192.168.100.100 192.168.100.199;
3  option routers 192.168.100.1;
4  option domain-name-servers 8.8.8.8;
5  option ip-forwarding off;
6  option broadcast-address 192.168.100.255;
7}

4) 配置 wireless-ap 服务

这是一个自定义 systemd 服务,用于配置无线网卡并绑定到 dhcp。
最后为其配置 iptables 转发规则。

配置文件如下:
/etc/systemd/system/wireless-ap.service

 1# Powered by Zealic, Visit : https://github.com/zealic
 2[Unit]
 3Description=Wireless AP
 4Wants=network.target
 5Before=network.target
 6
 7[Service]
 8Type=oneshot
 9RemainAfterExit=yes
10EnvironmentFile=/etc/conf.d/wireless-ap
11ExecStart=/sbin/ip link set dev ${interface} up
12ExecStart=/sbin/ip addr add ${address}/${netmask} broadcast ${broadcast} dev ${interface}
13ExecStart=/sbin/dhcpd -q ${interface}
14ExecStart=/sbin/iptables -t nat -A POSTROUTING -o ${target_interface} -j MASQUERADE
15
16ExecStop=/sbin/ip addr flush dev ${interface}
17ExecStop=/sbin/ip link set dev ${interface} down
18
19[Install]
20WantedBy=multi-user.target

针对服务的环境配置:
/etc/conf.d/wireless-ap

1interface=wlan1
2target_interface=net1
3address=192.168.100.1
4netmask=24
5broadcast=192.168.100.255

记住,target_interface 指的是你可以接入互联网的网卡,你的这个网卡名可能是 eth0 之类的。

完成服务配置以后,我们需要启用服务。

1sudo systemctl enable wireless-ap

5) 安装配置 hostapd

hostapd 就是可以让无线网卡工作在 master 模式下的工具了。

首先安装软件包:

1sudo pacman -S hostapd

配置 hostapd
/etc/hostapd/hostapd.conf

 1ssid=YOUR-AP-SSID
 2driver=nl80211
 3hw_mode=g
 4channel=11
 5interface=wlan1
 6auth_algs=1
 7wpa=1
 8wpa_passphrase=YOUR-AP-PASSWORD
 9wpa_key_mgmt=WPA-PSK
10wpa_pairwise=CCMP TKIP
11rsn_pairwise=CCMP
12ht_capab=[HT40-][SHORT-GI-40][DSSS_CKCK-40]

别忘了把 YOUR-AP-SSIDYOUR-AP-PASSWORD 换成你自己的 SSID 和密码。

启用 hostapd 服务:

1sudo systemctl enable hostapd

6) 重启系统

到这里我们已经配置完成无线网卡的 AP,重启系统即可开始使用。

1sudo reboot

当然如果你是高级 Linux 用户,完全知道自己在做什么,也可以自己控制卸载网卡并启动服务。

7) 问题

我配置完成可以正常的使用,但是发现使用一段时间后无线 AP 就消失了,整个系统也有些问题,内核经常性的挂起。

关键性报错如下:

长时间工作后 tty 不停的刷如下日志:

1kernel: DMA: Out of SW-IOMMU space for 16 bytes at device 0000:00:1d.0

在 tty 中运行任何命令都可能会导致长时间挂起,超时后输出如下错误:

1INFO: task blocked for more than 120 seconds.

这句忘了怎么来的了:

1ath: Unable to remove station entry for: ff:ff:ff:ff:ff:ff

发生这个问题的原因是由于 Intel 的 64 位支持不太好的原因,
只需要在内核启动参数加上 intel_iommu=off 选项即可。

更新:2013-08-08

确认以上问题不仅仅是内核选项的问题,而是由于我的配置项不完整导致的,
只需要在 hostapd 配置中加入

1ht_capab=[HT40-][SHORT-GI-40][DSSS_CKCK-40]

这样以正确的设定其工作模式就没有问题了。

我已经在上面的配置中加入了此配置选项。

实验下来 AP 运行良好,没有出现导致内核挂起的问题。

参考

View Comments