В цьому циклі статей я буду освітлювати проблеми з якими я особисто зіткнувся при роботі з Raspberry Pi. Я - закоренілий "віноузятник". За майже 20 років своєї професійної кар'єри, я в основному працював з операційною системою Windows. Подеколи мені доводилося стикатися з певними задачами під Linux, але повного розуміння як влаштована ця ОС в мене немає. (Хоча кого я обманюю - в мене немає повного розуміння і про те, як влаштована Windows OS).

Отже моє знайомство з Raspberry - це по суті мандрівка до іншого світу в якому для мене багато незрозумілого. Свій досвід я буду описувати тут. Можливо він стане в нагоді іншим мандрівникам.

Суть проблеми

Якщо на Raspberry OS ви спробуєте відкрити TCP порт з номером менже ніж 1024 без root, то вам це не вдасться.

Рішення

Взято з наступного джерела
https://man7.org/linux/man-pages/man7/capabilities.7.html

Треба виконати команду
sudo setcap cap_net_bind_service=ep [app-path]
Після цього программа буде працювати без root з повним діапазоном портів.

Вступ

Вхідні дані:

Операційна система: Raspberry PI OS 11 Bullseye 64 bit

Суть проблеми:

Коли мені вперше вдалося запустити Raspberry OS на моїй Raspberry PI 4, то до мережі я підключився через Wi-Fi і з цим не було жодних проблем. Але якось у мене виникла потреба підключитися своїм ноутбуком до Raspberry Pi по ethernet прямим кабелем. І тут на мене очікувала несподіванка. Добитися зв'язку виявилося непросто.

В пошуках рішення.

Ітак, Підключив я свій ноутбук до Raspberry Pі ethernet кабелем. На моєму ноутбуці немає DHCP сервера, а для Ethernet інтерфейсу прописана статична адреса. Отже на Raspberry Pi мені також треба прописати статичну адресу для мережевого адаптеру eth0.

Пошук у Google швидко дає підказку як це зробити.

На верхній панелі в правому куті треба клацнути правою кнопкою миші по іконці, якою зазвичай позначають бездротові мережі. І обрати пункт меню "Wireless & Wired Network Settings" (Налаштування бездротових і дротових мереж.

SettingEth0 0

З'явится вікно з налаштуваннями мережі (Network Preferences). У полі Configure треба вибрати опцію interface, а потім сам інтерфейс eth0. Тепер тут можна прописати статичну IP-адресу.

В мене запис виглядає наступним чином: 192.168.77.214/24, що означає статичну IP-адресу 192.168.77.214 і маску підмережі 255.255.255.0

SettingEth0 1

Перевіряємо налаштування через утиліту ifconfig

ifconfig up

Як бачимо, у інтерфейса eth0 встановилася потрібна мені IP-адреса.

І начебто це перемога! Але будь-які спроби підключитися з ноутбука до Raspberry Pi або в зворотньому напрямку зазнавали невдачі.

Я пробував міняти Ethernet-кабель. Причому пробував як прямий так і перехресний кабель. Змін ніяких. Тоді включив сніфер подивитися, чи йдуть взагалі якісь пакети. І дійсно Raspberry Pi видавав DHCP пакети, але більше ніяких. Складалося враження, що система не пропускає інші пакети у канал.

Почитавши трохи книжок про мережеві інтерфейси Linux мені спало на думку перевірити таблицю маршрутизації. Ввів команду route -n і побачив, що запису для інтерфейсу eth0 в таблиці немає

route n 

Тоді я додав новий запис командою sudo route add -net 192.168.77.0 netmask 255.255.255.0 dev eth0.

Таблиця набула вигляду:

routeEth

Обмін через Ethernet також успішно пішов.

Але залишалася проблема, що після перезапуска системи запис для Ethernet інтерфейсу з таблиці маршрутизації зникає і його треба вводити заново. Отже треба десь автоматизувати цей процес.

Трохи поблукавши по невірних напрямках, я таки знайшов рішення. Мені було трохи дивно, але для цього можна використати хук-скрипт для DHCP кліента dhcpcd. Його розташування /etc/dhcpcd.exit-hook. Він виклається в тому числі при події підключення мережевого інтерфейсу. На моїй машині цього скрипта не було, то ж я створив новий з наступним змістом:

#!/bin/bash

# adding the record to route table when eth0 interface is up
if [ "${interface}" = "eth0" ] && [ "${reason}" = "CARRIER" ]; then
   sudo route add -net 192.168.77.0 netmask 255.255.255.0 dev eth0
fi

Зміст скрипта досить очевидний: коли для інтерфейсу eth0 виникає подія CARRIER тобто підключення, то виконується додавання необхідного запису у таблицю маршрутизації.

Таким чином проблему було вирішено.