Установка и настройка Raspberry Pi 3B c Ubuntu
Инструкция настройки Raspberry Pi 3b и установки Ubuntu 20.04.
Установка системы на флешку
Скачайте архив
wget https://cdimage.ubuntu.com/releases/20.04.2/release/ubuntu-20.04.2-preinstalled-server-arm64+raspi.img.xz
Распакуйте архив.
xz -d ubuntu-20.04.2-preinstalled-server-arm64+raspi.img.xz
Подключите флекшу. Узнайте название устройства.
fdisk -l
У меня команда выводит следующую информацию:
Disk /dev/mmcblk0: 29.1 GiB, 31268536320 bytes, 61071360 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: 0x738a4d67
Запишите образ на флешку. Поставьте в параметр "of" свой диск.
sudo dd bs=4M if=ubuntu-20.04.2-preinstalled-server-arm64+raspi.img of=/dev/mmcblk0 conv=fsync status=progress
Подключение к raspberrypi
Установите флешку в raspberrypi, включите ее и подключитесь к ней через клавиатуру.
Когда система загрузится, подождите 2 минуты, до тех пор пока инициализируется cloud init. После этого он позволит ввойти в систему под стандартным паролем.
По умолчанию пароль:
ubuntu - логин
ubuntu - пароль
Когда вы первый раз зайдете в систему, она предложит поменять пароль.
После входа в систему и смены пароля, перейдите под рут
sudo su
Установите часовой пояс
Посмотрите список часовыъ поясов:
timedatectl list-timezones
Установите часовой пояс:
timedatectl set-timezone Asia/Almaty
Настройка локали
Откройте файл /etc/locale.gen и раскоментируйте строки:
en_US.UTF-8 UTF-8
ru_RU.UTF-8 UTF-8
выполните комманду
locale-gen
Измените hostname
В файле /etc/hostname укажите название распы, например:
raspa1
Выполните команду:
echo "127.0.0.1 raspa1" >> /etc/hosts
Подключение к Wi Fi через WPA Supplicant
Пропустите этот пункт, если у вас Ethernet.
Создайте файл:
touch /root/wifi.sh
chmod +x /root/wifi.sh
Посмотрите название вашего Wi Fi модуля:
ip a
Он может называться как wlp3s0 или wlan0.
Измените содержимое файла /root/wifi.sh и укажите в нем название вашего Wi Fi модуля. Вместо mynetwork и passphrase укажите свои данные.
wpa_passphrase mynetwork passphrase > /root/wifi.conf
wpa_supplicant -i wlan0 -c /root/wifi.conf &
sleep 10
ip addr add 192.168.1.25/24 dev wlan0
ip route add 192.168.1.0/24 dev wlan0 metric 100
ip route add default via 192.168.1.1 dev wlan0 metric 10
echo "nameserver 8.8.8.8" > /etc/resolv.conf
echo "Connected"
Подключитесь к Wi Fi:
/root/wifi.sh
Проверьте интернет:
ping ya.ru
Настройка ssh
Установите ssh:
apt update
apt install openssh-server
systemctl enable ssh
systemctl start ssh
Поменяйте стандартный порт ssh в конфиге nano /etc/ssh/sshd_config
Порт, следует изменить на нестандартный. например:
Port 22050
Запретить авторизацию через root по паролю, только через ключ
PermitRootLogin prohibit-password
Также можете указать:
ClientAliveInterval 5
ClientAliveCountMax 1000
Разрешить авторизацию только определенным пользователям, укажите в самом конце файла:
AllowUsers ubuntu
Сделайте перезапуск сервиса ssh
service sshd reload
Пробросьте свои ssh ключи на распу
Сгенереруйте у себя ключи, если они не были сгенерированы:
ssh-keygen
Выполните копирование ключей:
ssh-copy-id -i ~/.ssh/id_rsa.pub -p22050 ubuntu@IP-Адрес-Распы
Создайте ssh конфиг nano ~/.ssh/config
Host *
Protocol 2
KeepAlive yes
TCPKeepAlive yes
ServerAliveInterval 5
ServerAliveCountMax 100
Compression no
#CompressionLevel 9
#ForwardX11 yes
UseRoaming no
Host raspa1
Hostname 192.168.1.25
User pi
Port 22050
IdentityFile ~/.ssh/id_rsa
Теперь можно подключаться через SSH командой:
ssh raspa1
Изменение зеркала на mirror.yandex.ru
В файле /etc/apt/sources.list заменить ports.ubuntu.com на mirror.yandex.ru
deb http://mirror.yandex.ru/ubuntu-ports focal main restricted
deb http://mirror.yandex.ru/ubuntu-ports focal-updates main restricted
deb http://mirror.yandex.ru/ubuntu-ports focal universe
deb http://mirror.yandex.ru/ubuntu-ports focal-updates universe
deb http://mirror.yandex.ru/ubuntu-ports focal multiverse
deb http://mirror.yandex.ru/ubuntu-ports focal-updates multiverse
deb http://mirror.yandex.ru/ubuntu-ports focal-backports main restricted universe multiverse
deb http://mirror.yandex.ru/ubuntu-ports focal-security main restricted
deb http://mirror.yandex.ru/ubuntu-ports focal-security universe
deb http://mirror.yandex.ru/ubuntu-ports focal-security multiverse
# deb-src http://mirror.yandex.ru/ubuntu-ports focal main restricted
# deb-src http://mirror.yandex.ru/ubuntu-ports focal-updates main restricted
# deb-src http://mirror.yandex.ru/ubuntu-ports focal universe
# deb-src http://mirror.yandex.ru/ubuntu-ports focal-updates universe
# deb-src http://mirror.yandex.ru/ubuntu-ports focal multiverse
# deb-src http://mirror.yandex.ru/ubuntu-ports focal-updates multiverse
# deb-src http://mirror.yandex.ru/ubuntu-ports focal-backports main restricted universe multiverse
# deb-src http://mirror.yandex.ru/ubuntu-ports focal-security main restricted
# deb-src http://mirror.yandex.ru/ubuntu-ports focal-security universe
# deb-src http://mirror.yandex.ru/ubuntu-ports focal-security multiverse
Отключение ipv6
Если у вас провайдер не поддерживает ipv6 протокол, то имеет смысл его отключить, чтобы разные программы, такие как apt не пробовали обращаться к серверам по ip6 протоколу, который не работает.
Для этого в файл /etc/sysctl.conf нужно добавить строчки:
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
и сделать:
sysctl -p
Удаление лишних пакетов
Удалите пакеты:
apt purge fwupd plymouth plymouth-theme-ubuntu-text snapd cloud-init
apt autoremove
перезагрузитесь:
init 6
Настройка системы
Обновите систему и установите пакеты:
apt-get update
apt-get upgrade
apt-get install mc nano htop aptitude iftop bwm-ng iperf iperf3 iotop tmux screen sshfs net-tools
Отключение автообновлений
Откройте файл /etc/apt/apt.conf.d/20auto-upgrades и установите значение "0" для Unattended-Upgrade
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "0";
Настройка сети
Network Manager очень хороший способ управлять сетью. По умолчанию в Ubuntu он отключен, и нужно поставить его вручную.
Подробная инструкция по настройке Network manager здесь.
Установите программы:
apt-get install network-manager dnsmasq
dnsmasq - это мини ДНС сервер. Он удобен, потому что в нем можно прописывать свои хосты, в том числе и wildcard. Плюс он кэширует ДНС запросы.
Настройка Network Manager
Включите сервис Network Dispatcher:
systemctl enable NetworkManager-dispatcher.service
systemctl start NetworkManager-dispatcher.service
Отключите systemd resolved
systemctl stop systemd-resolved
systemctl disable systemd-resolved
Отключите dchp4 в netplan. В файле /etc/netplan/50-cloud-init.yaml нужно закоментить строку:
network:
ethernets:
eth0:
dhcp4: false
optional: true
version: 2
В файле /usr/lib/NetworkManager/conf.d/10-dns-resolved.conf указать
dns=none
Измените файл /etc/NetworkManager/NetworkManager.conf
[main]
#auth-polkit=false
plugins=ifupdown,keyfile
#systemd-resolved=false
#rc-manager=resolvconf
dns=none
[ifupdown]
managed=false
[device]
wifi.scan-rand-mac-address=no
Создайте файл /usr/lib/NetworkManager/conf.d/10-globally-managed-devices.conf
[keyfile]
unmanaged-devices=*,except:type:wifi,except:type:gsm,except:type:cdma,except:type:ethernet,interface-name:lxc*,interface-name:docker*,interface-name:virtual*,interface-name:veth*
Этот файл позволяет указать какие сети будут управляться через Network Manager.
Параметры могут быть следующими:
type:bridge
interface-name:lxc*
interface-name:docker*
interface-name:virtual*
Более подробнее о командах здесь
Отключите управление сетью через systemd
systemctl disable systemd-networkd.socket
systemctl disable systemd-networkd.service
systemctl disable systemd-resolved
systemctl disable networkd-dispatcher
systemctl disable cloud-init
apt-get purge cloud-init
rm -rf /etc/cloud/ && sudo rm -rf /var/lib/cloud/
Настройка dnsmasq
Скопируйте конфиг
cp /etc/dnsmasq.conf /etc/dnsmasq.conf.example
echo "" > /etc/dnsmasq.conf
Создайте файл /etc/resolv.dnsmasq
nameserver 8.8.8.8
nameserver 8.8.4.4
nameserver 1.1.1.1
В /etc/dnsmasq.conf пропишите:
port=53
listen-address=0.0.0.0
no-dhcp-interface=
bind-interfaces
expand-hosts
local-ttl=1
no-negcache
# Динамические настройки DNS
resolv-file=/run/NetworkManager/resolv.conf
# Настройки DNS по умолчанию
#resolv-file=/etc/resolv.dnsmasq
conf-dir=/etc/dnsmasq.d
cache-size=150
max-cache-ttl=600
min-cache-ttl=60
# Одновременный запрос ко всем DNS серверам
# all-servers
# Запрещаем резолвить домены без точки (нужно для Docker Swarm)
domain-needed
# Для отладки
#log-queries
Создайте файл /etc/NetworkManager/dispatcher.d/99-dnsmasq
#!/bin/bash
if [[ "$1" = "enp2s0" || "$1" = "wlp3s0" ]]; then
if [ "$2" = "up" ]; then
kill -9 `cat /var/run/dnsmasq/dnsmasq.pid`
sleep 1
systemctl start dnsmasq
fi
fi
Если вы хотите прописать свои хосты в системе, вы можете использовать файл /etc/hosts или создать новый файл в папке /etc/dnsmasq.d/examle.conf со следующим содержанием:
# Example
address=/.example/127.0.0.2
address=/ns.example/127.0.0.1
address=/test.example/127.0.0.5
Данный файл говорит dnsmasq резолвить домен .examle, учитывая wildcard запросы.
Выключите резолвер из внешней сети интернет. Создайте файл /etc/dnsmasq.d/disable-external-network
bind-interfaces
except-interface=enp*
except-interface=wlp*
except-interface=wlan*
except-interface=eth*
Подключение к Wi Fi через Network Manager
Отключитесь от Wi Fi:
killall wpa_supplicant
Перезагрузитесь:
init 6
После перезагрузки, зайдите в систему.
Включите WiFi:
nmcli radio wifi on
Просмотрите список доступных WiFi сетей:
nmcli device wifi list
Подключитесь к сети, используя логин и пароль:
nmcli device wifi connect YourWifiNetwork password YourWifiPassword
Установите метрику по умолчанию (чем меньше число, тем выше приоритет):
nmcli c m YourWifiNetwork ipv4.route-metric 10
Установите DNS:
nmcli c m YourWifiNetwork ipv4.ignore-auto-dns yes
nmcli c m YourWifiNetwork ipv4.dns "8.8.8.8 8.8.4.4 1.1.1.1"
Количество попыток подключения к wifi если он не доступен:
nmcli c m YourWifiNetwork connection.autoconnect-retries 3
nmcli c m YourWifiNetwork connection.autoconnect-priority 0
Настройка сети через Ethernet
Введите команды:
nmcli connection add type ethernet con-name Eth0 ifname eth0
nmcli c m Eth0 ipv4.route-metric 100
nmcli c m Eth0 ipv4.ignore-auto-dns yes
nmcli c m Eth0 ipv4.dns "8.8.8.8 8.8.4.4 1.1.1.1"
nmcli c m Eth0 connection.autoconnect-priority 999
Установка статического IP адреса
nmcli c m Eth0 ipv4.addresses "192.168.1.25/24"
nmcli c m Eth0 ipv4.gateway "192.168.1.1"
nmcli c m Eth0 ipv4.method manual
Настройка iptables
Установите iptables
apt install iptables-persistent -y
На вопрос Save current IPv4 rules? и Save current IPv6 rules? ответьте No
При работе с iptables будьте осторожны. Одно неверное движение и доступ к серверу может быть заблокирован!!!
Обратите на порт SSH. Укажите свой порт, вместо 22050.
Пропишите в /etc/iptables/rules.v4 следующее содержимое:
*filter
:INPUT ACCEPT [19:913]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [39:3584]
:ALLOW-INPUT - [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
# Разрешаем входящие соединения ssh
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22050 -j ACCEPT
# Перейти к цепочке ALLOW-INPUT
-A INPUT -j ALLOW-INPUT
# Запрещаем остальные входящие соединения
-A INPUT -j REJECT
-A FORWARD -j REJECT
# Разрешить http
-A ALLOW-INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A ALLOW-INPUT -p tcp -m tcp --dport 443 -j ACCEPT
# Разрешить Docker Swarm
-A ALLOW-INPUT -p tcp -m tcp --dport 2376 -j ACCEPT
-A ALLOW-INPUT -p tcp -m tcp --dport 2377 -j ACCEPT
-A ALLOW-INPUT -p tcp -m tcp --dport 7946 -j ACCEPT
-A ALLOW-INPUT -p udp -m udp --dport 7946 -j ACCEPT
-A ALLOW-INPUT -p udp -m udp --dport 4789 -j ACCEPT
# Разрешаем входящие соединения DNS
-A ALLOW-INPUT -i docker0 -p udp -m udp --dport 53 -j ACCEPT
-A ALLOW-INPUT -i docker0 -p tcp -m tcp --dport 53 -j ACCEPT
-A ALLOW-INPUT -i docker_gwbridge -p udp -m udp --dport 53 -j ACCEPT
-A ALLOW-INPUT -i docker_gwbridge -p tcp -m tcp --dport 53 -j ACCEPT
-A ALLOW-INPUT -j RETURN
COMMIT
Обязателен ENTER в конце (перевод на новую строку).
Скопируйте rules.v4 в rules.v6
cp /etc/iptables/rules.v4 /etc/iptables/rules.v6
Установите новые правила iptables
iptables-restore < /etc/iptables/rules.v4
ip6tables-restore < /etc/iptables/rules.v6
Чтобы добавлять новые правила в iptables, например, тот же nginx нужно редактировать файл. Также вы можете выполнить команды
iptables -I ALLOW-INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -I ALLOW-INPUT -p tcp -m tcp --dport 443 -j ACCEPT
Они добавят в начало цепочки ALLOW-INPUT два новых правила, но при этом файл не изменят.
Проверьте настройки iptables:
iptables-save
Обязательно проверьте соединение ssh. Попробуйте залогиниться к серверу через отдельный терминал.
Перезагрузите систему:
init 6
Включите проверку диска
В файле /boot/firmware/cmdline.txt добавьте параметры:
fsck.mode=force fsck.repair=yes
Это позволит запускать проверку диска при старте распы.
Ограничьте размер логов systemd
Пропишите в /etc/systemd/journald.conf строчку:
SystemMaxUse=2G
Это строчка ограничивает максимальный размер логов в 2 гигабайт. Перезагрузите конфигурацию systemd:
systemctl daemon-reload
Можно также в крон прописать строчку через команду sudo crontab -e
0 0 * * * journalctl --vacuum-time=30d --vacuum-size=2G > /dev/null
Она будет оставлять логи за 30 дней
Дополнительная настройка локали
создайте файл nano /etc/profile.d/0.locale.sh со следующим содержимым:
export LANG="en_US.UTF-8"
export LANGUAGE="en_US:en"
export LC_CTYPE="en_US.UTF-8"
export LC_NUMERIC="en_US.UTF-8"
export LC_TIME="en_US.UTF-8"
export LC_COLLATE="en_US.UTF-8"
export LC_MONETARY="en_US.UTF-8"
export LC_MESSAGES="en_US.UTF-8"
export LC_PAPER="en_US.UTF-8"
export LC_NAME="en_US.UTF-8"
export LC_ADDRESS="en_US.UTF-8"
export LC_TELEPHONE="en_US.UTF-8"
export LC_MEASUREMENT="en_US.UTF-8"
export LC_IDENTIFICATION="en_US.UTF-8"
export EDITOR=nano
Если для пользователя хотите локализацию русскую, то в домашней папке в ~/.bashrc пропишите:
LANG="ru_RU.UTF-8"
LANGUAGE="ru"
export LANG
export LANGUAGE
Отключите лишние службы
systemctl disable apport
systemctl disable cups.service
systemctl disable nmbd.service
systemctl disable ondemand.service
systemctl disable openvpn.service
systemctl disable pppd-dns.service
systemctl disable rsync.service
systemctl disable smbd.service
systemctl disable ufw.service
systemctl disable avahi-daemon.service
systemctl disable cups-browsed.service
systemctl disable bluetooth.service
systemctl disable ModemManager.service
systemctl disable strongswan.service
systemctl disable udisks2.service
systemctl disable multipathd.service
systemctl disable cloud-config.service
systemctl disable cloud-final.service
systemctl disable cloud-init-local.service
systemctl disable cloud-init.service
systemctl disable cryptdisks-early.service
systemctl disable cryptdisks.service
systemctl disable e2scrub@.service
systemctl disable e2scrub_all.service
systemctl disable e2scrub_fail@.service
systemctl disable e2scrub_reap.service
systemctl disable fwupd-offline-update.service
systemctl disable fwupd.service
systemctl disable lvm2-lvmpolld.service
systemctl disable lvm2-monitor.service
systemctl disable lvm2-pvscan@.service
systemctl disable lvm2.service
systemctl disable lxd-agent-9p.service
systemctl disable lxd-agent.service
systemctl disable ondemand.service
systemctl disable systemd-networkd.socket
systemctl disable systemd-networkd.service
systemctl disable systemd-resolved
systemctl disable networkd-dispatcher
systemctl disable packagekit
systemctl enable NetworkManager-dispatcher.service
systemctl start NetworkManager-dispatcher.service