内容简介:Raspberry Pi AP功能改进: systemd服务封装以及dnsmasq的使用
前言
在上一篇 《 Raspberry pi 设置自动拨号搭建无线路由环境 》 一文中,笔者利用hostapd和udhcpd程序,创建无线热点,实现地址分配以及DNS服务器的设置。本篇将基于上一篇的环境,对树莓派AP进行改进: 使用dnsmasq代替udhcpd实现DNS以及地址租约,并将AP功能封装成为一个服务
上一篇中使用的hostapd以及udhcpd,其方式有一些缺陷:
-
使用命令行方式启动, 并未将启动本身封装成为一个固定的“服务”
-
三代树莓派的内置网卡以及笔者使用的外置网卡的名称均为wlan*,在系统启动的时候有可能造成编号的错乱
-
udhcpd服务的配置文件里面,需要手动指定上游DNS的地址,使得调整起来并不方便
由于笔者使用的Kali系统是较新的 Kali rolling ,和 Debian 9 , Ubuntu16.04 以及 CentOS/RHEL 7.x 一样,已经使用systemd代替了init,因此,针对第一个缺陷,笔者使用systemd将服务进行封装,方便进行管理。
systemd不仅能够管理系统服务,同时对于网络进行管理。针对第二个缺陷,笔者通过利用systemd-networkd,进行网卡设备的重命名,从而避免和内置网卡名称的混淆
针对第三个问题,udhcpd的静态指定DNS的问题,这里笔者将采用dnsmasq来代替,从而让AP客户端使用树莓派的上游DNS进行名称解析。
注:关于init以及systemd,将会在其他的博文中详细阐述,本文以实际应用为主
-
网卡名称的修改
在 Debian whezzy 版本以及 CentOS/RHEL6.x 当中,我们利用编写udev规则来修改网卡设备的名称,而现在我们能够利用systemd-networkd,通过编写.link文件,达到修改网卡名称的目的
我们需要查询到我们想要的硬件信息,通过如下命令:
linuxidc@kali:~$
sudo
udevadm info -a -p
/sys/class/net/wlan1
......
......
ATTR{address}==
"00:11:22:33:44:55"
DRIVERS==
"rt2800usb"
......
......
在/etc/systemd/network目录下面创建一个.link文件,内容如下:
linuxidc@kali:~$
sudo
cat
/etc/systemd/network/10-ethusb0
.link
[Match]
MACAddress=00:11:22:33:44:55
[Link]
Description=USB to Ethernet Adapter
Name=ethusb0
之后重启开启systemd-networkd这个服务(如果已经开启了,可以忽略上述操作),并且重新挂载网卡驱动,用ip命令可以查看到,网卡名称已经改变:
linuxidc@kali:~$
sudo
systemctl
enable
systemd-networkd.service
linuxidc@kali:~$
sudo
systemctl start systemd-networkd.service
linuxidc@kali:~$ modprobe -r rt2800usb
linuxidc@kali:~$ modprobe rt2800usb
linuxidc@kali:~$
sudo
ip l sh |
grep
ethusb0
6: ethusb0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
之后对于hostapd的配置文件(hostapd的安装配置过程,请详见前言中提到的上一篇博文),进行修改,修改之后的内容如下:
interface=ethusb0
ssid=raspberry_AP
hw_mode=g
channel=11
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=PASSWORD
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
-
dnsmasq的安装以及配置
下面介绍如何利用dnsmasq这个轻量级的应用来将树莓派作为DHCP服务端以及本地DNS服务器。首先简单介绍一下dnsmasq。这是一款 轻量级的配置DNS代理以及DHCP和TFTP的工具 ,适用于小型网络,经常用于嵌入式系统,而且Openstack当中针对虚机实例的DHCP分发功能也是由dnsmasq来完成的。
首先,安装dnsmasq
linuxidc@kali:~$
sudo
apt-get dnsmasq
查询一下dnsmasq的介绍以及都安装了哪些内容:
linuxidc@kali:~$ dpkg-query -l dnsmasq
Desired=Unknown
/Install/Remove/Purge/Hold
| Status=Not
/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)
/Reinst-required
(Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-======================-================-================-==================================================
ii dnsmasq 2.76-5 all Small caching DNS proxy and DHCP
/TFTP
server
linuxidc@kali:~$ dpkg-query -L dnsmasq
/.
/etc
/etc/default
/etc/default/dnsmasq
/etc/dnsmasq
.conf
/etc/dnsmasq
.d
/etc/dnsmasq
.d
/README
/etc/init
.d
/etc/init
.d
/dnsmasq
/etc/insserv
.conf.d
/etc/insserv
.conf.d
/dnsmasq
/etc/resolvconf
/etc/resolvconf/update
.d
/etc/resolvconf/update
.d
/dnsmasq
/lib
/lib/systemd
/lib/systemd/system
/lib/systemd/system/dnsmasq
.service
/usr
/usr/lib
/usr/lib/resolvconf
/usr/lib/resolvconf/dpkg-event
.d
/usr/lib/resolvconf/dpkg-event
.d
/dnsmasq
/usr/share
/usr/share/dnsmasq
/usr/share/dnsmasq/installed-marker
/usr/share/doc
/usr/share/doc/dnsmasq
linuxidc@kali:~$
sudo
dpkg-query -L dnsmasq-base
/.
/etc
/etc/dbus-1
/etc/dbus-1/system
.d
/etc/dbus-1/system
.d
/dnsmasq
.conf
/usr
/usr/sbin
/usr/sbin/dnsmasq
/usr/share
/usr/share/dnsmasq-base
/usr/share/dnsmasq-base/trust-anchors
.conf
/usr/share/doc
/usr/share/doc/dnsmasq-base
/usr/share/doc/dnsmasq-base/DBus-interface
.gz
/usr/share/doc/dnsmasq-base/FAQ
.gz
/usr/share/doc/dnsmasq-base/README
.Debian
/usr/share/doc/dnsmasq-base/changelog
.Debian.gz
/usr/share/doc/dnsmasq-base/changelog
.archive.gz
/usr/share/doc/dnsmasq-base/changelog
.gz
/usr/share/doc/dnsmasq-base/copyright
/usr/share/doc/dnsmasq-base/doc
.html
/usr/share/doc/dnsmasq-base/examples
/usr/share/doc/dnsmasq-base/examples/dnsmasq
.conf.example
/usr/share/doc/dnsmasq-base/setup
.html
/usr/share/locale
/usr/share/locale/de
/usr/share/locale/de/LC_MESSAGES
/usr/share/locale/de/LC_MESSAGES/dnsmasq
.mo
/usr/share/locale/es
/usr/share/locale/es/LC_MESSAGES
/usr/share/locale/es/LC_MESSAGES/dnsmasq
.mo
/usr/share/locale/fi
/usr/share/locale/fi/LC_MESSAGES
/usr/share/locale/fi/LC_MESSAGES/dnsmasq
.mo
/usr/share/locale/fr
/usr/share/locale/fr/LC_MESSAGES
/usr/share/locale/fr/LC_MESSAGES/dnsmasq
.mo
/usr/share/locale/id
/usr/share/locale/id/LC_MESSAGES
/usr/share/locale/id/LC_MESSAGES/dnsmasq
.mo
/usr/share/locale/it
/usr/share/locale/it/LC_MESSAGES
/usr/share/locale/it/LC_MESSAGES/dnsmasq
.mo
/usr/share/locale/no
/usr/share/locale/no/LC_MESSAGES
/usr/share/locale/no/LC_MESSAGES/dnsmasq
.mo
/usr/share/locale/pl
/usr/share/locale/pl/LC_MESSAGES
/usr/share/locale/pl/LC_MESSAGES/dnsmasq
.mo
/usr/share/locale/pt_BR
/usr/share/locale/pt_BR/LC_MESSAGES
/usr/share/locale/pt_BR/LC_MESSAGES/dnsmasq
.mo
/usr/share/locale/ro
/usr/share/locale/ro/LC_MESSAGES
/usr/share/locale/ro/LC_MESSAGES/dnsmasq
.mo
/usr/share/man
/usr/share/man/es
/usr/share/man/es/man8
/usr/share/man/es/man8/dnsmasq
.8.gz
/usr/share/man/fr
/usr/share/man/fr/man8
/usr/share/man/fr/man8/dnsmasq
.8.gz
/usr/share/man/man8
/usr/share/man/man8/dnsmasq
.8.gz
/var
/var/lib
/var/lib/misc
由上面结果可以看到,主程序为/usr/sbin/dnsmasq,默认配置文件为/etc/dnsmasq.conf,并且在systemd下面也有dnsmasq的服务。但是在本文中,为了将dnsmasq和hostapd封装成为一个统一的新服务,因此弃用程序包中默认安装的dnsmasq服务以及默认的配置文件。编辑新的配置文件如下所示,下面的配置中,使用dhcp-options给客户端传递DNS服务器为树莓派本身20.20.20.1,而树莓派使用/etc/resolv.conf文件作为上游的DNS服务器进行名称解析,而这个/etc/resolv.conf文件在进行 pon dsl-provider
拨号的时候,会自动获得。
linuxidc@kali:~$
cat
/etc/dnsmasq_AP
.conf
#DHCP
listen-address=20.20.20.1,127.0.0.1
dhcp-range=20.20.20.2,20.20.20.20,12h
dhcp-option=3,20.20.20.1
user=dnsmasq
#DNS
no-hosts
cache-size=500
resolv-
file
=
/etc/resolv
.conf
-
service封装
准备好上述过程之后,下面对于hostapd,dnsmasq进行统一的封装。
创建/lib/systemd/system/AP.service文件,内容如下所示。其中Unit段做描述以及服务依赖的配置;Service段做服务启动的配置,包括开启链路,配置网卡的IP地址,开启hostapd服务,以及开启dnsmasq服务;Install配置段指定该服务使用multi-user.target,对应于多用户状态。
[Unit]
Description=AP
Wants=network.target
Before=network.target
BindsTo=sys-subsystem-net-devices-ethusb0.device
After=sys-subsystem-net-devices-ethusb0.device
[Service]
Type=oneshot
RemainAfterExit=
yes
ExecStart=
/sbin/ip
link
set
dev ethusb0 up
ExecStart=
/sbin/ip
addr add 20.20.20.1
/24
broadcast 20.20.20.255 dev ethusb0
ExecStart=
/usr/sbin/hostapd
-B
/etc/hostapd/hostapd
.conf
ExecStart=
/usr/sbin/dnsmasq
-C
/etc/dnsmasq_AP
.conf
ExecStop=
/sbin/ip
addr flush dev ethusb0
ExecStop=
/sbin/ip
link
set
dev ethusb0 down
[Install]
WantedBy=multi-user.target
通过如下命令激活该service,并设置为开机自动启动。观察ip地址,hostapd服务,dnsmasq服务是否已经启动:
linuxidc@kali:~$
sudo
systemctl
enable
AP.service
linuxidc@kali:~$
sudo
systemctl start AP.service
linuxidc@kali:~$
ps
-ef |
grep
-E
".*hostapd|.*dnsmasq"
|
grep
-
v
grep
root 1337 1 0 19:43 ? 00:00:12
/usr/sbin/hostapd
-B
/etc/hostapd/hostapd
.conf
dnsmasq 1340 1 0 19:43 ? 00:00:00
/usr/sbin/dnsmasq
-C
/etc/dnsmasq_AP
.conf
linuxidc@kali:~$ ip a sh dev ethusb0
6: ethusb0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link
/ether
c8:3a:35:d3:1b:4e brd ff:ff:ff:ff:ff:ff
inet 20.20.20.1
/24
brd 20.20.20.255 scope global ethusb0
valid_lft forever preferred_lft forever
inet6 fe80::ca3a:35ff:fed3:1b4e
/64
scope link
valid_lft forever preferred_lft forever
将windows作为客户端尝试连接raspberry_AP,cygwin输出信息如下:
无线局域网适配器 无线网络连接: 连接特定的 DNS 后缀 . . . . . . . :
描述. . . . . . . . . . . . . . . : Realtek RTL8723AE Wireless LAN 802.11n PCI-E NIC
物理地址. . . . . . . . . . . . . : FF-FF-FF-FF-FF-FF
DHCP 已启用 . . . . . . . . . . . : 是
自动配置已启用. . . . . . . . . . : 是
本地链接 IPv6 地址. . . . . . . . : fe80::c011:2b50:411b:56b7%38(首选)
IPv4 地址 . . . . . . . . . . . . : 20.20.20.8(首选)
子网掩码 . . . . . . . . . . . . : 255.255.255.0
获得租约的时间 . . . . . . . . . : 2017年5月14日 19:46:52
租约过期的时间 . . . . . . . . . : 2017年5月15日 7:46:52
默认网关. . . . . . . . . . . . . : 20.20.20.1
DHCP 服务器 . . . . . . . . . . . : 20.20.20.1
DHCPv6 IAID . . . . . . . . . . . : 810821406
DHCPv6 客户端 DUID . . . . . . . : 00-01-00-01-1C-58-D9-FD-44-8A-5B-ED-33-CF
DNS 服务器 . . . . . . . . . . . : 20.20.20.1
TCPIP 上的 NetBIOS . . . . . . . : 已启用
尝试ping一下 伟大的百度 :
[linuxidc.com] ping www.baidu.com
正在 Ping www.a.shifen.com [111.206.223.206] 具有 32 字节的数据:
来自 111.206.223.206 的回复: 字节=32 时间=7ms TTL=56
来自 111.206.223.206 的回复: 字节=32 时间=13ms TTL=56
来自 111.206.223.206 的回复: 字节=32 时间=12ms TTL=56
来自 111.206.223.206 的回复: 字节=32 时间=9ms TTL=56
111.206.223.206 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 7ms,最长 = 13ms,平均 = 10ms
至此,树莓派AP改造完毕!
Raspberry Pi(树莓派)上从零开始构建 Linux 系统(简称PiLFS) http://www.linuxidc.com/Linux/2017-01/139538.htm
Raspberry Pi(树莓派)上安装Raspbian(无路由器,无显示器) http://www.linuxidc.com/Linux/2017-01/139211.htm
本文永久更新链接地址 : http://www.linuxidc.com/Linux/2017-05/143764.htm
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Learn Python the Hard Way
Zed Shaw / Example Product Manufacturer / 2011
This is a very beginner book for people who want to learn to code. If you can already code then the book will probably drive you insane. It's intended for people who have no coding chops to build up t......一起来看看 《Learn Python the Hard Way》 这本书的介绍吧!