Raspberry Pi AP功能改进: systemd服务封装以及dnsmasq的使用

栏目: 服务器 · 发布时间: 7年前

内容简介:Raspberry Pi AP功能改进: systemd服务封装以及dnsmasq的使用

前言

在上一篇 Raspberry pi 设置自动拨号搭建无线路由环境 一文中,笔者利用hostapd和udhcpd程序,创建无线热点,实现地址分配以及DNS服务器的设置。本篇将基于上一篇的环境,对树莓派AP进行改进: 使用dnsmasq代替udhcpd实现DNS以及地址租约,并将AP功能封装成为一个服务

上一篇中使用的hostapd以及udhcpd,其方式有一些缺陷:

  1. 使用命令行方式启动, 并未将启动本身封装成为一个固定的“服务”

  2. 三代树莓派的内置网卡以及笔者使用的外置网卡的名称均为wlan*,在系统启动的时候有可能造成编号的错乱

  3. 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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算机科学概论(第12版)

计算机科学概论(第12版)

[美] J.Glenn Brookshear、[美] Dennis Brylow / 刘艺、吴英、毛倩倩 / 人民邮电出版社 / 2017-1 / 69.00

《计算机科学概论》是计算机科学概论课程的经典教材,全书对计算机科学做了百科全书式的精彩阐述,充分展现了计算机科学的历史背景、发展历程和新的技术趋势。《计算机科学概论》首先介绍的是信息编码及计算机体系结构的基本原理,进而讲述操作系统和组网及因特网,接着探讨算法、程序设计语言及软件工程,然后讨论数据抽象和数据库方面的问题,讲述图形学的一些主要应用以及人工智能,以计算理论的介绍结束全书。《计算机科学概论......一起来看看 《计算机科学概论(第12版)》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具