Raspberry Pi + CentOS = Wi-Fi Hotspot (หรือเราเตอร์ราสเบอร์รี่ที่มีหมวกสีแดง)

มีข้อมูลจำนวนมากบนอินเทอร์เน็ตเกี่ยวกับการสร้างจุดเชื่อมต่อ Wi-Fi โดยใช้พีซีบอร์ดเดี่ยว Raspberry ตามกฎแล้ว นี่หมายถึงการใช้ระบบปฏิบัติการ Raspbian ดั้งเดิมของ Raspberry

เนื่องจากฉันเป็นผู้ยึดมั่นในระบบที่ใช้ RPM ฉันจึงไม่สามารถผ่านปาฏิหาริย์เล็กๆ น้อยๆ นี้ไปได้ และไม่ได้ลองใช้ CentOS อันเป็นที่รักของฉันกับมัน

บทความนี้ให้คำแนะนำในการสร้างเราเตอร์ Wi-Fi 5GHz/AC จาก Raspberry Pi 3 รุ่น B+ ที่ใช้ระบบปฏิบัติการ CentOS จะมีเทคนิคมาตรฐานหลายประการแต่ไม่ค่อยมีใครรู้จัก และเป็นโบนัส - ภาพวาดสำหรับเชื่อมต่ออุปกรณ์ Wi-Fi เพิ่มเติมกับ Raspberry ทำให้สามารถทำงานพร้อมกันในหลายโหมด (2,4+5GHz)

Raspberry Pi + CentOS = Wi-Fi Hotspot (หรือเราเตอร์ราสเบอร์รี่ที่มีหมวกสีแดง)
(ผสมรูปภาพที่มีให้ฟรี)

ให้เราทราบทันทีว่าความเร็วจักรวาลบางอย่างจะไม่ทำงาน ฉันบีบความเร็วสูงสุด 100 Mbps จาก Raspberry ทางอากาศ และครอบคลุมความเร็วของผู้ให้บริการอินเทอร์เน็ตของฉันด้วย ทำไมคุณถึงต้องการ AC ที่เชื่องช้าถ้าในทางทฤษฎีคุณสามารถได้รับครึ่งกิกะบิตแม้กระทั่งบน N? หากคุณถามตัวเองด้วยคำถามนี้ ให้ไปที่ร้านเพื่อซื้อเราเตอร์จริงที่มีเสาอากาศภายนอกแปดเสา

0. สิ่งที่คุณต้องการ

  • จริงๆ แล้ว "ผลิตภัณฑ์ราสเบอร์รี่" นั้นมีความสามารถ: Pi 3 Model B+ (เพื่อให้ได้ความเร็วและช่องสัญญาณ 5GHz อันเป็นที่ปรารถนา);
  • microSD ที่ดี >= 4GB;
  • เวิร์กสเตชันพร้อมเครื่องอ่าน/เขียน Linux และ microSD;
  • มีทักษะเพียงพอใน Linux บทความนี้มีไว้สำหรับ Geek ที่ผ่านการฝึกอบรม
  • การเชื่อมต่อเครือข่ายแบบใช้สาย (eth0) ระหว่าง Raspberry และ Linux ใช้งานเซิร์ฟเวอร์ DHCP บนเครือข่ายท้องถิ่นและการเข้าถึงอินเทอร์เน็ตจากอุปกรณ์ทั้งสอง

ความเห็นเล็กๆ น้อยๆ ในประเด็นสุดท้าย “อะไรเกิดก่อน ไข่ หรือ...” จะสร้างเราเตอร์ Wi-Fi ได้อย่างไรหากไม่มีอุปกรณ์เชื่อมต่ออินเทอร์เน็ต ปล่อยให้แบบฝึกหัดที่สนุกสนานนี้อยู่นอกขอบเขตของบทความและสมมติว่า Raspberry เชื่อมต่อกับเครือข่ายท้องถิ่นด้วยสายและสามารถเข้าถึงอินเทอร์เน็ตได้ ในกรณีนี้เราไม่จำเป็นต้องมีทีวีเพิ่มเติมและเครื่องมือจัดการในการตั้งค่า "ราสเบอร์รี่"

1. ติดตั้ง CentOS

หน้าแรกของโครงการ

ในขณะที่เขียนบทความนี้ CentOS เวอร์ชันที่ทำงานอยู่ในอุปกรณ์คือ 32 บิต ที่ไหนสักแห่งบนเวิลด์ไวด์เว็บ ฉันพบความคิดเห็นว่าประสิทธิภาพของระบบปฏิบัติการดังกล่าวบนสถาปัตยกรรม ARM 64 บิตนั้นลดลงมากถึง 20% ฉันจะออกจากช่วงเวลานี้โดยไม่มีความคิดเห็น

บน Linux ให้ดาวน์โหลดอิมเมจขั้นต่ำด้วยเคอร์เนล "-ราสเบอร์รี่PI-"และเขียนลงใน microSD:

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

ก่อนที่จะเริ่มใช้อิมเมจ เราจะลบพาร์ติชั่น SWAP ออกจากมัน ขยายรูทเป็นโวลุ่มที่มีอยู่ทั้งหมด และกำจัด SELinux อัลกอริทึมนั้นง่าย: ทำสำเนารูทบน Linux ลบพาร์ติชั่นทั้งหมดออกจาก microSD ยกเว้นอันแรก (/บูต) สร้างรูทใหม่และส่งคืนเนื้อหาจากสำเนา

ตัวอย่างของการดำเนินการที่จำเป็น (เอาต์พุตคอนโซลที่รุนแรง)

# 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

หลังจากคลายแพ็กเนื้อหาของพาร์ติชั่นรูทแล้วก็ถึงเวลาทำการเปลี่ยนแปลงบางอย่าง

ปิดการใช้งาน SELinux ใน /mnt/etc/selinux/config.php:

SELINUX=disabled

การแก้ไข /mnt/etc/fstabเหลือเพียงสองรายการเกี่ยวกับพาร์ติชัน: boot (/boot ไม่มีการเปลี่ยนแปลง) และ root (เราเปลี่ยนค่า UUID ซึ่งสามารถพบได้โดยการศึกษาผลลัพธ์ของคำสั่ง blkid บน Linux):

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

ในที่สุด เราเปลี่ยนพารามิเตอร์การบูตเคอร์เนล: เราระบุตำแหน่งใหม่สำหรับพาร์ติชันรูท ปิดใช้งานเอาต์พุตของข้อมูลการดีบัก และ (เป็นทางเลือก) ห้ามมิให้เคอร์เนลกำหนดที่อยู่ IPv6 บนอินเทอร์เฟซเครือข่าย:

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

นี่คือเนื้อหา /mnt/cmdline.txt ในรูปแบบต่อไปนี้ (หนึ่งบรรทัดโดยไม่มียัติภังค์):

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

เสร็จสิ้น:

# cd
# umount /mnt
# sync

เราจัดเรียง microSD ใหม่ใน "raspberry" เปิดใช้งานและเข้าถึงเครือข่ายผ่าน ssh (root/centos)

2. การตั้งค่า CentOS

การเคลื่อนไหวที่ไม่สั่นคลอนสามครั้งแรก: passwd, yum -y update, รีบูต.

เราแจกการจัดการเครือข่าย เครือข่ายd:

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

สร้างไฟล์ (ร่วมกับไดเร็กทอรี) /etc/systemd/network/eth0.network:

[Match]
Name=eth0

[Network]
DHCP=ipv4

เรารีบูต "ราสเบอร์รี่" และเข้าถึงเครือข่ายอีกครั้งผ่าน ssh (ที่อยู่ IP อาจเปลี่ยนแปลงได้) ใส่ใจกับสิ่งที่ใช้ / etc / resolv.confสร้างก่อนหน้านี้โดย Network Manager ดังนั้นหากมีปัญหาในการแก้ไขให้แก้ไขเนื้อหา ใช้ systemd- แก้ไข พวกเราจะไม่.

เราลบสิ่งที่ "ไม่จำเป็น" ซ่อมแซมและเพิ่มความเร็วในการโหลดระบบปฏิบัติการ:

# 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

ใครต้องการ cron และใครไม่แยกแยะบิวท์อิน ตัวจับเวลา systemdสามารถสร้างสิ่งที่ขาดหายไปได้ / var / log- และมองผ่าน journalctl. หากคุณต้องการประวัติบันทึก (ตามค่าเริ่มต้น ข้อมูลจะถูกจัดเก็บตั้งแต่ช่วงเวลาที่ระบบเริ่มทำงานเท่านั้น):

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

ปิดการใช้งาน IPv6 โดยบริการพื้นฐาน (หากจำเป็น)/ etc / SSH / sshd_config:

AddressFamily inet

/etc/sysconfig/chronyd.conf:

OPTIONS="-4"

ความเกี่ยวข้องของเวลากับ “ราสเบอร์รี่” เป็นสิ่งสำคัญ เนื่องจากเมื่อนำออกจากกล่องฮาร์ดแวร์จึงไม่มีความสามารถในการบันทึกสถานะปัจจุบันของนาฬิกาเมื่อรีบูต จึงจำเป็นต้องมีการซิงโครไนซ์ ดีมอนที่ดีและรวดเร็วมากสำหรับสิ่งนี้คือ chrony - ติดตั้งแล้วและเริ่มโดยอัตโนมัติ คุณสามารถเปลี่ยนเซิร์ฟเวอร์ NTP เป็นเซิร์ฟเวอร์ที่ใกล้ที่สุดได้

/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

เราจะใช้การตั้งค่าเขตเวลา เล่ห์เหลี่ยม. เนื่องจากเป้าหมายของเราคือการสร้างเราเตอร์ Wi-Fi ที่ทำงานที่ความถี่ 5GHz เราจะเตรียมรับมือกับเรื่องเซอร์ไพรส์ล่วงหน้า หน่วยงานกำกับดูแล:

# ยำข้อมูล crda
สรุป: daemon การปฏิบัติตามกฎระเบียบสำหรับเครือข่ายไร้สาย 802.11

การออกแบบที่ชั่วร้ายนี้ซึ่งขึ้นอยู่กับเขตเวลานั้น "ห้าม" การใช้ (ในรัสเซีย) ความถี่ 5GHz และช่องสัญญาณที่มีตัวเลข "สูง" เคล็ดลับคือการตั้งค่าเขตเวลาโดยไม่ใช้ชื่อทวีป/เมือง กล่าวคือ แทน:

# timedatectl set-timezone Europe/Moscow

เรากด:

# timedatectl set-timezone Etc/GMT-3

และสัมผัสสุดท้ายกับทรงผมของระบบ:

# 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. ส่วนเสริม CentOS

ทุกสิ่งที่กล่าวไว้ข้างต้นถือเป็นคำแนะนำที่สมบูรณ์สำหรับการติดตั้ง CentOS “วานิลลา” บน Raspberry Pi คุณควรจะได้พีซีที่ (รี) บูตได้ในเวลาน้อยกว่า 10 วินาที ใช้ RAM น้อยกว่า 15 เมกะไบต์ และ microSD ขนาด 1.5 กิกะไบต์ (จริงๆ แล้วน้อยกว่า 1 กิกะไบต์เนื่องจากการ /บูตไม่สมบูรณ์ แต่ขอบอกตามตรง)

หากต้องการติดตั้งซอฟต์แวร์จุดเข้าใช้งาน Wi-Fi บนระบบนี้ คุณจะต้องขยายขีดความสามารถของการกระจาย CentOS มาตรฐานเล็กน้อย ก่อนอื่น มาอัพเกรดไดรเวอร์ (เฟิร์มแวร์) ของอแด็ปเตอร์ Wi-Fi ในตัวกัน หน้าแรกของโครงการบอกว่า:

Wifi บน Raspberry 3B และ 3B+

ไฟล์เฟิร์มแวร์ Raspberry PI 3B/3B+ ไม่ได้รับอนุญาตให้เผยแพร่โดยโครงการ CentOS คุณสามารถใช้บทความต่อไปนี้เพื่อทำความเข้าใจปัญหา รับเฟิร์มแวร์ และตั้งค่า wifi

สิ่งที่ต้องห้ามสำหรับโครงการ CentOS ไม่ใช่สิ่งต้องห้ามสำหรับเราเพื่อการใช้งานส่วนตัว เราแทนที่เฟิร์มแวร์ Wi-Fi แบบกระจายใน CentOS ด้วยเฟิร์มแวร์ที่เกี่ยวข้องจากนักพัฒนา Broadcom (Blobs ไบนารีที่เกลียดแบบเดียวกันเหล่านั้น...) โดยเฉพาะอย่างยิ่งสิ่งนี้จะช่วยให้คุณใช้ AC ในโหมดจุดเข้าใช้งาน

อัปเกรดเฟิร์มแวร์ Wi-Fiค้นหารุ่นอุปกรณ์และเวอร์ชันเฟิร์มแวร์ปัจจุบัน:

# 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 

เราเห็นว่าเฟิร์มแวร์เวอร์ชัน 7.45.18 ลงวันที่ 01.03.2015/XNUMX/XNUMX และจำชุดตัวเลขต่อไปนี้: 43455 (brcmfmac43455-sdio.bin)

ดาวน์โหลดภาพ Raspbian ปัจจุบัน. คนขี้เกียจสามารถเขียนภาพลงใน microSD และนำไฟล์ที่มีเฟิร์มแวร์จากที่นั่น หรือคุณสามารถเมานต์พาร์ติชันรูทของอิมเมจใน Linux และคัดลอกสิ่งที่คุณต้องการจากที่นั่น:

# 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

ไฟล์เฟิร์มแวร์ของอะแดปเตอร์ Wi-Fi ที่ได้จะต้องถูกคัดลอกและแทนที่ด้วย "ราสเบอร์รี่" ลงในไดเร็กทอรี /usr/lib/เฟิร์มแวร์/brcm/

เรารีบูทเราเตอร์ในอนาคตและยิ้มอย่างพึงพอใจ:

# 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 

เวอร์ชัน: 7.45.154 ลงวันที่ 27.02.2018/XNUMX/XNUMX

และแน่นอน 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. การกำหนดค่าเครือข่ายและความท้าทายที่รออยู่ข้างหน้า

ตามที่เราตกลงไว้ข้างต้น "ราสเบอร์รี่" เชื่อมต่อกันด้วย "สาย" กับเครือข่ายท้องถิ่น สมมติว่าผู้ให้บริการให้การเข้าถึงอินเทอร์เน็ตในลักษณะเดียวกันทุกประการ: ที่อยู่ในเครือข่ายสาธารณะออกแบบไดนามิกโดยเซิร์ฟเวอร์ DHCP (อาจมีการรวม MAC) ในกรณีนี้ หลังจากการตั้งค่าราสเบอร์รี่ครั้งสุดท้าย คุณเพียงแค่ต้อง "เสียบ" สายเคเบิลของผู้ให้บริการเข้ากับมัน เท่านี้ก็เสร็จเรียบร้อย การอนุญาตโดยใช้ systemd-เครือข่าย - หัวข้อของบทความแยกต่างหากและไม่ได้กล่าวถึงที่นี่

อินเทอร์เฟซ Wi-Fi ของ Raspberry เป็นเครือข่ายท้องถิ่น และอะแดปเตอร์อีเทอร์เน็ตในตัว (eth0) เป็นแบบภายนอก เรามากำหนดหมายเลขเครือข่ายท้องถิ่นแบบคงที่ เช่น 192.168.0.0/24 ที่อยู่ราสเบอร์รี่: 192.168.0.1. เซิร์ฟเวอร์ DHCP จะทำงานบนเครือข่ายภายนอก (อินเทอร์เน็ต)

ปัญหาความสอดคล้องของการตั้งชื่อ и โปรแกรมเมอร์ชื่อดังชาวกัวเตมาลา - ปัญหาสองประการที่รอใครก็ตามที่กำหนดค่าอินเทอร์เฟซเครือข่ายและบริการในการแจกแจง systemd

ความสับสนวุ่นวายแบบขนาน (การพูดนอกเรื่องโคลงสั้น ๆ )Lennart Pottering ได้รวบรวมโปรแกรมของตัวเอง systemd ดีมาก. นี้ systemd เปิดตัวโปรแกรมอื่น ๆ อย่างรวดเร็วจนไม่มีเวลาฟื้นตัวจากการเป่านกหวีดของผู้ตัดสินสะดุดและล้มลงตั้งแต่เริ่มต้นโดยไม่ได้เริ่มเส้นทางอุปสรรค

แต่อย่างจริงจังแล้ว กระบวนการที่เรียกใช้งานแบบขนานเชิงรุกในช่วงเริ่มต้นของ systemd OS นั้นเป็น "สะพานลา" สำหรับผู้เชี่ยวชาญ LSB ตามลำดับที่ช่ำชอง โชคดีที่การนำความสงบมาสู่ "ความสับสนวุ่นวายคู่ขนาน" นี้กลายเป็นเรื่องง่าย แม้ว่าจะไม่ชัดเจนเสมอไปก็ตาม

เราสร้างอินเทอร์เฟซบริดจ์เสมือนสองรายการด้วยชื่อคงที่: แลน и ขาวซีด. เราจะ "เชื่อมต่อ" อะแดปเตอร์ Wi-Fi เข้ากับอันแรกและ eth0 "ราสเบอร์รี่" กับอันที่สอง

/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=ใช่ ไม่จำเป็นต้องบอกใบ้เคอร์เนลผ่าน sysctl เพื่อเปิดใช้งานการกำหนดเส้นทาง
ที่อยู่ MAC= ยกเลิกการแสดงความคิดเห็นและเปลี่ยนแปลงหากจำเป็น

ก่อนอื่นเรา "เชื่อมต่อ" eth0 เราจำ "ปัญหาความสม่ำเสมอ" และใช้เฉพาะที่อยู่ MAC ของอินเทอร์เฟซนี้ซึ่งสามารถพบได้ดังนี้:

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

เราสร้าง /etc/systemd/network/eth.network:

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

[Network]
Bridge=wan

เราลบไฟล์การกำหนดค่าก่อนหน้า eth0 รีบูท Raspberry และเข้าถึงเครือข่าย (ที่อยู่ IP มักจะมีการเปลี่ยนแปลง):

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

5.DNSMASQ

สำหรับการสร้างจุดเข้าใช้งาน Wi-Fi ไม่มีอะไรจะดีไปกว่าสองสามอย่างที่ยอดเยี่ยม DNSMAQ + hostapd ยังไม่ได้คิดออก ในความเห็นของฉัน.

เผื่อใครลืมแล้ว...hostapd - นี่คือสิ่งที่ควบคุมอแด็ปเตอร์ Wi-Fi (โดยเฉพาะจะดูแลการเชื่อมต่ออะแดปเตอร์เหล่านั้นกับเสมือน แลน "raspberries") อนุญาตและลงทะเบียนไคลเอนต์ไร้สาย

DNSMAQ — กำหนดค่าสแต็กเครือข่ายของไคลเอนต์: ออกที่อยู่ IP, เซิร์ฟเวอร์ DNS, เกตเวย์เริ่มต้นและความสุขที่คล้ายกัน

เริ่มจาก dnsmasq กันก่อน:

# yum install dnsmasq

แบบ / 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

แก้ไขตามที่คุณต้องการ

มินิมอล /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

“เวทย์มนตร์” ที่นี่อยู่ในพารามิเตอร์ ผูกแบบไดนามิกซึ่งบอกให้ dnsmasq daemon รอจนกว่าจะปรากฏบนระบบ อินเตอร์เฟซ=แลนและไม่ท้อถอยจากความเหงาอันภาคภูมิใจหลังจากเริ่มต้น

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

6. โฮสต้าพีดี

และสุดท้ายคือการกำหนดค่า magic hostapd ฉันไม่สงสัยเลยว่ามีคนอ่านบทความนี้เพื่อค้นหาข้อความอันล้ำค่าเหล่านี้

ก่อนที่จะติดตั้ง hostapd คุณต้องเอาชนะ "ปัญหาความสม่ำเสมอ" ก่อน อะแดปเตอร์ Wi-Fi ในตัว wlan0 สามารถเปลี่ยนชื่อเป็น wlan1 ได้อย่างง่ายดายเมื่อเชื่อมต่ออุปกรณ์ USB Wi-Fi เพิ่มเติม ดังนั้นเราจะแก้ไขชื่ออินเทอร์เฟซด้วยวิธีต่อไปนี้: เราจะสร้างชื่อเฉพาะสำหรับอะแดปเตอร์ (ไร้สาย) และผูกไว้กับที่อยู่ MAC

สำหรับอแด็ปเตอร์ Wi-Fi ในตัวซึ่งยังคงเป็น wlan0:

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

เราสร้าง /etc/systemd/network/wl0.link:

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

[Link]
Name=wl0

ตอนนี้เราจะแน่ใจว่า wl0 - นี่คือ Wi-Fi ในตัว เรารีบูท Raspberry เพื่อให้แน่ใจว่าสิ่งนี้

ติดตั้ง:

# yum install hostapd wireless-tools

ไฟล์การกำหนดค่า /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

โดยไม่ลืมเลยแม้แต่วินาทีเดียว คณะกรรมการภาวะฉุกเฉินแห่งรัฐเปลี่ยนพารามิเตอร์ที่เราต้องการและตรวจสอบการทำงานด้วยตนเอง:

# hostapd /etc/hostapd/hostapd.conf

hostapd จะเริ่มในโหมดโต้ตอบ โดยถ่ายทอดสถานะไปยังคอนโซล หากไม่มีข้อผิดพลาด ไคลเอนต์ที่รองรับโหมด AC จะสามารถเชื่อมต่อกับจุดเข้าใช้งานได้ หากต้องการหยุด hostapd - Ctrl-C

สิ่งที่เหลืออยู่คือการเปิดใช้งาน hostapd ในการเริ่มต้นระบบ หากคุณทำสิ่งมาตรฐาน (systemctl เปิดใช้งาน hostapd) หลังจากรีบูตครั้งถัดไปคุณจะได้รับปีศาจ "กลิ้งอยู่ในเลือด" พร้อมการวินิจฉัย "ไม่พบอินเทอร์เฟซ wl0". ผลจาก "ความสับสนวุ่นวายแบบขนาน" hostapd เริ่มทำงานเร็วกว่าเคอร์เนลที่พบอแด็ปเตอร์ไร้สาย

อินเทอร์เน็ตเต็มไปด้วยวิธีแก้ไข: จากการบังคับหมดเวลาก่อนที่จะเริ่ม daemon (หลายนาที) ไปจนถึง daemon อื่นที่ตรวจสอบลักษณะที่ปรากฏของอินเทอร์เฟซและ (ใหม่) รีสตาร์ทโฮสต์แพด วิธีแก้ปัญหาค่อนข้างใช้การได้ แต่น่าเกลียดมาก เราร้องขอความช่วยเหลือจากผู้ยิ่งใหญ่ systemd ด้วย "เป้าหมาย" และ "งาน" และ "การพึ่งพา"

คัดลอกไฟล์บริการการจัดจำหน่ายไปที่ /etc/systemd/system/hostapd.service:

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

และลดเนื้อหาให้เหลือรูปแบบดังนี้

[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

ความมหัศจรรย์ของไฟล์บริการที่อัปเดตอยู่ที่การเชื่อมโยงแบบไดนามิกของ hostapd กับเป้าหมายใหม่ - อินเทอร์เฟซ wl0 เมื่ออินเทอร์เฟซปรากฏขึ้น daemon จะเริ่มทำงาน แต่เมื่อหายไปก็หยุด และทั้งหมดนี้ออนไลน์โดยไม่ต้องรีบูตระบบ เทคนิคนี้จะมีประโยชน์อย่างยิ่งเมื่อเชื่อมต่ออะแดปเตอร์ USB Wi-Fi เข้ากับ Raspberry

ตอนนี้คุณสามารถ:

# systemctl enable hostapd
# reboot

7. ไอพีเทเบิล

“อะไรนะ???” © ใช่ ใช่! ไม่มี systemd. ไม่มีการรวมแบบใหม่ (ในรูปแบบ firewalld) ซึ่งท้ายที่สุดก็ทำสิ่งเดียวกัน

มาใช้ตัวเก่าดีๆ กันดีกว่า iptablesซึ่งบริการหลังจากเริ่มต้นจะโหลดกฎเครือข่ายลงในเคอร์เนลและปิดตัวลงอย่างเงียบ ๆ โดยไม่ต้องมีถิ่นที่อยู่เหลืออยู่และไม่เปลืองทรัพยากร systemd มีความสง่างาม IPMasquerade=แต่เราจะยังคงไว้วางใจการแปลที่อยู่ (NAT) และไฟร์วอลล์ให้กับ iptables

ติดตั้ง:

# yum install iptables-services
# systemctl enable iptables ip6tables

ฉันต้องการจัดเก็บการกำหนดค่า iptables เป็นสคริปต์ (ตัวอย่าง):

#!/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

เรารันสคริปต์ข้างต้นและสูญเสียความสามารถในการสร้างการเชื่อมต่อ SSH แบบมีสายใหม่กับ Raspberry ถูกต้องเราได้สร้างเราเตอร์ Wi-Fi ซึ่งห้ามการเข้าถึง "ผ่านอินเทอร์เน็ต" ตามค่าเริ่มต้น - ตอนนี้มีเพียง "ทางอากาศ" เท่านั้น เราเชื่อมต่อสายอีเทอร์เน็ตของผู้ให้บริการและเริ่มท่องเว็บ!

8. โบนัส: +2,4GHz

เมื่อฉันประกอบเราเตอร์ Raspberry ตัวแรกโดยใช้ภาพวาดที่อธิบายไว้ข้างต้น ฉันค้นพบอุปกรณ์จำนวนหนึ่งในบ้านของฉัน ซึ่งเนื่องจากข้อจำกัดในการออกแบบ Wi-Fi จึงไม่สามารถมองเห็น "ราสเบอร์รี่" ได้เลย การกำหนดค่าเราเตอร์ใหม่ให้ทำงานใน 802.11b/g/n นั้นไม่มีความสปอร์ต เนื่องจากความเร็วสูงสุด "ผ่านอากาศ" ในกรณีนี้คือไม่เกิน 40 Mbit และผู้ให้บริการอินเทอร์เน็ตคนโปรดของฉันเสนอความเร็ว 100 (ผ่านสายเคเบิล) ให้ฉัน

ในความเป็นจริงได้มีการคิดค้นวิธีแก้ไขปัญหาแล้ว: อินเทอร์เฟซ Wi-Fi ตัวที่สองที่ทำงานที่ความถี่ 2,4 GHz และจุดเชื่อมต่อที่สอง ที่แผงขายของใกล้ ๆ ฉันไม่ได้ซื้ออันแรก แต่เป็น "นกหวีด" USB Wi-Fi อันที่สองที่ฉันเจอ ผู้ขายถูกทรมานด้วยคำถามเกี่ยวกับชิปเซ็ตความเข้ากันได้กับเคอร์เนล ARM Linux และความเป็นไปได้ในการทำงานในโหมด AP (เขาเป็นคนแรกที่เริ่ม)

เรากำหนดค่า "นกหวีด" โดยการเปรียบเทียบกับอแด็ปเตอร์ Wi-Fi ในตัว

ก่อนอื่นให้เปลี่ยนชื่อเป็น 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

เราจะมอบความไว้วางใจการจัดการอินเทอร์เฟซ Wi-Fi ใหม่ให้กับ hostapd daemon ที่แยกต่างหาก ซึ่งจะเริ่มต้นและหยุดขึ้นอยู่กับการมีอยู่ของ "นกหวีด" ที่กำหนดไว้อย่างเคร่งครัดในระบบ: wl1

ไฟล์การกำหนดค่า /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]

เนื้อหาของไฟล์นี้ขึ้นอยู่กับรุ่นของอะแดปเตอร์ USB Wi-Fi โดยตรง ดังนั้นการคัดลอก/วางซ้ำๆ อาจล้มเหลว

คัดลอกไฟล์บริการการจัดจำหน่ายไปที่ /etc/systemd/system/hostapd2.service:

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

และลดเนื้อหาให้เหลือรูปแบบดังนี้

[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

สิ่งที่เหลืออยู่คือการเปิดใช้งานอินสแตนซ์ใหม่ของ hostapd:

# systemctl enable hostapd2

นั่นคือทั้งหมด! ดึง "นกหวีด" และ "ราสเบอร์รี่" ออกมาดูเครือข่ายไร้สายรอบตัวคุณ

และสุดท้ายนี้ ฉันต้องการเตือนคุณเกี่ยวกับคุณภาพของอะแดปเตอร์ USB Wi-Fi และแหล่งจ่ายไฟของ Raspberry บางครั้ง "นกหวีดร้อน" ที่เชื่อมต่ออยู่อาจทำให้ "ราสเบอร์รี่ค้าง" เนื่องจากปัญหาทางไฟฟ้าในระยะสั้น

ที่มา: will.com

เพิ่มความคิดเห็น