ubuntu14.04开启wifi热点


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

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

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

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

一.安装配置hostapd

安装hostapd

  1. sudo apt-get install hostapd  
sudo apt-get install hostapd
编辑hostapd.conf
  1. sudo gedit /etc/hostapd.conf  
sudo gedit /etc/hostapd.conf
添加以下内容,如果存在可以直接覆盖即可
  1. interface=wlan0  
  2. driver=nl80211  
  3. hw_mode=g  
  4. channel=1  
  5. ssid=360WIFI-0517  
  6. wpa=2  
  7. wpa_key_mgmt=WPA-PSK  
  8. wpa_pairwise=CCMP  
  9. wpa_passphrase=12345678  
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
----------------------------分割线-----------------------------

 

部分教程采用下列方式启动
测试配置是否可用:

 

  1. sudo hostapd -d /etc/hostapd/hostapd.conf  
sudo hostapd -d /etc/hostapd/hostapd.conf
启动hostapd:

 

 

  1. sudo /etc/rc.d/hostapd start  
sudo /etc/rc.d/hostapd start
但是笔者测试不好用
----------------------------分割线--------------------------

 

启动hostapd

 

  1. sudo hostapd -B /etc/hostapd.conf  
sudo hostapd -B /etc/hostapd.conf
报错
  1. Configuration file: /etc/hostapd.conf  
  2. nl80211: Could not configure driver mode  
  3. nl80211 driver initialization failed.  
  4. hostapd_free_hapd_data: Interface wlan0 wasn't started  
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,同时软锁定

  1. sudo nmcli nm wifi off   
sudo nmcli nm wifi off 
#启用wifi设备,不同于网络状态中的启用wifi(后者改变NetworkManager里的状态)
  1. sudo rfkill unblock wlan  
sudo rfkill unblock wlan
一般这个情况下可以启动hostapd了

 

 

  1. sudo hostapd -B /etc/hostapd.conf  
sudo hostapd -B /etc/hostapd.conf
但是如果是重新开启热点的话还是会报错
原因是hostapd进程占用了这个网卡,关闭这个进程就好了
  1. sudo killall hostapd  
sudo killall hostapd
再运行
  1. sudo hostapd -B /etc/hostapd.conf  
sudo hostapd -B /etc/hostapd.conf
成功
  1. Configuration file: /etc/hostapd.conf  
  2. Using interface wlan0 with hwaddr c0:f8:da:59:6a:ec and ssid "360WIFI-0517"  
  3. wlan0: interface state UNINITIALIZED->ENABLED  
  4. wlan0: AP-ENABLED  
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

 

  1. sudo apt-get install isc-dhcp-server  
sudo apt-get install isc-dhcp-server
编辑/etc/default/isc-dhcp-server指定网卡为wlan0
  1. sudo gedit /etc/default/isc-dhcp-server  
sudo gedit /etc/default/isc-dhcp-server

  1. INTERFACES=""  
INTERFACES=""
改为
  1. INTERFACES="wlan0"  
INTERFACES="wlan0"
编辑/etc/dhcp/dhcpd.conf修改租约DNS等信息/etc/dhcp/dhcpd.conf
  1. sudo gedit /etc/dhcp/dhcpd.conf  
sudo gedit /etc/dhcp/dhcpd.conf

  1. option domain-name "example.org";  
  2. option domain-name-servers ns1.example.org, ns2.example.org;  
option domain-name "example.org";
option domain-name-servers ns1.example.org, ns2.example.org;
改为
  1. option domain-name "example.org";  
  2. option domain-name-servers 8.8.8.8, 114.114.114.114;  
option domain-name "example.org";
option domain-name-servers 8.8.8.8, 114.114.114.114;
参考
  1. #subnet 10.254.239.32 netmask 255.255.255.224 {  
  2. #  range dynamic-bootp 10.254.239.40 10.254.239.60;  
  3. #  option broadcast-address 10.254.239.31;  
  4. #  option routers rtr-239-32-1.example.org;  
  5. #}  
#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;
#}
改成
  1. subnet 192.168.201.0 netmask 255.255.255.0 {  
  2.   range dynamic-bootp 192.168.201.100 192.168.201.150;  
  3.   option broadcast-address 192.168.201.255;  
  4.   option routers 192.168.201.1;  
  5. }  
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和子网掩码
  1. sudo ifconfig wlan0 192.168.201.1 netmask 255.255.255.0 up  
sudo ifconfig wlan0 192.168.201.1 netmask 255.255.255.0 up
重启DHCP服务器
  1. sudo /etc/init.d/isc-dhcp-server restart  
sudo /etc/init.d/isc-dhcp-server restart
如果报错,用cat命令打印系统日志
check syslog for diagnostics.
  1. cat /var/log/syslog  
cat /var/log/syslog
最后发现INTERFACES="wlan0"写成了"waln0"

 

 

三.iptables配置转发规则

配置转发前需要打开linux转发功能
临时改变,重启后恢复

  1. sudo sysctl -w net.ipv4.ip_forward=1  
sudo sysctl -w net.ipv4.ip_forward=1
文件位于/etc/sysctl.conf
#清除所有规则
  1. sudo iptables -F  
sudo iptables -F
#转发到eth0网卡
  1. sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE  
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
#查看转发规则
  1. sudo iptables -L   
sudo iptables -L 


附:

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

报错

  1. Configuration file: /etc/hostapd.conf  
  2. nl80211: Could not configure driver mode  
  3. nl80211 driver initialization failed.  
  4. hostapd_free_hapd_data: Interface wlan0 wasn't started  
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

最下面

 

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

 

  1. sudo gedit /etc/NetworkManager/NetworkManager.conf  
sudo gedit /etc/NetworkManager/NetworkManager.conf
添加

 

 

  1. [keyfile]  
  2. unmanaged-devices=mac:00:87:36:08:01:c6  
[keyfile]
unmanaged-devices=mac:00:87:36:08:01:c6
保存,其中mac地址可以通过ifconfig命令查出来

 

重启NetworkManager

 

  1. sudo service network-manager stop;sudo service network-manager start  
sudo service network-manager stop;sudo service network-manager start

 

经过N次测试上面的更改方法不靠谱。应该在/etc/NetworkManager/nm-system-settings.conf 这个文件中更改才能生效

具体方法如下

 

  1. sudo gedit /etc/NetworkManager/nm-system-settings.conf  
sudo gedit /etc/NetworkManager/nm-system-settings.conf
添加
  1. [keyfile]  
  2. unmanaged-devices=mac:00:87:36:08:01:c6  
[keyfile]
unmanaged-devices=mac:00:87:36:08:01:c6
并且将

 

 

  1. [ifupdown]  
  2. managed=true  
[ifupdown]
managed=true
改为

 

 

  1. [ifupdown]  
  2. managed=false  
[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刚开始用,不足之处多多指教

输入命令

 

  1. sudo gedit /usr/bin/myap  
sudo gedit /usr/bin/myap
编写以下内容保存

 

  1. #! /bin/sh  
  2.   
  3. #设置默认转发的网卡eth0  
  4. defautIface=eth0  
  5. #从路由表查询当前使用外网的网卡,如果有讲数据转发到这个网卡,如果没有,默认转发到eth0  
  6. result=`netstat -r|grep default|awk '{print $8}'`  
  7. if [ "$result" = "" ]  
  8. then  
  9.   echo 当前没有使用外网的网卡,数据默认转发到$defautIface网卡上  
  10. else  
  11.   defautIface=$result  
  12.   echo 当前使用外网的网卡$result,数据转发到$defautIface网卡上  
  13. fi  
  14.   
  15. #关闭hostapd这个进程  
  16. killall hostapd  
  17. #运行hostapd这个进程  
  18. hostapd -B /etc/hostapd.conf  
  19.   
  20. #配置dhcp服务器  
  21. #启动前先配置网卡的IP和子网掩码  
  22. ifconfig wlan1 192.168.201.1 netmask 255.255.255.0 up  
  23. #重启DHCP服务器  
  24. sudo /etc/init.d/isc-dhcp-server restart  
  25.   
  26. #iptables配置转发规则  
  27. #配置转发前需要打开linux转发功能  
  28. #临时改变,重启后恢复  
  29. sudo sysctl -w net.ipv4.ip_forward=1  
  30. #iptables转发规则  
  31. iptables -F  
  32. iptables -X  
  33. iptables -t nat -F  
  34. iptables -t nat -X  
  35. iptables -t nat -A POSTROUTING -o $defautIface -j MASQUERADE  
#! /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权限:

 

  1. sudo chmod a+x /usr/bin/myap  
sudo chmod a+x /usr/bin/myap
运行

 

  1. sudo myap  
sudo myap


posted @ 2017-09-10 17:32  大海中的一粒沙  阅读(1193)  评论(0编辑  收藏  举报