首先说一下,这次开启wifi热点的过程有些曲折,很多教程在写的过程中没有提到作者遇到的问题,这里和大家一起分享。

这次我们使用的工具主力是hostapd用来开启wifi热点的,其次是isc-dhcp-server,它是一个DHCP服务器,用来自动分配ip地址。

总路线:1.安装配置hostapd(阶段成果:安卓手机和电脑能搜索到热点名称,并且能连接上)-->2.安装配置dhcp服务器(阶段成果:安卓手机和电脑能自动获取ip地址)-->3.iptables配置转发规则(阶段成果:安卓手机和电脑访问互联网)

提示:教程主要讲有线共享给无线,无线共享给无线也可以的,参考最后的进一步说明就可以了

一.安装配置hostapd

安装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

但是如果是重新开启热点的话还是会报错


原因是hostapd进程占用了这个网卡,关闭这个进程就好了


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

二.安装配置dhcp服务器

这里用的是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 , ;

改为


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 ;
#}

改成


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



启动dhcp服务器


启动前先配置网卡的IP和子网掩码


sudo ifconfig wlan0 192.168.201.1 netmask 255.255.255.0 up

重启DHCP服务器


sudo /etc/init.d/isc-dhcp-server restart

如果报错,用cat命令打印系统日志


check syslog for diagnostics.


cat /var/log/syslog

最后发现INTERFACES="

wlan0"写成了"waln0"

三.iptables配置转发规则

配置转发前需要打开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


附:

1.关于启动hostapd报错的进一步说明

报错

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:///index.php/Software_Access_Point#NetworkManager_is_interfering

最下面

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改回去就行了。

2.启动脚本

再顺便写个启动脚本吧,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