2021-05-12 14:32:11
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
相關文章