Содержание
Начальная установка
Для начала скачиваем образ операционной системы Raspbian (версию Lite если не нужен десктоп) по ссылке https://www.raspberrypi.org/downloads/raspbian/ и распаковываем образ из zip архива.
Качаем и устанавливаем программу для записи образа на SD карту Win32DiskImager (в дальнейшем ее же можно использовать для бакапа этой SD карты в файл образа).
Записываем скачанный образ этой программой на SD карту, вставляем ее в слот и загружаемся.
После загрузки жмем Enter и вводим логин pi и пароль raspberry.
Для первоначальной настройки можно использовать консольную программу настройки:
sudo raspi-configЧерез нее можно сразу сменить дефолтный пароль, расширить раздел на весь объем флешки, выставить локаль на ru (после выбора локали будет еще запрос на каком языке выводить сообщения — лучше там выбрать англ. язык, на русском выглядит всё как-то не очень привычно и неудобно), настроить таймзону, включить SSH, если будет используется только через консоль без графической оболочки, то для GPU можно выбрать минимальный размер выделяемой памяти (16Мб).
Ставим сразу для удобства Midnight Commander:
sudo apt-get install mcНастройка IP адреса
Если IP выдается через DCHP, то можно посмотреть какой был выдан адрес через команду
$ ifconfig eth0Можно настроить руками статический IP.
Редактируем файл /etc/dhcpcd.conf
sudo nano /etc/dhcpcd.confищем кусок
# Example static IP configuration:
#interface eth0
#static ip_address=192.168.0.10/24
#static ip6_address=fd51:42f8:caae:d92e::ff/64
#static routers=192.168.0.1
#static domain_name_servers=192.168.0.1 8.8.8.8 fd51:42f8:caae:d92e::1
раскомментируем его и ставим свои ip:
interface eth0
static ip_address=192.168.1.10/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1 8.8.8.8Добавить своего пользователя вместо дефолтного pi
Чтобы усложнить жизнь хакерам лучше вообще грохнуть дефолтного пользователя и завести своего с админскими правами.
Получаем список групп, в которых находится дефолтный пользователь pi
cat /etc/group | grep piДалее создаем себе пользователя с членством в этих же группах
sudo useradd -m -G adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,pi,spi,i2c,gpio new_user_nameУстанавливаем пароль созданному пользователю
sudo passwd new_user_nameПерезагружаем (sudo reboot) и заходим под созданным пользователем, если вход успешен, то грохаем дефолтного пользователя pi:
sudo deluser --remove-all-files piЧтобы не вводить каждый раз пароль при команда с sudo, редактируем файл /etc/sudoers.d/010_pi-nopasswd и меняем там pi на свой логин.
Обновление системы в рамках одной версии Raspbian
Обновляем список пакетов:
sudo apt updateЗатем запускаем обновление всех пакетов, которые нуждаются в обновлении (с приставкой full- обновляет с зависимостями).
sudo apt full-upgradeПри обновлении скачанные пакеты кешируются в папке /var/cache/apt/archives, можно грохнуть кеш, если места на карте не хватает.
sudo apt cleanПолучение информации о системе
# информация о процессоре:
cat /proc/cpuinfo
# информация о памяти:
cat /proc/meminfo
# Информация о памяти:
cat /proc/meminfo
# Информация о разделах карты памяти:
cat /proc/partitions
Версия ОС:
cat /proc/version
Список USB устройств:
lsusbУтилита для получения доп. информации — vcgencmd
# температура процессорного ядра
vcgencmd measure_tempУстановка сервера OpenVPN
Устанавливаем PiVPN
curl -L https://install.pivpn.io | bashпри установке спросит пароль, потом захочет статический ip (если настраивали ранее, то просто соглашаться), выбираем пользователя, которому настроить VPN соединение (пользователей можно будет потом добавить из командной строки
# создать пользователя без пароля:
pivpn -a newadditionaluser nopassпотом установщик будет пугать что без автоматических обновлений (unattended upgrades) будет несекьюрно и предложит их включить, нажимаем Yes.
Потом выбираем какой протокол будем использовать UDP или TCP (наш выбор UDP).
Далее вводим номер порта на котором будет слушать VPN сервер (лучше нестандартный).
Далее выбираем использовать ли лучшую защиту (если у нас клиентские версии openvpn от 2.4), нам старье не нужно, поэтому нажимаем Yes.
После этого выбираем скольки битным шифрованием ECDSA шифровать соединение (256 соответствует 3072 бит RSA), выбираем золотую середину 384 между рекомендуемым размером и размером для параноиков.
Далее выбираем внешний белый IP для соединения снаружи или динамический DNS если белого IP у нас нет.
Затем выбираем провайдера DNS для подключаемых клиентов VPN (есть готовый список или можно забить свой), просто не паримся и выбираем Google, он и так о нас всё знает.
Далее на запрос Custom Search Domain отвечаем No.
На этом установка закончена и будет предложено ребутнуть систему.
Можно прописать в файле /etc/openvpn/server.conf версию протокола, добавив 4.
#proto udp
proto udp4Далее создаем .ovpn файл который включает в себя ключ доступа, и который нужен для vpn клиента:
pivpn addдалее будет запрошено имя пользователя, срок действия сертификата (1080 дней по умолчанию), пароль для ключа, который будет запрашиваться при каждом подключении по VPN (защита на случай если сопрут ключ).
Сгенерированный файл сохраняется в каталоге
/home/Пользователь/ovpns.
Перетаскиваем файл конфигурации на устройство с клиентом и настраиваем на роутере форвардинг порта на внутренний ip raspberry.
Установка MySQL
С MySQL на rasperry облом, вместо него ставится MariaDB
sudo apt install mariadb-serverПосле установки нужно задать пароль для root (по умолчанию он пустой):
sudo mysql -u root -pТакже там на запрос об анонимных пользователях, отвечаем удалить им доступ, отключаем удаленное подключение рутом, удаляем тестовую базу. Вобщем на все вопросы отвечаем Yes.
После этого можно соединяться под рутом с новым паролем
sudo mysql -u root -pМожно создать пользователей и базы:
CREATE DATABASE exampledb;
CREATE USER 'exampleuser'@'localhost' IDENTIFIED BY 'userpassword';
GRANT ALL PRIVILEGES ON exampledb.* TO 'exampleuser'@'localhost';Установка PHP
Ставим апач
sudo apt install apache2Ставим PHP 7.3 (версию можно поменять на свой вкус)
sudo apt install php7.3Ставим нужные библиотеки (если потом ставить всякие пакеты типа phpmyadmin или фронт заббикса, то они сами подтянут необходимые для них библиотеки).
sudo apt install php7.3-curl php7.3-gd php7.3-intl php7.3-mbstring php7.3-mysql php7.3-opcache php7.3-xml php7.3-xmlrpc php7.3-zip php7.3-bcmathПроверяем что php установился (выводим версию php)
php -vНастройки лежат в /etc/php/7.3/
Установка модуля для апача
sudo apt install php libapache2-mod-phpУстановка PHPMyAdmin
sudo apt install phpmyadminПосле установки можно запустить сразу dbconfig-common и ввести пароль для phpMyAdmin, эта штука настроит конфиги сама.
Правим настройки апача
sudo nano /etc/apache2/apache2.confдобавляем в конец строчку
Include /etc/phpmyadmin/apache.confи рестартуем апач
sudo service apache2 restartСтавим Zabbix 4.0
Создаем пользователя и базу для zabbix в MariaDB под рутом:
sudo mysql -u root -p
CREATE DATABASE zabbix;
CREATE USER 'zabbix'@'localhost' IDENTIFIED BY 'userpassword';
GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'localhost';Далее устанавливаем zabbix
sudo wget https://repo.zabbix.com/zabbix/4.0/raspbian/pool/main/z/zabbix-release/zabbix-release_4.0-3+$(lsb_release -sc)_all.deb
sudo dpkg -i zabbix-release_4.0-3+$(lsb_release -sc)_all.deb
sudo apt update
sudo apt -y install zabbix-server-mysql zabbix-frontend-php zabbix-agentИмпортируем схему и данные (вводим пароль от базы zabbix)
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbixРедактируем конфиг:
sudo nano /etc/zabbix/zabbix_server.confДобавляем туда пароль от базы zabbix
DBPassword=парольЧтобы при перезагрузке сервера zabbix не вешал на пол часа систему из-за того MariaDB успела остановиться раньше чем zabbix (в этому случае zabbix будет пытаться долго и упорно сконнектиться с базой) — прописываем в настройках сервиса что требуется mysql:
systemctl edit zabbix-serverВ редакторе прописываем следующие строчки и сохраняем файл:
[Unit]
Wants=mysql.service
After=mysql.serviceСтартуем сервер и агент zabbix и прописываем в автозапуск
sudo systemctl restart zabbix-server zabbix-agent
sudo systemctl enable zabbix-server zabbix-agentДалее настраиваем фронтенд для zabbix, редактируем конфиг zabbix для апача
sudo nano /etc/zabbix/apache.confпрописываем нашу таймзону там где комментарий # php_value date.timezone Europe/Riga и рестартуем апач
# php_value date.timezone Europe/Riga
php_value date.timezone Europe/MoscowВыставляем права на файлы zabbix
sudo find /usr/share/zabbix -type f -exec chmod 664 {} \;
sudo find /usr/share/zabbix -type d -exec chmod 775 {} \;Заходим в веб-морду zabbix http://raspberry-ip/zabbix/ и прописываем настройки zabbix, после завершения входим с дефолтными пользователем и паролем:
Username: Admin
Password: zabbix
Меняем сразу пароль на свой.
Качаем этот архив, распаковываем. Файл userparameter_rpi.conf копируем в папку /etc/zabbix/zabbix_agentd.d , а файл rpi_zabbix_cputemp.xml импортируем в шаблоны zabbix (Настройка-Шаблоны-Импорт). Добавляем импортированный шаблон «Raspberry PI CPU Temperature» — Настройка-Узлы сети-Шаблоны.
Перезапускаем агент:
sudo service zabbix-agent restartУстановка FTP сервера
Ставим proftpd сервер:
sudo apt install proftpdПравим конфиг
sudo nano /etc/proftpd/proftpd.confРаскомментировать строчку, чтобы пользователи не вылазили за домашний каталог
DefaultRoot ~После настройки перезагружаем конфиг
sudo service proftpd reloadУстановка msmtp для отправки почты
sudo apt-get install msmtp msmtp-mta ca-certificates mailutilsСоздаем и редактируем файл конфига
cd /etc
sudo touch msmtprc
sudo nano msmtprcЗаполняем данные от учетной записи нашего почтового сервера (если используем учетку от гугла, то при 2х факторной авторизации нужно получить в аккаунте пароль приложения, если 2х факторной авторизации нет, то нужно включить в аккаунте доступ небезопасным приложениям).
account gmail
host smtp.gmail.com
port 587
logfile /tmp/msmtp.log
tls on
tls_starttls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
auth on
user user@gmail.com
password user_password
from user@gmail.com
account default : gmailПроверяем отправку
echo 'your message' | msmtp destination-email-address@gmail.com
echo 'message' | mail -s "raspi-buster" destination-email-address@gmail.com
echo 'message' | sendmail destination-email-address@gmail.comПодключение жестких дисков
Диски подключаем через USB3.0, через один или два порта. Если диски NTFS нужно поставить пакет (если еще не установлен).
sudo apt-get install ntfs-3gСписок подключенных дисков получаем командой:
sudo fdisk -lСоздаем каталоги, в который будем монтировать наши USB HDD (название можно придумать любое):
sudo mkdir /mnt/hdd1
sudo mkdir /mnt/hdd2Устанавливаем права на запись на эти каталоги (либо другие если нужно ограничить)
sudo chmod 777 /mnt/hdd1
sudo chmod 777 /mnt/hdd2Прописываем в конец файла /etc/fstab команду авто монтирования нашего USB HDD:
sudo nano /etc/fstabНазвания дисков смотрим из команды получения дисков, описанной выше (тип файловой системы указываем тот который присутствует на дисках, в данном случае NTFS).
/dev/sda1 /mnt/hdd1 ntfs-3g defaults,nofail,rw 0 1
/dev/sdb1 /mnt/hdd2 ntfs-3g defaults,nofail,rw 0 1
# если диск в ext-4 то монтируем так
/dev/sdb1 /mnt/hdd2 ext4 defaults,nofail,rw 0 1После этого перезагружаемся и получаем примонтированные диски.
Параметр nofail позволяет загрузиться даже если не удастся примонтировать диск (без него придется проделать шаги, описанные ниже, но есть и отрицательный момент — если диск не примонтируется, а мы будем на него писать — по факту будет литься на нашу SD-карту, причем файлов будет не видно, чтобы их увидеть выполняем команды:
sudo mount --bind / /mnt
sudo ncdu -x /mntВ этом случае в /mnt/ будет отображаться наша флешка и можно оттуда удалить файлы, которые должны были литься на HDD, но попали на флешку.
Если мы не прописали nofail и при редактировании fstab косякнули, то при загрузке можем получить такую надпись:
Cannot open access to console, the root account is locked.В этом случае вытаскиваем SD карту, подключаем через картридер к компу, находим диск boot и в нем файл cmdline.txt.
Дописываем в конец первой строки с параметрами init=/bin/sh (создавать новую строку не надо, просто дописываем в конец).
Вставляем карту обратно и загружаемся.
Чтобы отредактировать fstab монтируем раздел для записи:
mount -o remount,rw /dev/mmcblk0p2 /Вносим правки, исправляя косяки
nano /etc/fstabПодключаем карту обратно к картридеру и убираем внесенный ранее текст init=/bin/sh
После этого перезагружаемся в обычном режиме.
Можно добавить пользователей под которым лить файлы на диски по FTP:
sudo useradd -m -d /mnt/hdd1/ hdd1
sudo passwd hdd1
sudo useradd -m -d /mnt/hdd2/ hdd2
sudo passwd hdd2Форматируем диск в ext-4
Для секьюрности можно отформатировать диски в ext4.
Если диск уже примонтирован, то нужно размонтировать
sudo umount /dev/sda1Запускаем fdisk для нужного диска
sudo fdisk /dev/sdaДальше выбираем команду d и удаляем раздел (если разделов несколько то несколько раз запускаем команду d и выбираем нужный раздел, если раздел только один то удаляется без лишних вопросов).
сommand (m for help): d
Partition number (1,2, default 2):
Partition 2 has been deleted.
Command (m for help): d
Selected partition 1
Partition 1 has been deleted.Затем создаем новый раздел командой n, первый сектор выбираем 2048.
Command (m for help): n
Partition number (1-128, default 1):
First sector (34-3907029134, default 65535): 2048
Last sector, +/-sectors or +/-size{K,M,G,T,P} (34-3907029134, default 3907029134):
Created a new partition 1 of type 'Linux filesystem' and of size 1.8 TiB.Далее сохраняем изменения командой w
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.После этого форматируем созданный раздел в ext4
sudo mkfs.ext4 /dev/sda1Проверка дисков SMART
Ставим smartmontools
sudo apt-get install smartmontools#общая инфа о диске
sudo smartctl --info /dev/sda
# вывести подробную инфу
sudo smartctl -a /dev/sda
# начать длинный внутренний тест
sudo smartctl -t long -d sat /dev/sda -T permissive
# напишет сколько минут будет идти тест
# после теста смотрим результат
sudo smartctl -l selftest -d sat /dev/sda -T permissiveДобавляем параметры SMART в zabbix
Добавляем мониторинг состояния дисков в заббикс — берем скрипты из репозитория https://github.com/v-zhuravlev/zbx-smartctl
Чтобы zabbix мог запускать утилиты smartmontools копируем содержимое файла sudoers_zabbix_smartctl в файл /etc/sudoers.d/sudoers_zabbix_smartctl и ставим права на файл 440
sudo chmod 440 /etc/sudoers.d/sudoers_zabbix_smartctlКопируем файл zabbix_smartctl.conf в папку /etc/zabbix/zabbix_agentd.d. В нем удаляем то что выше строчки (они для старых версий zabbix)
#With the latest 3.4 template you only need theseКопируем файл discovery-scripts/nix/smartctl-disks-discovery.pl в папку /etc/zabbix/scripts и устанавливаем права на файлы
sudo chown zabbix:zabbix /etc/zabbix/scripts/smartctl-disks-discovery.pl
sudo chmod u+x /etc/zabbix/scripts/smartctl-disks-discovery.plТестируем скрипт, проверяем что он возвращает json с инфой о наших дисках.
sudo /etc/zabbix/scripts/smartctl-disks-discovery.plЕсли всё норм, то рестартуем агент
sudo systemctl restart zabbix-agentИмпортируем в zabbix шаблон Template_3.0_HDD_SMARTMONTOOLS_2_WITH_LLD.xml (Настройка->Шаблоны->Импорт) и подключаем его к нашему серверу (Настройка->Узлы сети->server_zabbx->шаблоны).
Установка minidnla
Ставим приложение
sudo apt-get install minidlnaПравим конфиг
sudo nano /etc/minidlna.confраскоментируем строчку чтобы не запускать от рута
#user=minidlnaПрописываем списком все папки где лежат наши медиа файлы (могут быть разбросаны в разных папках и на разных дисках)
media_dir=/mnt/hdd1/Films
media_dir=/mnt/hdd2/Filmsможно там прописывать сразу и тип файлов:
A-аудио
P-картинки
V-видео
PV-картинки и видео,
если не указывать то minidlna сам определит тип файлов
media_dir=V,/mnt/hdd1/Films
media_dir=A,/mnt/hdd1/Music
media_dir=V,/mnt/hdd2/FilmsПрописываем в конфиг папку, в которой будет хранится кеш-база медиа-ресурсов (чтобы не насиловать SD карту, прописываем на HDD), предварительно создав каталог на HDD.
db_dir=/mnt/hdd1/minidlnaЕсли нужно все папки выше указанные собрать в одну корневую, а не по отдельности то прописываем
merge_media_dirs=yesЧтобы телек долго не ждал пока появится сервер в списке медиа ресурсов, прописываем чтобы minidnla каждые 15 секунд кричал в сеть что он работает
notify_interval=15Рестартуем сервис
sudo systemctl restart minidlnaДобавляем генерацию превьюшек для видео
sudo apt install ffmpegthumbnailerСоздаем файл со скриптом:
#!/bin/bash
DIR=$1
if [ -z "$DIR" ]; then
printf "%s\n" "This script will generate thumbnails for all video files inside the given directory"
printf "%s\n" "moviexy.avi --> moviexy.jpg"
printf "%s\n" "ffmpegthumbnailer is required"
printf "%s\n" "Usage: generateThumbs "
exit 1
fi
TYPES=( mov mp4 avi mkv m4v xvid divx wmv mpg mpeg )
# Create a regex of the extensions for the find command
TYPES_RE="\\("${TYPES[1]}
for t in "${TYPES[@]:1:${#TYPES[*]}}"; do
TYPES_RE="${TYPES_RE}\\|${t}"
done
TYPES_RE="${TYPES_RE}\\)"
find $DIR -regex ".*\.${TYPES_RE}" -type f | while read -r FILEPATH
do
printf "%s\n" "--- Start Thumbnailcreation for ---"
printf "%s\n" "$FILEPATH"
THUMBFILE="${FILEPATH%.*}.jpg" # remove video ext. and add .jpg
if [ -f "$THUMBFILE" ]; then
printf "\e[1;33m%s\e[0m\n" "Thumbnail exists"
else
printf "\e[1;32m%s\e[0m\n" "Generating thumbnail..."
ffmpegthumbnailer -i "$FILEPATH" -o "$THUMBFILE" -s 160 -q 10
fi
printf "%s\n" "--- End Thumbnailcreation ---"
done
exit 0Запускаем скрипт, добавляя параметром каталог с видео, сгенерируются файлы превьюшек с таким же именем что и видео.
Установка торрент-клиента Transmission
Сначала устанавливаем демон
sudo apt install transmission-daemonСоздаем папки на жестком диске torrent-inprogress для скачиваемых торрентов и torrent-complete для уже скачанных (это будет дефолтный каталог при добавлении торрент-файла, в окне добавления можно забить другой путь или диск).
sudo mkdir -p /mnt/hdd2/torrent-inprogress
sudo mkdir -p /mnt/hdd2/Films/torrent-completeРедактируем конфиг
sudo nano /etc/transmission-daemon/settings.jsonПрописываем строчки
"incomplete-dir": "/mnt/hdd2/torrent-inprogress",
"download-dir": "/mnt/hdd2/Films/torrent-complete",
"incomplete-dir-enabled": true,Прописываем пароль для удаленного управления (после перезапуска там будет хеш этого пароля):
"rpc-password": "Your_Password",Прописываем пользователя, которым будем коннектиться с веб-мордой
"rpc-username": "Your_Username",Прописываем удаленный доступ только из локальной сети
"rpc-whitelist": "192.168.1.*",Перечитываем настройки демона (иначе если просто перезапустить, то он затрет новые настройки)
sudo invoke-rc.d transmission-daemon reloadСтартуем демона
sudo systemctl start transmission-daemonВеб-морда у Transmission слишком простая и не удобная, поэтому ставим китайскую альтернативу Transmission Web Control
Скачиваем установочный скрипт
wget https://github.com/ronggang/transmission-web-control/raw/master/release/install-tr-control.sh --no-check-certificateЗапускаем его
sudo bash install-tr-control.shТам выбираем первый пункт
1. Install the latest release.После установки можно заходить в web-интерфейс по IP адресу raspberry и порту 9091, вводим там свой логин/пароль который забили в конфиг ранее
http://<RASPBERRY_IPADDRESS>:9091Backup системы (с sd-карты)
Чтобы не снимать образ флешки можно бакапить систему файлами, используя rsync. Так образ занимает меньше места и при регулярном бакапе обновляет только изменившиеся файлы.
Создаем файл rsync-exclude.txt, со списком каталогов, которые мы не будем бакапить
/proc/*
/sys/*
/dev/*
/boot/*
/tmp/*
/run/*
/mnt/*
/media/*На внешнем диске создаем каталог для бакапа, к примеру /mnt/hdd1/backups/pi/
И запускаем команду для бакапа (указываем где лежит файл исключений и куда копируем).
rsync -aHxv --delete --exclude-from=/rsync-exclude.txt / /mnt/hdd1/backups/pi/Когда понадобится восстановить используем обратную команду и восстанавливаем на второй раздел
rsync -av --delete-during /mnt/hdd1/backups/pi/ /mnt/sdcard_partition2/Если редактировали раздел boot то можно бакапить и его, сначала восстановить его, а потом второй раздел.
Сервер rsyslog для сброса логов с роутера
Для настройки сброса логов с роутера (например Zyxel Kinetic) или любого другого сетевого устройства, включаем 514 порт в файле /etc/rsyslog.conf , для этого нужно раскомментировать строчки
# provides UDP syslog reception
#module(load="imudp")
#input(type="imudp" port="514")
# provides TCP syslog reception
#module(load="imtcp")
#input(type="imtcp" port="514")Далее создаем файл для лога
sudo mkdir /var/log/rsyslog
sudo chmod 750 /var/log/rsyslog
sudo touch /var/log/rsyslog/zyxel.log
sudo chmod 640 /var/log/rsyslog/zyxel.logТеперь создаем в папке /etc/rsyslog.d/ файл с любым именем и расширением conf, например zyxel.conf, со следующим содержанием (меняем адрес 192.168.1.1 на ip роутера, который будет отправлять логи).
$template NetworkLog, "/var/log/rsyslog/zyxel.log"
:fromhost-ip, isequal, "192.168.1.1" -?NetworkLog
& ~Возможно потребуется написать & stop вместо & ~, но пока работает и так.
Рестартуем сервис
sudo service rsyslog restartПрописываем в роутере в качестве syslog сервера ip raspberry.
Теперь чтобы логи не раздувались, в папке /etc/logrotate.d/ создаем файл с любым именем (например, zyxel), с правилами архивации:
/var/log/rsyslog/zyxel.log {
rotate 7
size 500k
notifempty
compress
postrotate
invoke-rc.d rsyslog rotate > /dev/null
endscript
}Полезные ссылки
Raspberry Pi 3. Мониторинг температуры процессора и других показателей
Raspberry Pi 3. Установка медиасервера Plex
Raspberry Pi 3. Создание собственного облачного хранилища Nextcloud
Raspberry Pi 3. Организация сетевого доступа к файлам через Samba