Linux 下的无线 AP 配置

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

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

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

1) 启用驱动

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

sudo modprobe ath9k

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

2) 配置网卡设备名

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

SUBSYSTEM=="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 软件包:

sudo pacman -S dhcp

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

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

4) 配置 wireless-ap 服务

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Powered by Zealic, Visit : https://github.com/zealic
[Unit]
Description=Wireless AP
Wants=network.target
Before=network.target

[Service]
Type=oneshot
RemainAfterExit=yes
EnvironmentFile=/etc/conf.d/wireless-ap
ExecStart=/sbin/ip link set dev ${interface} up
ExecStart=/sbin/ip addr add ${address}/${netmask} broadcast ${broadcast} dev ${interface}
ExecStart=/sbin/dhcpd -q ${interface}
ExecStart=/sbin/iptables -t nat -A POSTROUTING -o ${target_interface} -j MASQUERADE

ExecStop=/sbin/ip addr flush dev ${interface}
ExecStop=/sbin/ip link set dev ${interface} down

[Install]
WantedBy=multi-user.target

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

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

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

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

sudo systemctl enable wireless-ap

5) 安装配置 hostapd

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

首先安装软件包:

sudo pacman -S hostapd

配置 hostapd
/etc/hostapd/hostapd.conf

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

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

启用 hostapd 服务:

sudo systemctl enable hostapd

6) 重启系统

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

sudo reboot

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

7) 问题

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

关键性报错如下:

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

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

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

INFO: task blocked for more than 120 seconds.

这句忘了怎么来的了:

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

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

更新:2013-08-08

确认以上问题不仅仅是内核选项的问题,而是由于我的配置项不完整导致的,
只需要在 hostapd 配置中加入 ht_capab=[HT40-][SHORT-GI-40][DSSS_CKCK-40] 以正确的设定其工作模式就没有问题了。

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

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

参考

Zealic @ 2013-07-06

View Comments |
Categories: tech.posix
Tags:

Related posts