首先说一下,这次开启wifi热点的过程有些曲折,很多教程在写的过程中没有提到作者遇到的问题,这里和大家一起分享。
这次我们使用的工具主力是hostapd用来开启wifi热点的,其次是isc-dhcp-server,它是一个DHCP服务器,用来自动分配ip地址。
总路线:1.安装配置hostapd(阶段成果:安卓手机和电脑能搜索到热点名称,并且能连接上)-->2.安装配置dhcp服务器(阶段成果:安卓手机和电脑能自动获取ip地址)-->3.iptables配置转发规则(阶段成果:安卓手机和电脑访问互联网)
提示:教程主要讲有线共享给无线,无线共享给无线也可以的,参考最后的进一步说明就可以了
安装hostapd
sudo apt-get install hostapd编辑hostapd.conf
sudo gedit /etc/hostapd.conf添加以下内容,如果存在可以直接覆盖即可
interface=wlan0 driver=nl80211 hw_mode=g channel=1 ssid=360WIFI-0517 wpa=2 wpa_key_mgmt=WPA-PSK wpa_pairwise=CCMP wpa_passphrase=12345678----------------------------分割线-----------------------------
部分教程采用下列方式启动
测试配置是否可用:
sudo hostapd -d /etc/hostapd/hostapd.conf启动hostapd:
sudo /etc/rc.d/hostapd start但是笔者测试不好用
启动hostapd
sudo hostapd -B /etc/hostapd.conf报错
Configuration file: /etc/hostapd.conf nl80211: Could not configure driver mode nl80211 driver initialization failed. hostapd_free_hapd_data: Interface wlan0 wasn't started解决方法
#改变NetworkManager里的状态,关闭wifi,同时软锁定
sudo nmcli nm wifi off#启用wifi设备,不同于网络状态中的启用wifi(后者改变NetworkManager里的状态)
sudo rfkill unblock wlan一般这个情况下可以启动hostapd了
sudo hostapd -B /etc/hostapd.conf但是如果是重新开启热点的话还是会报错
sudo killall hostapd再运行
sudo hostapd -B /etc/hostapd.conf成功
Configuration file: /etc/hostapd.conf Using interface wlan0 with hwaddr c0:f8:da:59:6a:ec and ssid "360WIFI-0517" wlan0: interface state UNINITIALIZED->ENABLED wlan0: AP-ENABLED
这里用的是isc-dhcp-server,你也可以使用其它的dhcp服务器程序
安装isc-dhcp-server
sudo apt-get install isc-dhcp-server编辑/etc/default/isc-dhcp-server指定网卡为wlan0
sudo gedit /etc/default/isc-dhcp-server把
INTERFACES=""改为
INTERFACES="wlan0"编辑/etc/dhcp/dhcpd.conf修改租约DNS等信息/etc/dhcp/dhcpd.conf
sudo gedit /etc/dhcp/dhcpd.conf把
option domain-name "example.org"; option domain-name-servers ns1.example.org, ns2.example.org;改为
option domain-name "example.org"; option domain-name-servers 8.8.8.8, 114.114.114.114;参考
#subnet 10.254.239.32 netmask 255.255.255.224 { # range dynamic-bootp 10.254.239.40 10.254.239.60; # option broadcast-address 10.254.239.31; # option routers rtr-239-32-1.example.org; #}改成
subnet 192.168.201.0 netmask 255.255.255.0 { range dynamic-bootp 192.168.201.100 192.168.201.150; option broadcast-address 192.168.201.255; option routers 192.168.201.1; }注意:这里192.168.201.0不能写成192.168.201.1
sudo ifconfig wlan0 192.168.201.1 netmask 255.255.255.0 up重启DHCP服务器
sudo /etc/init.d/isc-dhcp-server restart如果报错,用cat命令打印系统日志
cat /var/log/syslog最后发现INTERFACES=" wlan0"写成了"waln0"
配置转发前需要打开linux转发功能
临时改变,重启后恢复
sudo sysctl -w net.ipv4.ip_forward=1文件位于/etc/sysctl.conf
sudo iptables -F#转发到eth0网卡
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE#查看转发规则
sudo iptables -L
报错
Configuration file: /etc/hostapd.conf nl80211: Could not configure driver mode nl80211 driver initialization failed. hostapd_free_hapd_data: Interface wlan0 wasn't started最终的解决方案
https://wiki.archlinux.org/index.php/Software_Access_Point#NetworkManager_is_interfering
最下面
hostapd may not work, if the device is managed by NetworkManager. You can mask the device:
/etc/NetworkManager/NetworkManager.conf
[keyfile] unmanaged-devices=mac:<hwaddr>大致意思是放弃NetworkManager对无线热点网卡的管理,具体做法是在/etc/NetworkManager/NetworkManager.conf最后添加
[keyfile]
unmanaged-devices=mac:00:87:36:08:01:c6
mac:后面是你的无线网卡mac地址
然后重启NetworkManager
具体操作如下
打开/etc/NetworkManager/NetworkManager.conf
sudo gedit /etc/NetworkManager/NetworkManager.conf添加
[keyfile] unmanaged-devices=mac:00:87:36:08:01:c6保存,其中mac地址可以通过ifconfig命令查出来
重启NetworkManager
sudo service network-manager stop;sudo service network-manager start
经过N次测试上面的更改方法不靠谱。应该在/etc/NetworkManager/nm-system-settings.conf 这个文件中更改才能生效
具体方法如下
sudo gedit /etc/NetworkManager/nm-system-settings.conf添加
[keyfile] unmanaged-devices=mac:00:87:36:08:01:c6并且将
[ifupdown] managed=true改为
[ifupdown] managed=false保存
在官方给出的文档中nm-system-settings.conf和NetworkManager.conf的作用/格式是一样的,并且nm-system-settings.conf是属于过时的,已经不建议使用了,但是最后测试发现改未托管的设备只能通过nm-system-settings.conf这个文件来改,NetworkManager.conf添加和删除都是一样的结果。如果想还原状态,把nm-system-settings.conf改回去就行了。
再顺便写个启动脚本吧,shell刚开始用,不足之处多多指教
输入命令
sudo gedit /usr/bin/myap编写以下内容保存
#! /bin/sh #设置默认转发的网卡eth0 defautIface=eth0 #从路由表查询当前使用外网的网卡,如果有讲数据转发到这个网卡,如果没有,默认转发到eth0 result=`netstat -r|grep default|awk '{print $8}'` if [ "$result" = "" ] then echo 当前没有使用外网的网卡,数据默认转发到$defautIface网卡上 else defautIface=$result echo 当前使用外网的网卡$result,数据转发到$defautIface网卡上 fi #关闭hostapd这个进程 killall hostapd #运行hostapd这个进程 hostapd -B /etc/hostapd.conf #配置dhcp服务器 #启动前先配置网卡的IP和子网掩码 ifconfig wlan1 192.168.201.1 netmask 255.255.255.0 up #重启DHCP服务器 sudo /etc/init.d/isc-dhcp-server restart #iptables配置转发规则 #配置转发前需要打开linux转发功能 #临时改变,重启后恢复 sudo sysctl -w net.ipv4.ip_forward=1 #iptables转发规则 iptables -F iptables -X iptables -t nat -F iptables -t nat -X iptables -t nat -A POSTROUTING -o $defautIface -j MASQUERADE修改/usr/bin/myap权限:
sudo chmod a+x /usr/bin/myap运行
sudo myap