Raspberry Pi + CentOS = Hotspot Wi-Fi (atau router raspberry dengan topi merah)

Ada banyak sekali informasi di Internet tentang pembuatan titik akses Wi-Fi berdasarkan PC papan tunggal Raspberry. Biasanya, ini berarti menggunakan sistem operasi Raspbian asli Raspberry.

Sebagai penganut sistem berbasis RPM, saya tidak dapat melewatkan keajaiban kecil ini dan tidak mencoba CentOS kesayangan saya di dalamnya.

Artikel ini memberikan instruksi untuk membuat router Wi-Fi 5GHz/AC dari Raspberry Pi 3 Model B+ berbasis sistem operasi CentOS. Akan ada beberapa trik standar namun kurang diketahui, dan sebagai bonus - gambar untuk menghubungkan peralatan Wi-Fi tambahan ke Raspberry, yang memungkinkannya beroperasi secara bersamaan dalam beberapa mode (2,4+5GHz).

Raspberry Pi + CentOS = Hotspot Wi-Fi (atau router raspberry dengan topi merah)
(campuran gambar yang tersedia secara bebas)

Mari kita perhatikan segera bahwa beberapa kecepatan kosmik tidak akan berfungsi. Saya memeras maksimum 100 Mbps dari Raspberry saya melalui udara, dan ini mencakup kecepatan penyedia Internet saya. Mengapa Anda memerlukan AC yang lamban, jika secara teori Anda bisa mendapatkan setengah gigabit bahkan pada N? Jika Anda bertanya pada diri sendiri pertanyaan ini, pergilah ke toko untuk membeli router asli dengan delapan antena eksternal.

0. Apa yang Anda perlukan

  • Sebenarnya, “produk raspberry” itu sendiri memiliki kaliber: Pi 3 Model B+ (untuk mencapai kecepatan dan saluran 5GHz yang didambakan);
  • MicroSD bagus >= 4GB;
  • Workstation dengan pembaca/penulis Linux dan microSD;
  • Ketersediaan keterampilan yang memadai di Linux, artikel ini ditujukan untuk Geek terlatih;
  • Konektivitas jaringan kabel (eth0) antara Raspberry dan Linux, menjalankan server DHCP di jaringan lokal dan akses Internet dari kedua perangkat.

Sedikit komentar pada poin terakhir. “Mana yang lebih dulu, telur atau…” bagaimana cara membuat router Wi-Fi tanpa adanya peralatan akses Internet? Mari kita tinggalkan latihan yang menghibur ini di luar cakupan artikel dan asumsikan saja Raspberry terhubung ke jaringan lokal melalui kabel dan memiliki akses ke Internet. Dalam hal ini, kita tidak memerlukan TV tambahan dan manipulator untuk mengatur "raspberry".

1. Instal CentOS

Halaman beranda proyek

Pada saat artikel ini ditulis, versi CentOS yang berjalan di perangkat adalah 32-bit. Di suatu tempat di World Wide Web saya menemukan pendapat bahwa kinerja OS tersebut pada arsitektur ARM 64-bit berkurang sebanyak 20%. Saya akan meninggalkan momen ini tanpa komentar.

Di Linux, unduh image minimal dengan kernel "-RaspberryPI-"dan tulis ke microSD:

# xzcat CentOS-Userland-7-armv7hl-RaspberryPI-Minimal-1810-sda.raw.xz | 
  dd of=/dev/mmcblk0 bs=4M
# sync

Sebelum mulai menggunakan image, kami akan menghapus partisi SWAP darinya, memperluas root ke seluruh volume yang tersedia dan menghapus SELinux. Algoritmenya sederhana: buat salinan root di Linux, hapus semua partisi dari microSD kecuali yang pertama (/boot), buat root baru dan kembalikan isinya dari salinan.

Contoh tindakan yang diperlukan (output konsol yang parah)

# mount /dev/mmcblk0p3 /mnt
# cd /mnt
# tar cfz ~/pi.tgz . --no-selinux
# cd
# umount /mnt

# parted /dev/mmcblk0

(parted) unit s
(parted) print free
Model: SD SC16G (sd/mmc)
Disk /dev/mmcblk0: 31116288s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start     End        Size       Type     File system     Flags
        63s       2047s      1985s               Free Space
 1      2048s     1370111s   1368064s   primary  fat32           boot, lba
 2      1370112s  2369535s   999424s    primary  linux-swap(v1)
 3      2369536s  5298175s   2928640s   primary  ext4
        5298176s  31116287s  25818112s           Free Space

(parted) rm 3
(parted) rm 2

(parted) print free
Model: SD SC16G (sd/mmc)
Disk /dev/mmcblk0: 31116288s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start     End        Size       Type     File system  Flags
        63s       2047s      1985s               Free Space
 1      2048s     1370111s   1368064s   primary  fat32        boot, lba
        1370112s  31116287s  29746176s           Free Space

(parted) mkpart
Partition type?  primary/extended? primary
File system type?  [ext2]? ext4
Start? 1370112s
End? 31116287s

(parted) set
Partition number? 2
Flag to Invert? lba
New state?  on/[off]? off

(parted) print free
Model: SD SC16G (sd/mmc)
Disk /dev/mmcblk0: 31116288s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start     End        Size       Type     File system  Flags
        63s       2047s      1985s               Free Space
 1      2048s     1370111s   1368064s   primary  fat32        boot, lba
 2      1370112s  31116287s  29746176s  primary  ext4

(parted) quit

# mkfs.ext4 /dev/mmcblk0p2 
mke2fs 1.44.6 (5-Mar-2019)
/dev/mmcblk0p2 contains a swap file system labelled '_swap'
Proceed anyway? (y,N) y
Discarding device blocks: done                            
Creating filesystem with 3718272 4k blocks and 930240 inodes
Filesystem UUID: 6a1a0694-8196-4724-a58d-edde1f189b31
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done   

# mount /dev/mmcblk0p2 /mnt
# tar xfz ~/pi.tgz -C /mnt --no-selinux

Setelah membongkar isi partisi root, saatnya melakukan beberapa perubahan.

Nonaktifkan SELinux di /mnt/etc/selinux/config:

SELINUX=disabled

Mengedit /mnt/etc/fstab, hanya menyisakan dua entri tentang partisi: boot (/boot, tidak ada perubahan) dan root (kita mengubah nilai UUID, yang dapat diketahui dengan mempelajari output dari perintah blkid di Linux):

UUID=6a1a0694-8196-4724-a58d-edde1f189b31  /     ext4    defaults,noatime 0 0
UUID=6938-F4F2                             /boot vfat    defaults,noatime 0 0

Terakhir, kami mengubah parameter boot kernel: kami menentukan lokasi baru untuk partisi root, menonaktifkan output informasi debugging dan (opsional) melarang kernel menetapkan alamat IPv6 pada antarmuka jaringan:

# cd
# umount /mnt
# mount /dev/mmcblk0p1 /mnt

Berikut isinya /mnt/cmdline.txt ke bentuk berikut (satu baris tanpa tanda hubung):

root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait quiet ipv6.disable_ipv6=1

Selesai:

# cd
# umount /mnt
# sync

Kami mengatur ulang microSD menjadi "raspberry", meluncurkannya dan mendapatkan akses jaringan melalui ssh (root/centos).

2. Menyiapkan CentOS

Tiga gerakan pertama yang tak tergoyahkan: passwd, pembaruan yum -y, restart.

Kami memberikan manajemen jaringan jaringand:

# yum install systemd-networkd
# systemctl enable systemd-networkd
# systemctl disable NetworkManager
# chkconfig network off

Membuat file (bersama dengan direktori) /etc/systemd/network/eth0.network:

[Match]
Name=eth0

[Network]
DHCP=ipv4

Kami me-reboot "raspberry" dan kembali mendapatkan akses jaringan melalui ssh (alamat IP dapat berubah). Perhatikan apa yang digunakan / Etc / resolv.conf, dibuat sebelumnya oleh Manajer Jaringan. Oleh karena itu, jika ada masalah dalam penyelesaiannya, edit isinya. Menggunakan terselesaikan systemd kita tidak akan.

Kami menghapus yang "tidak perlu", memperbaiki dan mempercepat pemuatan OS:

# systemctl set-default multi-user.target
# yum remove GeoIP Network* aic* alsa* cloud-utils-growpart 
  cronie* dhc* firewal* initscripts iwl* kexec* logrotate 
  postfix rsyslog selinux-pol* teamd wpa_supplicant

Siapa yang butuh? cron dan siapa yang tidak mencerna bawaannya pengatur waktu sistem, dapat menentukan apa yang hilang. / var / log- dan lihat ke dalam journalctl. Jika Anda memerlukan riwayat log (secara default, informasi hanya disimpan sejak sistem dimulai):

# mkdir /var/log/journal
# systemd-tmpfiles --create --prefix /var/log/journal
# systemctl restart systemd-journald
# vi /etc/systemd/journald.conf

Nonaktifkan penggunaan IPv6 oleh layanan dasar (jika diperlukan)/ etc / ssh / sshd_config:

AddressFamily inet

/etc/sysconfig/chronyd:

OPTIONS="-4"

Relevansi waktu pada “raspberry” merupakan suatu hal yang penting. Karena tidak ada kemampuan perangkat keras untuk menyimpan status jam saat ini saat reboot, sinkronisasi diperlukan. Daemon yang sangat bagus dan cepat untuk ini adalah chrony - sudah terinstal dan dimulai secara otomatis. Anda dapat mengubah server NTP ke yang terdekat.

/etc/chrony.conf:

server 0.ru.pool.ntp.org iburst
server 1.ru.pool.ntp.org iburst
server 2.ru.pool.ntp.org iburst
server 3.ru.pool.ntp.org iburst

Untuk mengatur zona waktu yang akan kita gunakan menipu. Karena tujuan kami adalah membuat router Wi-Fi yang beroperasi pada frekuensi 5GHz, kami akan mempersiapkan kejutan terlebih dahulu pengatur:

#yum info crda
Ringkasan: Daemon kepatuhan peraturan untuk jaringan nirkabel 802.11

Rancangan jahat ini, yang juga didasarkan pada zona waktu, “melarang” penggunaan (di Rusia) frekuensi 5GHz dan saluran dengan angka “tinggi”. Caranya dengan mengatur zona waktu tanpa menggunakan nama benua/kota, yaitu:

# timedatectl set-timezone Europe/Moscow

Kami menekan:

# timedatectl set-timezone Etc/GMT-3

Dan sentuhan terakhir pada gaya rambut sistem:

# hostnamectl set-hostname router

/root/.bash_profile:

. . .

# User specific environment and startup programs

export PROMPT_COMMAND="vcgencmd measure_temp"
export LANG=en_US.UTF-8
export PATH=$PATH:$HOME/bin

3. Pengaya CentOS

Segala sesuatu yang dikatakan di atas dapat dianggap sebagai instruksi lengkap untuk menginstal CentOS “vanilla” di Raspberry Pi. Anda akan mendapatkan PC yang melakukan booting (ulang) dalam waktu kurang dari 10 detik, menggunakan RAM kurang dari 15 Megabyte dan microSD 1.5 Gigabyte (sebenarnya kurang dari 1 Gigabyte karena /boot tidak lengkap, tapi jujur ​​saja).

Untuk menginstal perangkat lunak titik akses Wi-Fi pada sistem ini, Anda perlu sedikit memperluas kemampuan distribusi CentOS standar. Pertama-tama, mari kita perbarui driver (firmware) adaptor Wi-Fi bawaan. Halaman beranda proyek mengatakan:

Wifi di Raspberry 3B dan 3B+

File firmware Raspberry PI 3B/3B+ tidak diperbolehkan untuk didistribusikan oleh Proyek CentOS. Anda dapat menggunakan artikel berikut untuk memahami masalahnya, mendapatkan firmware, dan mengatur wifi.

Apa yang dilarang untuk proyek CentOS tidak dilarang bagi kami untuk penggunaan pribadi. Kami mengganti firmware Wi-Fi distribusi di CentOS dengan yang sesuai dari pengembang Broadcom (gumpalan biner yang sama yang dibenci...). Ini, khususnya, memungkinkan Anda menggunakan AC dalam mode titik akses.

Peningkatan firmware Wi-FiCari tahu model perangkat dan versi firmware saat ini:

# journalctl | grep $(basename $(readlink /sys/class/net/wlan0/device/driver))
Jan 01 04:00:03 router kernel: brcmfmac: F1 signature read @0x18000000=0x15264345
Jan 01 04:00:03 router kernel: brcmfmac: brcmf_fw_map_chip_to_name: using brcm/brcmfmac43455-sdio.bin for chip 0x004345(17221) rev 0x000006
Jan 01 04:00:03 router kernel: usbcore: registered new interface driver brcmfmac
Jan 01 04:00:03 router kernel: brcmfmac: brcmf_c_preinit_dcmds: Firmware version = wl0: Mar  1 2015 07:29:38 version 7.45.18 (r538002) FWID 01-6a2c8ad4
Jan 01 04:00:03 router kernel: brcmfmac: brcmf_c_preinit_dcmds: CLM version = API: 12.2 Data: 7.14.8 Compiler: 1.24.9 ClmImport: 1.24.9 Creation: 2014-09-02 03:05:33 Inc Data: 7.17.1 Inc Compiler: 1.26.11 Inc ClmImport: 1.26.11 Creation: 2015-03-01 07:22:34 

Kami melihat bahwa versi firmware adalah 7.45.18 tanggal 01.03.2015/XNUMX/XNUMX, dan ingat rangkaian angka berikut: 43455 (brcmfmac43455-sdio.bin).

Unduh gambar Raspbian saat ini. Orang malas bisa menulis gambar ke microSD dan mengambil file dengan firmware dari sana. Atau Anda dapat memasang partisi root gambar di Linux dan menyalin apa yang Anda perlukan dari sana:

# wget https://downloads.raspberrypi.org/raspbian_lite_latest
# unzip -p raspbian_lite_latest > raspbian.img
# fdisk -l raspbian.img
Disk raspbian.img: 2 GiB, 2197815296 bytes, 4292608 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x17869b7d

Device        Boot  Start     End Sectors  Size Id Type
raspbian.img1        8192  532480  524289  256M  c W95 FAT32 (LBA)
raspbian.img2      540672 4292607 3751936  1.8G 83 Linux

# mount -t ext4 -o loop,offset=$((540672 * 512)) raspbian.img /mnt
# cp -fv /mnt/lib/firmware/brcm/*43455* ...
'/mnt/lib/firmware/brcm/brcmfmac43455-sdio.bin' -> ...
'/mnt/lib/firmware/brcm/brcmfmac43455-sdio.clm_blob' -> ...
'/mnt/lib/firmware/brcm/brcmfmac43455-sdio.txt' -> ...
# umount /mnt

File firmware adaptor Wi-Fi yang dihasilkan harus disalin dan diganti dengan "raspberry" ke dalam direktori /usr/lib/firmware/brcm/

Kami me-reboot router masa depan dan tersenyum puas:

# journalctl | grep $(basename $(readlink /sys/class/net/wlan0/device/driver))
Jan 01 04:00:03 router kernel: brcmfmac: F1 signature read @0x18000000=0x15264345
Jan 01 04:00:03 router kernel: brcmfmac: brcmf_fw_map_chip_to_name: using brcm/brcmfmac43455-sdio.bin for chip 0x004345(17221) rev 0x000006
Jan 01 04:00:03 router kernel: usbcore: registered new interface driver brcmfmac
Jan 01 04:00:03 router kernel: brcmfmac: brcmf_c_preinit_dcmds: Firmware version = wl0: Feb 27 2018 03:15:32 version 7.45.154 (r684107 CY) FWID 01-4fbe0b04
Jan 01 04:00:03 router kernel: brcmfmac: brcmf_c_preinit_dcmds: CLM version = API: 12.2 Data: 9.10.105 Compiler: 1.29.4 ClmImport: 1.36.3 Creation: 2018-03-09 18:56:28 

Versi: 7.45.154 tanggal 27.02.2018/XNUMX/XNUMX.

Dan tentu saja EPEL:

# cat > /etc/yum.repos.d/epel.repo << EOF
[epel]
name=Epel rebuild for armhfp
baseurl=https://armv7.dev.centos.org/repodir/epel-pass-1/
enabled=1
gpgcheck=0
EOF

# yum clean all
# rm -rfv /var/cache/yum
# yum update

4. Konfigurasi jaringan dan tantangan ke depan

Seperti yang kita sepakati di atas, "raspberry" dihubungkan melalui "kabel" ke jaringan lokal. Mari kita asumsikan penyedia menyediakan akses Internet dengan cara yang persis sama: alamat di jaringan publik dikeluarkan secara dinamis oleh server DHCP (mungkin dengan pengikatan MAC). Dalam hal ini, setelah pengaturan terakhir raspberry, Anda hanya perlu “menyambungkan” kabel penyedia ke dalamnya dan selesai. Otorisasi menggunakan systemd-jaringan - topik artikel tersendiri dan tidak dibahas di sini.

Antarmuka Wi-Fi Raspberry adalah jaringan lokal, dan adaptor Ethernet internal (eth0) bersifat eksternal. Mari kita beri nomor pada jaringan lokal secara statis, misalnya: 192.168.0.0/24. Alamat raspberi: 192.168.0.1. Server DHCP akan beroperasi pada jaringan eksternal (Internet).

Masalah Konsistensi Penamaan и programmer Guatemala yang terkenal - dua masalah yang menunggu siapa saja yang mengkonfigurasi antarmuka jaringan dan layanan dalam distribusi systemd.

Kekacauan paralel (penyimpangan liris)Lennart Pottering telah menyusun programnya sendiri systemd Sangat bagus. Ini systemd meluncurkan program lain dengan sangat cepat sehingga mereka, yang tidak punya waktu untuk pulih dari peluit wasit, tersandung dan jatuh di awal bahkan tanpa memulai rintangannya.

Tapi serius, paralelisasi agresif dari proses yang diluncurkan pada awal OS systemd adalah semacam "jembatan keledai" bagi spesialis LSB sekuensial berpengalaman. Untungnya, menertibkan “kekacauan paralel” ini ternyata sederhana, meski tidak selalu jelas.

Kami membuat dua antarmuka jembatan virtual dengan nama konstan: lan и lesu. Kami akan “menghubungkan” adaptor Wi-Fi ke yang pertama, dan “raspberry” eth0 ke yang kedua.

/etc/systemd/network/lan.netdev:

[NetDev]
Name=lan
Kind=bridge

/etc/systemd/network/lan.network:

[Match]
Name=lan

[Network]
Address=192.168.0.1/24
IPForward=yes

/etc/systemd/network/wan.netdev:

[NetDev]
Name=wan
Kind=bridge
#MACAddress=xx:xx:xx:xx:xx:xx

/etc/systemd/network/wan.network:

[Match]
Name=wan

[Network]
DHCP=ipv4
IPForward=yes

IPForward=ya menghilangkan kebutuhan untuk memberi petunjuk ke kernel melalui sysctl untuk mengaktifkan perutean.
Alamat MAC= Mari kita batalkan komentar dan ubah jika perlu.

Pertama kita “menghubungkan” eth0. Kami ingat "masalah keseragaman" dan hanya menggunakan alamat MAC antarmuka ini, yang dapat diketahui, misalnya seperti ini:

# cat /sys/class/net/eth0/address 

Kami membuat /etc/systemd/network/eth.network:

[Match]
MACAddress=b8:27:eb:xx:xx:xx

[Network]
Bridge=wan

Kami menghapus file konfigurasi sebelumnya eth0, reboot Raspberry dan dapatkan akses jaringan ke sana (alamat IP kemungkinan besar akan berubah):

# rm -fv /etc/systemd/network/eth0.network
# reboot

5.DNSMASQ

Untuk membuat titik akses Wi-Fi, tidak ada yang mengalahkan pasangan ini dnsmasq.dll + hostapd belum menemukan jawabannya. Menurut pendapat saya.

Jika ada yang lupa, maka...hostapd - ini adalah hal yang mengontrol adaptor Wi-Fi (khususnya, ini akan menangani koneksinya ke virtual lan "raspberries"), mengotorisasi dan mendaftarkan klien nirkabel.

dnsmasq.dll — mengonfigurasi tumpukan jaringan klien: mengeluarkan alamat IP, server DNS, gateway default, dan fasilitas serupa.

Mari kita mulai dengan dnsmasq:

# yum install dnsmasq

Pola / Etc / resolv.conf:

nameserver 1.1.1.1
nameserver 1.0.0.1
nameserver 8.8.8.8
nameserver 8.8.4.4
nameserver 77.88.8.8
nameserver 77.88.8.1
domain router.local
search router.local

edit sesuai keinginan Anda.

minimalis /etc/dnsmasq.conf:

domain-needed
bogus-priv
interface=lan
bind-dynamic
expand-hosts
domain=#
dhcp-range=192.168.0.100,192.168.0.199,255.255.255.0,24h
conf-dir=/etc/dnsmasq.d

“Keajaiban” di sini terletak pada parameternya mengikat-dinamis, yang memberitahu daemon dnsmasq untuk menunggu hingga muncul di sistem antarmuka=lan, dan tidak pingsan karena kesepian yang membanggakan setelah permulaan.

# systemctl enable dnsmasq
# systemctl start dnsmasq; journalctl -f

6. HOSTAPD

Dan terakhir, konfigurasi hostapd ajaib. Saya yakin seseorang sedang membaca artikel ini untuk mencari baris-baris berharga ini.

Sebelum menginstal hostapd, Anda perlu mengatasi “masalah keseragaman”. Adaptor Wi-Fi internal wlan0 dapat dengan mudah mengubah namanya menjadi wlan1 saat menyambungkan peralatan Wi-Fi USB tambahan. Oleh karena itu, kami akan memperbaiki nama antarmuka dengan cara berikut: kami akan membuat nama unik untuk adaptor (nirkabel) dan mengikatnya ke alamat MAC.

Untuk adaptor Wi-Fi internal yang masih wlan0:

# cat /sys/class/net/wlan0/address 
b8:27:eb:xx:xx:xx

Kami membuat /etc/systemd/network/wl0.link:

[Match]
MACAddress=b8:27:eb:xx:xx:xx

[Link]
Name=wl0

Sekarang kami akan yakin akan hal itu wl0 - Ini adalah Wi-Fi bawaan. Kami me-reboot Raspberry untuk memastikan hal ini.

Install:

# yum install hostapd wireless-tools

Berkas konfigurasi /etc/hostapd/hostapd.conf:

ssid=rpi
wpa_passphrase=1234567890

channel=36

country_code=US

interface=wl0
bridge=lan

driver=nl80211

auth_algs=1
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

macaddr_acl=0

hw_mode=a
wmm_enabled=1

# N
ieee80211n=1
require_ht=1
ht_capab=[MAX-AMSDU-3839][HT40+][SHORT-GI-20][SHORT-GI-40][DSSS_CCK-40]

# AC
ieee80211ac=1
require_vht=1
ieee80211d=0
ieee80211h=0
vht_capab=[MAX-AMSDU-3839][SHORT-GI-80]
vht_oper_chwidth=1
vht_oper_centr_freq_seg0_idx=42

Tanpa melupakan sejenak GKChP, ubah parameter yang kita perlukan dan periksa fungsionalitasnya secara manual:

# hostapd /etc/hostapd/hostapd.conf

hostapd akan mulai dalam mode interaktif, menyiarkan statusnya ke konsol. Jika tidak ada kesalahan, maka klien yang mendukung mode AC akan dapat terhubung ke titik akses. Untuk menghentikan hostapd - Ctrl-C.

Yang tersisa hanyalah mengaktifkan hostapd di startup sistem. Jika Anda melakukan hal standar (systemctl aktifkan hostapd), maka setelah reboot berikutnya Anda bisa mendapatkan setan “bergulir dalam darah” dengan diagnosis “antarmuka wl0 tidak ditemukan". Sebagai akibat dari “kekacauan paralel”, hostapd memulai lebih cepat daripada kernel yang menemukan adaptor nirkabel.

Internet penuh dengan solusi: dari batas waktu yang dipaksakan sebelum memulai daemon (beberapa menit), hingga daemon lain yang memantau tampilan antarmuka dan (kembali) memulai hostpad. Solusinya cukup bisa diterapkan, tetapi sangat jelek. Kami meminta bantuan yang hebat systemd dengan “tujuan” dan “tugas” serta “ketergantungan”nya.

Salin file layanan distribusi ke /etc/systemd/system/hostapd.service:

# cp -fv /usr/lib/systemd/system/hostapd.service /etc/systemd/system

dan kurangi isinya menjadi bentuk berikut:

[Unit]
Description=Hostapd IEEE 802.11 AP, IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator
After=sys-subsystem-net-devices-wl0.device
BindsTo=sys-subsystem-net-devices-wl0.device

[Service]
Type=forking
PIDFile=/run/hostapd.pid
ExecStart=/usr/sbin/hostapd /etc/hostapd/hostapd.conf -P /run/hostapd.pid -B

[Install]
WantedBy=sys-subsystem-net-devices-wl0.device

Keajaiban file layanan yang diperbarui terletak pada pengikatan dinamis hostapd ke target baru - antarmuka wl0. Ketika antarmuka muncul, daemon dimulai; ketika menghilang, daemon berhenti. Dan ini semua online - tanpa me-reboot sistem. Teknik ini akan sangat berguna saat menghubungkan adaptor USB Wi-Fi ke Raspberry.

Sekarang kamu bisa:

# systemctl enable hostapd
# reboot

7. IPTABLES

"Apa???" © Ya, ya! Tidak ada systemd. Tidak ada kombinasi bermodel baru (dalam bentuk firewalld), yang akhirnya melakukan hal yang sama.

Mari kita gunakan yang lama yang bagus iptables, yang layanannya, setelah dimulai, akan memuat aturan jaringan ke dalam kernel dan dimatikan secara diam-diam tanpa sisa penduduk dan tanpa menghabiskan sumber daya. systemd memiliki tampilan yang elegan IPMasquerade=, namun kami akan tetap mempercayakan terjemahan alamat (NAT) dan firewall ke iptables.

Install:

# yum install iptables-services
# systemctl enable iptables ip6tables

Saya lebih suka menyimpan konfigurasi iptables sebagai skrip (contoh):

#!/bin/bash

#
# Disable IPv6
#
ip6tables --flush
ip6tables --delete-chain

ip6tables --policy INPUT   DROP
ip6tables --policy FORWARD DROP
ip6tables --policy OUTPUT  DROP

ip6tables-save > /etc/sysconfig/ip6tables
systemctl restart ip6tables

#
# Cleaning
#
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

#
# Loopback, lan
#
iptables -A INPUT -i lo  -j ACCEPT
iptables -A INPUT -i lan -j ACCEPT

#
# Ping, Established
#
iptables -A INPUT -p icmp  --icmp-type echo-request    -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#
# NAT
#
iptables -t nat -A POSTROUTING -o wan -j MASQUERADE

#
# Saving
#
iptables-save > /etc/sysconfig/iptables
systemctl restart iptables

Kami menjalankan skrip di atas dan kehilangan kemampuan untuk membuat koneksi SSH kabel baru dengan Raspberry. Itu benar, kami telah membuat router Wi-Fi, yang aksesnya "melalui Internet" dilarang secara default - sekarang hanya "melalui udara". Kami menghubungkan kabel Ethernet penyedia dan mulai berselancar!

8. Bonusnya: +2,4GHz

Ketika saya merakit router Raspberry pertama menggunakan gambar yang dijelaskan di atas, saya menemukan sejumlah gadget di rumah saya yang, karena keterbatasan desain Wi-Fi, tidak dapat melihat “raspberry” sama sekali. Mengonfigurasi ulang router agar berfungsi di 802.11b/g/n tidaklah sportif, karena kecepatan maksimum "over the air" dalam hal ini tidak melebihi 40 Mbit, dan penyedia Internet favorit saya menawarkan saya 100 (melalui kabel).

Faktanya, solusi untuk masalah ini telah ditemukan: antarmuka Wi-Fi kedua yang beroperasi pada frekuensi 2,4 GHz, dan titik akses kedua. Di kios terdekat, saya tidak membeli yang pertama, tetapi “peluit” Wi-Fi USB kedua yang saya temukan. Penjual tersiksa oleh pertanyaan tentang chipset, kompatibilitas dengan kernel ARM Linux dan kemampuan untuk bekerja dalam mode AP (dialah yang pertama memulai).

Kami mengonfigurasi "peluit" dengan analogi dengan adaptor Wi-Fi bawaan.

Pertama, mari kita ganti namanya menjadi wl1:

# cat /sys/class/net/wlan0/address 
b0:6e:bf:xx:xx:xx

/etc/systemd/network/wl1.link:

[Match]
MACAddress=b0:6e:bf:xx:xx:xx

[Link]
Name=wl1

Kami akan mempercayakan pengelolaan antarmuka Wi-Fi baru ke daemon hostapd terpisah, yang akan mulai dan berhenti tergantung pada keberadaan "peluit" yang ditentukan secara ketat dalam sistem: wl1.

Berkas konfigurasi /etc/hostapd/hostapd2.conf:

ssid=rpi2
wpa_passphrase=1234567890

#channel=1
#channel=6
channel=11

interface=wl1
bridge=lan

driver=nl80211

auth_algs=1
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

macaddr_acl=0

hw_mode=g
wmm_enabled=1

# N
ieee80211n=1
require_ht=1
ht_capab=[HT40][SHORT-GI-20][SHORT-GI-40][DSSS_CCK-40]

Isi file ini secara langsung bergantung pada model adaptor USB Wi-Fi, jadi penyalinan/penempelan biasa mungkin akan membuat Anda gagal.

Salin file layanan distribusi ke /etc/systemd/system/hostapd2.service:

# cp -fv /usr/lib/systemd/system/hostapd.service /etc/systemd/system/hostapd2.service

dan kurangi isinya menjadi bentuk berikut:

[Unit]
Description=Hostapd IEEE 802.11 AP, IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator
After=sys-subsystem-net-devices-wl1.device
BindsTo=sys-subsystem-net-devices-wl1.device

[Service]
Type=forking
PIDFile=/run/hostapd2.pid
ExecStart=/usr/sbin/hostapd /etc/hostapd/hostapd2.conf -P /run/hostapd2.pid -B

[Install]
WantedBy=sys-subsystem-net-devices-wl1.device

Yang tersisa hanyalah mengaktifkan instance hostapd baru:

# systemctl enable hostapd2

Itu saja! Tarik “peluit” dan “raspberry” itu sendiri, lihat jaringan nirkabel di sekitar Anda.

Dan terakhir, saya ingin memperingatkan Anda tentang kualitas adaptor USB Wi-Fi dan catu daya Raspberry. Sambungan “peluit panas” terkadang dapat menyebabkan “raspberry beku” karena masalah listrik jangka pendek.

Sumber: www.habr.com

Tambah komentar