本次操作在Thinkpad T440p Ubuntu16.04上进行,使用hostapd使网卡开启AP功能,使用isc-dhcp-server作为dhcp服务器。
1. 安装需要的程序包
sudo apt-get update
sudo apt-get install hostapd isc-dhcp-server
2. 开启无线网卡的AP功能
2-1. 将无线网卡配置成monitor模式
使用ifconfig命令查看无线网卡对应的网络接口(比如我的是wlp3s0,常见的还有wlan0等)
sudo ifconfig wlp3s0 down
sudo iwconfig wlp3s0 mode monitor
sudo ifconfig wlp3s0 up
2-2. 开启AP
创建hostapd的配置文件
zcat /usr/share/doc/hostapd/examples/hostapd.conf.gz | sudo tee -a /etc/hostapd/hostapd.conf
修改配置文件
interface=wlp3s0
ssid=Example-WLAN #这里填写你自己的无线名称
hw_mode=g
wpa=2
wpa_passphrase=12345678 #这里填写你自己的无线密码
wpa_key_mgmt=WPA-PSK WPA-EAP WPA-PSK-SHA256 WPA-EAP-SHA256
最后执行下面命令,开启AP
hostapd /etc/hostapd/hostapd.conf
出现打印wlp3s0: AP-ENABLED
表示开启成功。
2-2-1. 其他配置
- 若不需要密码,则注释掉所有wpa开头的配置项
- 若要支持802.11n,需要如下配置
hw_mode=g
ieee80211n=1
ht_capab=[SHORT-GI-40][HT40+][HT40-][DSSS_CCK-40]
2-2-2. 开启失败
我在开启时,出现nl80211: Could not configure driver mode
,开启失败。解决方法是先执行sudo killall -9 wpa_supplicant
,然后执行hostapd /etc/hostapd/hostapd.conf
2-2-3. 如果需要这张网卡一直当做AP使用,且开机自动配置
需要修改/etc/network/interfaces
。这里假设使用的dhcp服务器的网段是192.168.33.0/24
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
auto wlp3s0
iface wlp3s0 inet static
hostapd /etc/hostapd/hostapd.conf
address 192.168.33.1
netmask 255.255.255.0
3. 开启dhcp服务器
创建或修改/etc/dhcp/dhcpd.conf
ddns-update-style none;
option domain-name-servers 114.114.114.114, 8.8.8.8;
default-lease-time 600;
max-lease-time 7200;
subnet 192.168.33.0 netmask 255.255.255.0 {
range 192.168.33.100 192.168.33.200;
option routers 192.168.33.1
}
然后执行dhcpd -4 -d -cf /etc/dhcp/dhcpd.conf wlp3s0
开启dhcp服务器
若一切顺利,那么恭喜,现在你可以连接上这个无线SSID了!
4. 让这个无线可以上网
执行完上面的步骤,这个无线还是不能上网的。若希望这个无线可以上网,那么首先你的这个电脑得有一个可以上网的网卡(比如我这里的有线网卡enp0s25),然后执行如下命令:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.33.0/24 ! -d 192.168.33.0/24 -o enp0s25 -j MASQUERADE
好了,现在这个无线网络就可以上网了
5. 想让这张网卡重新可以去连接其他的AP
首先需要关闭hostapd
killall -9 hostapd
将无线网卡配置成managed模式
sudo ifconfig wlp3s0 down
sudo iwconfig wlp3s0 mode managed
sudo ifconfig wlp3s0 up
nmcli radio all on
sudo service network-manager restart