Programming, robotics, traveling

30 Mar 2021

Устройство сети в Linux

В статье две части:

  1. Устройство сети Raspberry Pi OS
    в которой описано базовое устройство сети в преднастроенной операционной системе Raspberry Pi OS. А затем описана структура, которую я использую в своём сборщике образов.
  2. Инструменты для работы с сетью
    в которой содержатся мои заметки о утилитах Linux для работы с сетью.

Устройство сети Raspberry Pi OS

Штатная конфигурация сети

В официально предоставляемой ОС запущены следующие службы связанные с настройкой сети:

  1. avahi – mDNS сервис предоставляющий возможность подключиться к RPi по hostname (scivision.dev)

  2. dhcpcd – служба для настройки сетевых интерфейсов (roy.marples.name)

    • Используется как основная сетевая служба для настройки интерфейсов;
    • Призвана решить проблемы со сложной настройкой интерфейсов и предоставить пользователю рабочую сеть из коробки;
    • Настраивает интерфейс с помощью DHCP-клиента или статики описаной в /etc/dhcpcd.conf;
    • Нельзя отключить работу службы на отдельном интерфейсе.
  3. networking – служба для настройки сетевых интерфейсов

    • Изначально включена, но по факту не работает тк запущена с пустым конфигом;
    • Использует утилиты ifup, ifdown для своей работы;
    • Конфигурационный файл /etc/network/interfaces.
  4. wpa_supplicant – служба-клиент защищённого доступа Wi-Fi и проситель IEEE 802.1X

    • Запущена как самостоятельная служба, работает с Wi-Fi интерфейсом; image
    • Если dhcpcd видит поднятый интерфейс от wpa_supplicant, то пытается наладить там адресацию;
    • Используется для создания Wi-Fi клиента: реализует обмен ключами и WPA аутентификацию (manpages.ylsoftware.com, wiki.archlinux.org).

Отказ от штатной конфигурации

В 2019 году я делал модуль связи на котором также был развернут Wi-Fi broadcast (WFB). С того момента я полностью отказался от использования dhcpcd по следующим причинам:

  • WFB нужно, чтобы в работу интерфейса никто не лез. В dhcpcd есть опция не работать с интерфейсом. Однако, несмотря на использование этой опции, туда с запросами лез DHCP-клиент. После пары дней тестов я сделал вывод, что полностью отключить dhcpcd на отдельном интерфейсе нельзя.
  • dhcpcd не позволяет также гибко настраивать интерфейсы как и networking.
  • Подавляющая часть мануалов в интернете описывают настройку networking, в то время как dhcpcd используется по большей части только в Raspbian OS (Raspberry Pi OS).

Сетевая конфигурация на которой я остановился на данный момент выполнена следующим образом:

  • служба avahi не затронута;
  • служба dhcpcd отключена полностью;
  • служба wpa_supplicant отключена как самостоятельная и используется в качестве утилиты в составе networking и только для использования в качестве Wi-Fi клиента;
  • служба networking используется в качестве основной сетевой службы. Конфигурационный файл содержит правила запуска для всех интерфейсов: allow-auto, allow-hotplug; Для каждого интерфейса описана его конфигурация (static, manual, dhcp и loopback) и ряд хуков. Формат interfaces описан подробнее на manpages.ylsoftware.com.

Замечание: dhcpcd и dhclient – не одно и тоже . dhclient - утилита для запроса параметров и настройки интерфейса. Работа с dhclient rtfm.co.ua.

Для создания точки доступа используются следующие утилиты:

  • bridge-utils – утилита для создания бридж-интерфейса.
  • dnsmasq – DNS/DHCP-сервер. Запускается службой networking.
  • hostapd включает управление точкой доступа IEEE 802.11 (аутентификация / ассоциация), аутентификатор IEEE 802.1X / WPA / WPA2, сервер EAP и функциональность RADIUS сервера аутентификации. Он может быть построен с различными вариантами конфигурации, например, с автономным решением для управления AP или сервером аутентификации RADIUS с поддержкой ряда методов EAP.

wpa_supplicant и hostapd – утилиты выполняющие схожий функционал. Их сравнение описано на w1.fi.

Инструменты для работы с сетью

net-tools и iproute2

В версиях ядер Linux 2.4 и ниже для непосредственной работы с сетью использовались инструменты из пакета net-tools такие как:

  • ifconfig – для управления сетевыми интерфейсами;
  • route – управление таблицей маршрутизации;
  • arp – управление таблицей разрешения имен;
  • netstat – сетевая статистика;
  • mii-tool – статус сетевых устройств.

В дистрибутивах, использующих современные ядра внедряется пакет iproute2 (иногда называется iproute), net-tools есть не всегда, но его можно скачать.

В пакет iproute входят 3 основных утилиты:

  • ip – команда для просмотра параметров и настройки сетевых интерфейсов, IP-адресов, таблиц маршрутизации, правил маршрутизации, таблиц ARP преобразования, IP-туннелей и т.д;
  • tc (traffic control) – команда для просмотра и настройки параметров управления трафиком (классификация трафика, дисциплины управления очереди для различных классов трафика);
  • ss – команда для просмотра текущих соединений и открытых портов (аналог netstat).

Примеры использования команды ip

# создание маршрута
ip r add default via 192.168.1.1 dev wlan0
ip r add default via 10.64.64.64 dev ppp0

# удаление маршрута
ip route del default

ip route del default via 192.168.11.1

# создание адресации на интерфейсе
ip addr add 192.168.1.218/24 dev wlan0

# удаление адресации на интерфейсе
ip addr del 192.168.11.218/24 dev wlan0

Подробное использованое команды ip описано на k-max.name.

ifup eth0

ifup утилита читает /etc/network/interfaces и выполняет описанные там инструкции для корректной конфигурации интерфейса.

ip link set eth0 up

Команда ip link up только меняет статус интерфейса и не проводит никаких дополнтельных настроек. Утилита не имеет никаких конфигураций и тд.

Чтобы это было понятнее: ip команда которая делает низкоуровневое действие, а команда ifup может/использует ip команду в составе других для настройки согласно конфигурации конфигурации.

ifconfig eth0 up

ifconfig up тоже самое, что и ip link up, аналоги из net-tools и iproute2 соотвественно.

Больше информации на serverfault.com.

TUN/TAP интерфейсы

Виртуальные интерфейсы

С помощью виртуального интерфейса к одному физического сетевому интерфейсу можно присвоить более одгого IP-адреса. Это полезно, например при работе с Apache и виртуальными хостами, так как позволяет получить доступ к одному и тому же серверу Apache с двух разных IP-адресов.

Источники:

Отдельно хочу выделить создание виртуального интерфейса (не алиаса) с помощью uml-utilities:

# создание виртуального интерфейса router над wlan0
# невозможно без указания IP адреса
ifconfig wlan0:router 192.168.11.1/24 up

# удаление вирутального интерфейса
ifconfig wlan0:router down

Нельзя использовать виртуальный интерфейс в режиме моста или в режиме DHCP-клиента, для интерфейса должен быть задан статичный IP.
Подробнее тут:

Как я понял алиас для интерфейса == создание и настройка виртуальных сетевых интерфейсов через /etc/network/interfaces.

ifconfig alias

Сейчас сайт semenushkin.ru не доступен, поэтому скопирую статью от 28.09.2010 сюда.

Устанавливаем несколько IP-адресов на один интерфейс Unix системы

FreeBSD

# Установка алиаса на интерфейс
ifconfig fxp0 alias 192.168.111.110

# Установка алиаса при загрузки системы (rc.conf)
ifconfig_em0_alias0="inet 192.168.111.110"

# Удалить существующий алиас с интерфейса:
ifconfig em0 -alias 192.168.111.110

Debian/Ubuntu

# Установка алиаса на интерфейс (eth0 — оригинальный, eth0:0, eth0:1 — дополнителные)
ifconfig eth0:0 192.168.111.110 up

# Установка алиаса при загрузке системы (/etc/network/interfaces)
auto eth0:0
iface eth0:0 inet static
    name Ethernet alias LAN card
    address 192.168.1.11
    netmask 255.255.255.0
    broadcast 192.168.1.255
    network 192.168.1.0

auto eth0:1
iface eth0:1 inet static
    name Ethernet alias LAN card
    address 192.168.10.11
    netmask 255.255.255.0
    broadcast 192.168.10.255
    network 192.168.10.0

# Удалить существующий алиас с интерфейса
ifconfig eth0:0 down

Сетевой мост

Сейчас сайт eddnet.org не доступен, поэтому скопирую статью от 14.09.2010, 13:02 сюда.

Bridge — это способ соединения двух сегментов Ethernet на канальном уровне, т.е. без использования протоколов более высокого уровня, таких как IP. Пакеты передаются на основе Ethernet-адресов, а не IP-адресов (как в маршрутизаторе). Поскольку передача выполняется на канальном уровне (уровень 2 модели OSI), все протоколы более высокого уровня прозрачно проходят через мост.

Отдельно хочу выделить разницу bridge и macvlan hicu.be.

Нам понадобиться bridge-utils. (В RHEL, CentOS, Fedora, воспользуйтесь yum, в Debian подобных apt-get)

# установка bridge-utils
apt install bridge-utils

Настройку производим на системе с двумя сетевыми карточками:

# Создаем новый мост
brctl addbr br0

# Подключаем к нему сетевой интерфейс
brctl addif br0 eth0

# Очень важно, что бы на сетевом интерфейсе не было IP адреса. Команда, что бы удалить IP адрес
ip addr delete 172.16.0.1 dev eth0

# Подключаем второй интерфейс
brctl addif br0 eth1

# Назначаем мосту IP адрес
ip addr add 172.16.200.8/24 dev br0

# Отключаем STP (Spanning Tree Protocol) режим
brctl stp br0 off

# Подымаем интерфейсы
ip link set br0 up
ip link set eth0 up
ip link set eth1 up

Дополнительные команды:

# Информация о сетевых интерфейсах
ip addr
ip link

# Информация о bridge-е
brctl show

# Таблица MAC-адресов
brctl showmacs br0

Источники:

VPN: xl2tpd + ipsec

Я пытался отладить работу L2TP + IPsec сборки состоящей из двух отдельный контейнеров, связанных сетью с помощью утилиты tcpdump, однако у меня не получилось это сделать.

Pluto listening for IKE on udp 500
Pluto listening for NAT-T on udp 4500
IP libreswan > zz217.113.124-243.tlt.ru: ICMP libreswan udp port 1701 unreachable, length 121

IP ipsec-vpn-server.1701 > zz217.113.124-243.tlt.ru.54767:  l2tp:[TLS](27/0)Ns=0,Nr=1 *MSGTYPE(SCCRP) *PROTO_VER(1.0) *FRAMING_CAP(AS) *BEARER_CAP() FIRM_VER(1680) *HOST_NAME(ipsec-vpn-server) VENDOR_NAME(xelerance.com) *ASSND_TUN_ID(22763) *RECV_WIN_SIZE(4)

IP ipsec-vpn-server.1701 > 185.211.158.69.53760:  l2tp:[](31/15401) {LCP, Conf-Request (0x01), id 1, length 27}

Больше примеров в этой статье.

  • ciscotips.ru Разница PAP и CHAP
  • wiki.debian.org Настройка xl2tpd
  • raspberrypi.stackexchange.com Проблема с отключение USB hub на Raspberry Pi 3B+
  • libreswan.org libreswan official ipsec.conf file
  • habr.com Непростой IPSec с Linux (Теоретические источники по vpn, ipsec)
  • www.opennet.ru VPN и IPSec на пальцах
  • habr.com Анатомия IPsec. Проверяем на прочность легендарный протокол
  • book.cyberyozh.com Выбираем протокол для VPN. Сравнение OpenVPN, PPTP, L2TP/IPsec и IPsec IKEv2 (libreswan)
  • github.com github libreswan
  • habr.com Настройка OpenSWAN IPsec PSK с использованием NAT Traversal (NAT-T)
  • itsecforu.ru Как настроить Ipsec VPN используя Libreswan
  • manpages.ylsoftware.com Перевод руководства xl2tpd.conf
  • habr.com Настраиваем VPN связь посредством l2tp + ipsec c использованием в качестве сервера OpenVZ контейнер
  • sysadminz.ru Форум VPN-сервер с помощью openswan+l2tpd
  • toster.ru IPSEC/L2TP VPN на Ubuntu 12.04.1 на AWS
  • alexell.ru Поднимаем свой VPN — L2TP/IPsec на Ubuntu
  • itsecforu.ru Настройка IPSec VPN-сервера с L2TP и Cisco IPsec на Ubuntu / CentOS / Debian (просто перевел то, что было в репе hwdsl2
  • raymii.org IPSEC L2TP VPN on Ubuntu 14.04 with OpenSwan, xl2tpd and ppp
  • github.com github fork hwdsl2 on sarfata/voodooprivacy
  • github.com github libreswan l2tp-psk.conf
  • libreswan.org VPN server for remote clients using IKEv1 with L2TP
  • gist.github.com install-libreswan-xl2tpd-ipsec-vpn-remote-access-on-aws-ec2_aws_linux_ami_201409
  • nohats.ca Don’t stop using IPsec just yet
  • wiki.contribs.org Smeserver-libreswan-xl2tpd ru.wikipedia.org wikipedia IPsec
  • www.ixbt.com IPSec — протокол защиты сетевого трафика на IP-уровне
  • github.com github Un conjunto de instrucciones y script para conectarse a la VPN 2016 de la Universidad Distrital
  • github.com github xelerance/xl2tpd

Статьи для поднятия L2TP на роутере Mikrotik (раньше планировал использовать его в качестве соединительного узла):

Статьи по настройке IPsec:

OpenVPN

Wirequard

Смена MAC адреса

# Выключаем нужный нам интерфейс eth1:
ifconfig eth1 down

# Изменяем mac-адрес:
ifconfig eth0 hw ether 01:a2:55:04:d0:f1

# Включаем интерфейс eth1:
ifconfig eth1 up

Чтобы конфигурация сохранилась после перезагрузки, необходимо прописать следующую строку в файл /etc/network/interfaces:

hwaddress ether 01:a2:55:04:d0:f1

Выполняем рестарт сети:

/etc/init.d/networking restart
# or
systemctl restart networking

Источники:

Работа с сотовым модемом

USB модемы можно разделить на два типа:

  1. Предоставляющие интерфейс для dialup соединения;
  2. Определяющиеся как сетевая карта со всеми операциями выполняемыми под капотом.

В первом случае для установки соединения можно использовать wvdial (инструкция) + ppp или sakis3g (robocraft.ru).

Также есть обёртка над sakisumtskeeper. Она является полноценным менеджером соединения + ведет статистику по трафику.

/home/pi/3g_modem/umtskeeper —sakisoperators "USBINTERFACE='0' OTHER='USBMODEM' USBMODEM='12d1:1506' APN='CUSTOM_APN' CUSTOM_APN='internet.beeline.ru' SIM_PIN='0000' APN_USER='beeline' APN_PASS='beeline'" —sakisswitches "--sudo —console" —devicename 'Huawei' —log —silent —nat 'no' &

В данной статье описано как использовать модем с помощью AT-комманд и подключения через ppp.

Пакет Wireless Tools

Wireless Extensions (WE) является универсальным API, реализованным в ядре Linux и позволяющим драйверу отображать в пользовательском пространстве конфигурацию и конкретные особенности обычных беспроводных сетей. Если в драйвере поддерживается использование технологии Wireless Extensions, то с помощью одного комплекта инструментальных средств можно поддерживать всевозможные варианты беспроводных сетей, независимо от их типа. Параметры WE можно менять на лету без перезагрузки драйвера (или Linux).

Пакет Wireless Tools представляет собой набор инструментальных средств, позволяющих использовать Wireless Extensions. Для поддержки всех возможностей Wireless Extensions используется текстовый интерфейс.

  • ifrename – переименовывает сетевые интерфейсы в соответствие с различными статическими критериями
  • iwconfig – конфигурирует беспроводный сетевой интерфейс
  • iwevent – отображает события беспроводной сети, вызванные работой драйверов и изменением настроек
  • iwgetid – отображает параметры ESSID и NWID или адрес AP/Cell беспроводных сетей
  • iwlist – получает от беспроводного интерфейса информацию о беспроводной сети
  • iwpriv – конфигурирует необязательные (приватные) параметры сетевого беспроводного интерфейса
  • iwspy – получает от конкретного узла статистические данные о беспроводной сети
  • libiw.so – содержит функции, необходимые программам, работающим с беспроводными сетями, и предоставляет API для других программ.

Источник rus-linux.net

DNSMASQ

Команды для просмотра основных файлов:

# Основной конфигурационный файл
cat /etc/dnsmasq.conf

# Кажется файл с описанием выдачи статических адресов
cat /var/lib/misc/dnsmasq.leases

# Лог-файл выданных адресов
cat /var/log/dnsmasq/dnsmasq.leases

Отключение NetworkManager

Информация о отключении собрана в паре топиков:

Если коротко, то:

sudo apt-get purge network-manager

sudo systemctl stop NetworkManager.service
sudo systemctl disable NetworkManager.service

sudo systemctl stop NetworkManager-wait-online.service
sudo systemctl disable NetworkManager-wait-online.service

sudo systemctl stop NetworkManager-dispatcher.service
sudo systemctl disable NetworkManager-dispatcher.service

sudo systemctl stop network-manager.service
sudo systemctl disable network-manager.service

sudo reboot

Также мб установлена nmtui, её тоже можно удалить.

Отключение MAC именования интерфейсов

На некоторых ОС в тч на Armbian изначально включена функция именования интерфейсов с использованием MAC адреса. Например, не eth1, а wlx0072631836f7. Её нужно выключить, иначе на разных устройствах в куче конфигурационных файлов служб придется вручную менять все имена интерфейсов. Здесь написано как это сделать.

Ссылки на тему настройки сети