Прикладной уровень: возможности операционной системы

Поток / датаграмма / whatever получены. Что дальше?

Цели:

Задачи:

Систем запуска и контроля сетевых сервисов в Linux несколько, остановимся на самом «универсальном» — SystemD.

/!\ Леннарт и юзабилити ;_;

Коротко об управлении systemd

Связь с интерпретатором

Пространство имён: /etc/services — только well-known и нет прямой связи с приложением

В роли «служб» мы использовали

Два варианта сетевой службы в Linux:

  1. Полноценный сервис.
    • Делает подсистема запуска:
      • Запуск и останов по расписанию / заспросу
    • Делает сама служба:
      • Создание и обслуживание сокета (bind() + listen() + accept())

      • (одно соединение) Закрытие сокета + respawn при закрытии соединения
      • (несколько соединений) Обработка соединения отдельным процессом accept() + fork()

        • Количество одновременных соединений?
      • Интерпретация потоков В/В
      • Управление сервисом — сигналы или специальный сокет
  2. «Сокет-активация»
    • Делает подсистема запуска:
      • Создание и обслуживание сокета (bind() + listen() + accept())

      • Обслуживание одного соединения
      • Обслуживание нескольких соединений accept() + fork() (в т. ч. общие для прикладного уровня ограничения по ресурсам, конкуренции между соединениями и т. п.)

      • Запуск соответствующего интерпретатора потока (stdin / stdout) и преобразование потока в пакеты

      • Управление сервисом посредством сигналов
    • Делает сама служба:
      • Интерпретация потоков В/В
      • Управление сервисом через специальный сокет / утилиту

;_; Есть ещё сокет-активация для полноценных сервисов с передачей им открытого сокета, (с указанием Accept=No):

Примеры

Запуск собственных служб с помощью systemd

Полноценный сервис

Сокет-активация

Сокет-активация systemd

Пример:

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

Для того, чтобы сервисы стартовали автоматом после перезагрузки, необходимо поставить их в зависимость от какого-либо этапа загрузки системы, вписав в .service-файл примерно такое:

[Install]
WantedBy=multi-user.target

Перманентная настройка сети с помощью systemd-networkd

Различные дистрибутивы и сообщества Linux пользуются несколькими разными высокоуровневыми системами настройки сети; стандарта или общейдоговорённости нет. Раз уже мы начали с SystemD, рассмотрим, как настраивать сеть с его помощью.

Сам systemd-networkd:

Настроим IP сервера с выходом в Интернет через стандартную «виртуальную» сеть VirtualBox (пример по ссылке выше)

Перечитаем настройки сети и обновим настройки интерфейса

[root@srv ~]# networkctl reload
[root@srv ~]# networkctl reconfigure eth0
[root@srv ~]# networkctl
IDX LINK TYPE     OPERATIONAL SETUP
  1 lo   loopback carrier     unmanaged
  2 eth0 ether    routable    configured
  3 eth1 ether    off         unmanaged
  4 eth2 ether    off         unmanaged
  5 eth3 ether    off         unmanaged

5 links listed.
[root@srv ~]# networkctl
delete       forcerenew   list         reconfigure  renew        up
down         label        lldp         reload       status
[root@srv ~]# networkctl status eth0
* 2: eth0
             Link File: /lib/systemd/network/99-default.link
          Network File: /etc/systemd/network/50-vbox.network
                  Type: ether
                 State: routable (configured)
          Online state: online
     Alternative Names: enp0s3
                  Path: pci-0000:00:03.0
                Driver: pcnet32
                Vendor: Advanced Micro Devices, Inc. [AMD]
                 Model: 79c970 [PCnet32 LANCE] (PCnet - Fast 79C971)
            HW Address: 08:00:27:89:d2:0f (PCS Systemtechnik GmbH)
                   MTU: 1500 (min: 68, max: 1500)
                 QDisc: fq_codel
  Queue Length (Tx/Rx): 1/1
      Auto negotiation: no
                 Speed: 10Mbps
                Duplex: half
                  Port: tp
               Address: 10.0.2.15
               Gateway: 10.0.2.2
     Activation Policy: up
   Required For Online: yes

Apr 14 18:09:47 srv systemd-networkd[1096]: eth0: Re-configuring with /etc/systemd/network/50-vbox.network
Apr 14 18:09:47 srv systemd-networkd[1096]: eth0: Link UP
Apr 14 18:09:47 srv systemd-networkd[1096]: eth0: Gained carrier
Apr 14 18:09:51 srv systemd-networkd[1096]: eth0: Re-configuring with /etc/systemd/network/50-vbox.network

Эта настройка перманентна — после перезагрузки должна восстановиться.

Настройка статического маршрута

Тот же файл ….network +

[Route]
Gateway=маршрутизатор
Destination=сеть

Настройка net.ipv4.ip_forward:

[Network]
IPForward=ipv4

Из известного нам: ProxyARP, Policy routing, …

(коротко, без демонстрации) Использование netdev

Доступ к VLAN + организация bridge с ним для загрузки виртуальной машины из этой сети.

  1. Основной интерфейс:
    [Match]
    Name=eth0
    
    [Network]
    DHCP=yes
    VLAN=prac
  2. Мост:
    • Файл allprac.netdev:

      [NetDev]
      Name=allprac
      Kind=bridge
    • Файл allprac.network:

      [Match]
      Name=allprac
      
      [Link]
      ActivationPolicy=always-up
  3. Интерфейс prac@eth0:

    • Файл prac.netdev:

      [NetDev]
      Name=prac
      Kind=vlan
      
      [VLAN]
      Id=61
    • Файл prac.network:

      [Match]
      Name=prac
      
      [Network]
      Bridge=allprac

Настройка автоматической конфигурации по DHCP

Это самый простой вариант:

[Network]
DHCP=on

Д/З

Образ обновился:

Задание 8

Суть: две виртуалки объединить в сеть (интерфейсами eth1), настроить сеть с помощью systemd-networkd и запустить три сетевых сервиса: два вырожденных и один простой

  1. Первый сервис получает на вход произвольный файл, и выдаёт на выход hexdump этого файла в любом удобном для решения задачи формате

  2. Второй сервис выполняет обратную задачу
  3. Третий сервис запускается на другой виртуалке, и он посложнее.
    • На вход подаётся три или более текстовых строк в формате ASCII
      1. Шаблон (первая строка)
      2. Замена (вторая строка)
      3. Текст из одной или более строк
    • На выходе должен получиться «текст», в котором все вхождения «шаблона» заменены на «замену».

Задача:

  1. Настроить на обоих хостах сеть с помощью systemd-networkd (в отчёт не входит)

  2. Оформить все три сервиса как чисто текстовые обработчики с сокет-активацией. С помощью этих сервисов организовать замену произвольного байта на любой другой произвольный байт (каждый байт — это две шестнадцатеричные цифры).

    • Настройка сети и запуск служб производятся заранее и в отчёт не входят
    • Подсказка: почитайте systemd.exec: имеет смысл отделить stderr сервиса от stdout

    • Спойлер: первые два сервиса за нас сделает xxd с ключами -c1 -p и -r -p соответственно.

  3. Площадка:
    • srv — хост с двумя вырожденными сервисами (1) и (2)

    • client — хост с сервисом замены текста (3). Для программирования на client доступны (можно пользоваться чем угодно, что найдёте в образе; я выбрал python3):

      • bash (на bash+sed это три строки), awk, … прочие стандартные утилиты linux, python3, perl

  4. Отчёт:
    1. report 8 client

      • Сделать networkctl status eth1 -n 1

      • Сделать systemctl cat сервису (3) и его сокету

      • Если для обработки написан какой-то скрипт на каком-то языке, сделать ему cat

      • Подать на вход сервису три строки: 33, 44 и 33, и убедиться, что он возвращает 44:

        • echo -e '33\n44\n33' | netcat localhost порт

      • Сделать systemctl status сокету: должно показать нулевое количество соединений в данный момент (Connected:) и ненулевое — обслуженных соединений (Accepted:)

    2. report 8 srv

      • Сделать networkctl status eth1 -n 1

      • Сделать systemctl cat обоим сервисам и их сокетам

      • Сделать systemctl status обоим сокетам

      • Проверить, что преобразование в сервисах обратимо:
        • date > d; netcat localhost порт1 < d | netcat localhost порт2 | cmp d -

      • Собрать следующий конвейер из netcat-ов:

        • { echo 09; echo 2d; netcat localhost порт1 < /etc/crontab.template; } | netcat клиент порт | netcat localhost порт2

        • (табуляции должны замениться минуcами)
      • Сделать systemctl status обоим сокетам: должно показать нулевое количество соединений в данный момент (Connected:) и ненулевое — обслуженных соединений (Accepted:)

  5. Два отчёта(названия сохранить, должно быть: report.08.srv, report.08.client) переслать одним письмом в качестве приложений на uneexlectures@cs.msu.ru

    • В теме письма должно встречаться слово LinuxNetwork2024

LecturesCMC/LinuxNetwork2024/08_ApplicationSystem (последним исправлял пользователь FrBrGeorge 2024-04-05 22:44:35)