翁光惠 發表於 2017-1-20 16:39:53

CentOS7使用hostapd实现无AP模式的详解

<p>这篇是 linux 下使用&nbsp;hostapd 实现无线接入点 AP 模式的另一种实现方式:hostapd 路由模式配置。</p>
<p>对于软硬件的基本配置及 hostapd 安装在《CentOS 7 之 hostapd AP模式配置》的前半部分内容中有说明,可以先看看那篇,再看本文。</p>
<p>hostapd 的AP模式配置需要的有线网卡和无线网卡进行桥接,那路由模式配置主要就是将无线网卡的数据通过有线网卡进行伪装、转发两个方面,也就不再需要将有线和无线网卡进行桥接。</p>
<p>配置这种路由模式就类似一台普通的无线路由器,有线网口就相当于普通无线路由器的 WAN 接口,无线网卡就负责发送广播无线信号供手机、笔记本的无线设备接入实现网络访问。</p>
<p>但也有区别的地方就是跟普通无线路由器相比,这种实现方式没有四个普通的 LAN 接口,不能供其它台式机等进行有线连接。</p>
<p>实际上 linux 作为网络功能为主的操作系统也是可以连接的,只是需要交换机等设备等,会复杂些。我这里的配置就当作是没有四个 LAN 接口的普通无线路由器。</p>
<p><strong>hostapd.conf 配置</strong> </p>
<p>这里只是一个最小化的配置:</p>
<p>#&nbsp;/etc/hostapd/hostapd.conf&nbsp;最小化配置</p>
<p>interface=wlp2s0</p>
<p>#bridge=br0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#不再需要桥接,将这行注释就可以</p>
<p>driver=nl80211</p>
<p>ssid=test</p>
<p>hw_mode=g</p>
<p>channel=1</p>
<p>auth_algs=3</p>
<p>ignore_broadcast_ssid=0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;是否广播,0&nbsp;广播</p>
<p>wpa=3</p>
<p>wpa_passphrase=12345678&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;无线连接密码</p>
<p>配置跟AP模式配置文件类似,只要注释掉 bridge=br0&nbsp;选项就可以。</p>
<p><strong>有线接口配置</strong> </p>
<p>首先我们需要正确配置有线接口并且可以正常上网。最简单的是方式就是从路由器那自动获取IP地址、网关、DNS。如果没有路由器的话那就需要手动设置有线接口的上网方式,例如常用的PPPOE方式、静态IP地址方式、动态获取IP地址方式等。反正动态获取IP地址的最简单。</p>
<p><strong>无线接口设置 使用 ip addr add 命令</strong> </p>
<p>使用 ip addr add 命令设置无线网卡的&nbsp;IP 地址,重启后就会失效。例如172.16.0.1/24或其他私有地址,还有就是不要与有线网卡处在同一个网段。一般有线网卡从路由器获取的IP地址是 192.168.1.0/24 网段地址。</p>
<p>ip&nbsp;addr&nbsp;add&nbsp;172.16.0.1/24&nbsp;dev&nbsp;wlp2s0</p>
<p><strong>坑提示</strong>:目前 CentOS 7 默认使用的是 NetworkManager 套件作为网络配置工具。这里遇到一个问题就是,NetworkManager 套件其提供的 nmcli 命令并不支持给无线网卡设置静态的 IP 地址,这就需要使用 ip addr add 命令手动设定无线网卡的 IP 地址或者在 /etc/sysconfig/network-scripts/ 文件夹下面新建配置文件,这是比较老且经典的一种接口配置方式。</p>
<p><strong>使用网络配置文件</strong> </p>
<p>如要想想保存设置,可以新建一个文件 /etc/sysconfig/network-scripts/ifcfg-static-wlp2s0 ,文件名以 ifcfg 前缀。</p>
<p>vi&nbsp;/etc/sysconfig/network-scripts/ifcfg-static-wlp2s0</p>
<p>#&nbsp;vi&nbsp;/etc/sysconfig/network-scripts/ifcfg-static-wlp2s0</p>
<p>#TYPE=Ethernet</p>
<p>#BOOTPROTO=none</p>
<p>#DEFROUTE=yes</p>
<p>#IPV4_FAILURE_FATAL=no</p>
<p>#IPV6INIT=yes</p>
<p>#IPV6_AUTOCONF=yes</p>
<p>#IPV6_DEFROUTE=yes</p>
<p>#IPV6_FAILURE_FATAL=no</p>
<p>#NAME=static-wlp2s0</p>
<p>#UUID=a036678e-8fdf-48f3-8693-961bb6326i744&nbsp;</p>
<p>DEVICE=wlp2s0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#指定无线网卡的接口</p>
<p>ONBOOT=yes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#开机就进行设置</p>
<p>IPADDR=172.16.0.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#指定IP地址</p>
<p>PREFIX=24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#指定掩码长度</p>
<p>#GATEWAY=192.168.10.254&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#其他用不着注释掉</p>
<p>#DNS1=127.0.0.1</p>
<p>#DNS2=192.168.10.254</p>
<p>#IPV6_PEERDNS=yes</p>
<p>#IPV6_PEERROUTES=yes</p>
<p>保存后需要先停止 NetworkManager.service 服务,最好禁止开机启动,不然还是会有问题。主要表现为开机时 network.service 无法启动。</p>
<p>禁止&nbsp;NetworkManager.service 服务开机启动</p>
<p>systemctl&nbsp;disable&nbsp;&nbsp;NetworkManager.service</p>
<p>停止&nbsp;NetworkManager.service 服务</p>
<p>systemctl&nbsp;stop&nbsp;&nbsp;NetworkManager.service</p>
<p>想看看有没有生效可以重启 network.service 服务或直接重启系统。</p>
<p>systemctl&nbsp;restart&nbsp;network.service</p>
<p><strong>启用转发和配置接口伪装 启用转发</strong> </p>
<p>使用 sysctl -w 重启后会失效</p>
<p>sysctl&nbsp;-w&nbsp;net.ipv4.ip_forward=1</p>
<p>#&nbsp;sysctl&nbsp;-w&nbsp;net.ipv4.ip_forward=1</p>
<p>net.ipv4.ip_forward&nbsp;=&nbsp;1</p>
<p>启用&nbsp;IP 转发重启后不会失效使用下面方法,系统重启后会自动加载 /etc/sysctl.d/ 文件夹下的设置。</p>
<p>vi&nbsp;/etc/sysctl.d/ip_forward.conf</p>
<p>#&nbsp;vi&nbsp;/etc/sysctl.d/ip_forward.conf&nbsp;</p>
<p>net.ipv4.ip_forward&nbsp;=&nbsp;1</p>
<p><strong>配置接口伪装</strong> </p>
<p>CentOS 7 中使用 firewalld 和 iptables 都能做到接口伪装。CentOS 7 中默认启用的是 firewalld.service 服务。iptables 服务和 firewalld 服务冲突,两者只能启用其中一个。</p>
<p><strong>使用 firewalld 配置接口伪装</strong> </p>
<p>如果能使用图形界面配置的话更加简单明了,这里仅使用 firewalld-cmd 命令方式配置。</p>
<p>如果没有启动 firewalld.service 服务,需要先启动 firewalld.service 服务。</p>
<p>systemctl&nbsp;start&nbsp;firewalld.service</p>
<p>将无线接口加入到 trust 区域,并保存配置。默认情况下所有接口属于 public 区域,连接限制比较严格,会导致无法连接。</p>
<p>firewall-cmd&nbsp;--zone=trusted&nbsp;--add-interface=wlp2s0&nbsp;--permanent</p>
<p>#&nbsp;firewall-cmd&nbsp;--zone=trusted&nbsp;--add-interface=wlp2s0&nbsp;--permanent&nbsp;</p>
<p>success</p>
<p>对有线接口所在的区域启用伪装,并保存配置,默认情况下有线接口属于 public 区域。</p>
<p>firewall-cmd&nbsp;--zone=public&nbsp;--add-masquerade&nbsp;--permanent</p>
<p>#&nbsp;firewall-cmd&nbsp;--zone=public&nbsp;--add-masquerade&nbsp;--permanent&nbsp;</p>
<p>success</p>
<p>重启 firewalld 服务</p>
<p>systemctl&nbsp;restart&nbsp;firewalld.service</p>
<p><strong>使用 iptables 配置接口伪装</strong> </p>
<p>如果习惯使用 iptables ,需要安装 iptables-services 这个包,里面包含 iptables.service 和 ip6tables.service 这两个服务,分别用于 ipv4 和 ipv6。</p>
<p>要使用 iptables 需要先停止并禁用 firewalld.service 服务</p>
<p>systemctl&nbsp;stop&nbsp;firewalld.service</p>
<p>systemctl&nbsp;disable&nbsp;firewalld.service</p>
<p>再启用 iptables.service 服务,因为目前还是主要使用 ipv4 所以只启用 iptables.service 就可以。如果使用 iptables 同样需要设置开机启动 iptables.service 服务。</p>
<p>systemctl&nbsp;enable&nbsp;iptables.service</p>
<p>启动 iptables.service 服务</p>
<p>systemctl&nbsp;start&nbsp;iptables.service</p>
<p>接口伪装</p>
<p>iptables&nbsp;-t&nbsp;nat&nbsp;-A&nbsp;POSTROUTING&nbsp;&nbsp;-o&nbsp;p2p1&nbsp;-j&nbsp;MASQUERADE</p>
<p>一般来说配置上面的命令就可以了,如果防火墙设置比较严格需要添加允许转发无线网卡接口wlp2s0。</p>
<p>iptables&nbsp;-t&nbsp;filter&nbsp;-A&nbsp;FORWARD&nbsp;-i&nbsp;wlp2s0&nbsp;-j&nbsp;ACCEPT</p>
<p><strong>dnsmasq 配置 dnsmasq 软件安装</strong> </p>
<p>dnsmasq 主要负责分配客户端IP地址及DNS解析服务。</p>
<p>没有安装的话先安装 dnsmasq 软件</p>
<p>yum&nbsp;install&nbsp;dnsmasq</p>
<p>设置开机自动启动 dnsmasq 服务</p>
<p>systemctl&nbsp;enable&nbsp;dnsmasq.service</p>
<p><strong>dnsmasq.conf 配置</strong> </p>
<p>vi&nbsp;/etc/dmsmasq.conf</p>
<p>#&nbsp;vi&nbsp;/etc/dnsmasq.conf</p>
<p>#&nbsp;指定接口,指定后同时附加lo接口,可以使用'*'通配符</p>
<p>interface=wlp2s0</p>
<p>#&nbsp;绑定接口</p>
<p>bind-interfaces</p>
<p>#&nbsp;DHCP地址池&nbsp;从172.16.0.100到172.16.0.200</p>
<p>dhcp-range=172.16.0.100,172.16.0.200,255.255.255.0,1h</p>
<p>启动 dnsmansq 服务需要无线网卡已经正确设置了 ip 地址。dnsmasq 会自动将当前的无线网卡地址 172.16.0.1 设置为客户端的网关地址和DNS地址。</p>
<p>systemctl&nbsp;start&nbsp;dnsmasq.service</p>
<p>最后重新启动 hostapd 服务</p>
<p>systemctl&nbsp;restart&nbsp;hostapd.service</p>
頁: [1]
查看完整版本: CentOS7使用hostapd实现无AP模式的详解