сокетная автивация серверов

Настройка, программирование, распределённые вычисления

Модераторы: Olej, bellic, vikos

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

сокетная автивация серверов

Непрочитанное сообщение Olej » 28 апр 2023, 22:56

Этот метод (запуска снрверов) описан в документации systemd для администраторов, стр. 46:
11 Службы с активацией в стиле inetd
Более того, об этом было в теме xinetd + systemd, но ... это было в непрофильной теме + это было в 2012 году :-o

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

сокетная автивация серверов

Непрочитанное сообщение Olej » 28 апр 2023, 23:45

Olej писал(а):
28 апр 2023, 22:56
Этот метод (запуска снрверов) описан в документации
Точно так же, как и с кэширующим сервером DNS, разработчики systemd (Lennart Poettering с сотоварищи) не могли пройти мимо 40-летней истории успеха суперсерверов и запуска сервисов по сетевым запросам. В systemd этот способ запуска серверов получил название сокет-активации и его описание занимает в документации целую большую главу.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

сокетная автивация серверов

Непрочитанное сообщение Olej » 28 апр 2023, 23:56

В каталоге сервисов systemd есть несколько сценариев запуска сокетной активации. В принципе, мы могли бы рассматривать и использовать сценарии для SSH:

Код: Выделить всё

$ pwd
/usr/lib/systemd/system

$ ls ssh*
ssh.service  ssh@.service  ssh.socket
(Здесь 1-й сценарий ssh.service — это традиционный сценарий запуска SSH сервера, а вот 2 следующих: ssh@.service и ssh.socket — именно относятся к сокетной активации.)
Но для чистоты эксперимента мы создадим схему сокетной активации совсем другого сервера, которого не по умолчанию под управлением systemd, а именно — сервера протокола FTP.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

сокетная автивация серверов

Непрочитанное сообщение Olej » 28 апр 2023, 23:58

Olej писал(а):
28 апр 2023, 23:56
сервера протокола FTP
О признанной популярности протокола FTP говорит хотя бы просто перечень пакетов в репозиториях дистрибутивов:

Код: Выделить всё

$ aptitude search ftpd | grep -v tftp
p  ftpd - FTP-сервер
p  ftpd-ssl - FTP-сервер с поддержкой SSL
p  fusiondirectory-plugin-pureftpd - pureftpd plugin for FusionDirectory
p  fusiondirectory-plugin-pureftpd-schema - LDAP schema for FusionDirectory pureftpd plugin
p  gosa-plugin-pureftpd - pureftpd plugin for GOsa²
p  gosa-plugin-pureftpd-schema - LDAP schema for GOsa² pureftpd plugin
p  inetutils-ftpd - Сервер FTP
p  inetutils-ftpd:i386 - Сервер FTP
p  mysqmail-pure-ftpd-logger - real-time logging system in MySQL - Pure-FTPd traffic-logger
p  nordugrid-arc-gridftpd - ARC GridFTP server
p  owftpd - FTP daemon providing access to 1-Wire networks
v  proftpd - 
v  proftpd-abi-1.3.7c - 
p  proftpd-basic - Transitional dummy package for ProFTPD
p  proftpd-core - Versatile, virtual-hosting FTP daemon - binaries
p  proftpd-dev - Versatile, virtual-hosting FTP daemon - development files
p  proftpd-doc - Versatile, virtual-hosting FTP daemon - documentation
p  proftpd-mod-autohost - ProFTPD module mod_autohost
p  proftpd-mod-case - ProFTPD module mod_case
p  proftpd-mod-clamav - ProFTPD module mod_clamav
p  proftpd-mod-counter - ProFTPD module mod_counter
p  proftpd-mod-crypto - Versatile, virtual-hosting FTP daemon - TLS/SSL/SFTP modules
v  proftpd-mod-dnsbl - 
p  proftpd-mod-fsync - ProFTPD module mod_fsync
p  proftpd-mod-geoip - Versatile, virtual-hosting FTP daemon - GeoIP module
p  proftpd-mod-geoip2 - ProFTPD module mod_geoip2
p  proftpd-mod-ldap - Versatile, virtual-hosting FTP daemon - LDAP module
p  proftpd-mod-msg - ProFTPD module mod_msg
p  proftpd-mod-mysql - Versatile, virtual-hosting FTP daemon - MySQL module
p  proftpd-mod-odbc - Versatile, virtual-hosting FTP daemon - ODBC module
p  proftpd-mod-pgsql - Versatile, virtual-hosting FTP daemon - PostgreSQL module
p  proftpd-mod-proxy - ProFTPD module mod_proxy
p  proftpd-mod-snmp - Versatile, virtual-hosting FTP daemon - SNMP module
p  proftpd-mod-sqlite - Versatile, virtual-hosting FTP daemon - SQLite3 module
p  proftpd-mod-statsd - ProFTPD module mod_statsd
p  proftpd-mod-tar - ProFTPD module mod_tar
p  proftpd-mod-vroot - ProFTPD module mod_vroot
p  proftpd-mod-wrap - Versatile, virtual-hosting FTP daemon - tcpwrapper module
p  pure-ftpd - защищённый и эффективный FTP сервер
p  pure-ftpd-common - Pure-FTPd FTP server (Common Files)
p  pure-ftpd-ldap - защищённый и эффективный FTP-сервер с идентификацией пользователей через LDAP
p  pure-ftpd-mysql - Secure and efficient FTP server with MySQL user authentication
p  pure-ftpd-postgresql - Secure and efficient FTP server with PostgreSQL user authentication
p  python-pyftpdlib-doc - documentation for Python FTP server library
p  python3-pyftpdlib - Python FTP server library (Python 3)
p  twoftpd - простой и защищённый FTP-сервер (программы)
p  twoftpd-run - a simple secure efficient FTP server
p  vsftpd - легковесный, эффективный FTP-сервер, написанный с упором на безопасность
p  vsftpd-dbg - lightweight, efficient FTP server written for security (debug)
Как видим, представлено на выбор множество разных FTP серверов, можете выбрать для экспериментов любой (мне хорошо известны в разные годы proftpd, vsftpd, pure-ftpd, поэтому во избежание сюрпризов можете выбрать что-то из них):

Код: Выделить всё

$ sudo apt install pure-ftpd
Чтение списков пакетов… Готово
Построение дерева зависимостей… Готово
Чтение информации о состоянии… Готово
Следующие пакеты устанавливались автоматически и больше не требуются:
  libhiredis0.14 libmemcached11 libmemcachedutil2 proftpd-doc
Для их удаления используйте «sudo apt autoremove».
Будут установлены следующие дополнительные пакеты:
  openbsd-inetd pure-ftpd-common tcpd
Следующие пакеты будут УДАЛЕНЫ:
  proftpd-core
Следующие НОВЫЕ пакеты будут установлены:
  openbsd-inetd pure-ftpd pure-ftpd-common tcpd
...

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

сокетная автивация серверов

Непрочитанное сообщение Olej » 29 апр 2023, 00:01

Для организации сокетной активации этого сервера создадим 2 файла в каталоге сценариев systemd (всё это делаем с правами root):

Код: Выделить всё

# pwd
/usr/lib/systemd/system
# touch pure-ftpd.socket
# touch pure-ftpd@.service
И заполняем их следующим содержимым (сервис proftpd сам устанавливает при инсталляции свои сценарии сокетной активации, поэтому можете их взять за основу):

Код: Выделить всё

$ cat /usr/lib/systemd/system/pure-ftpd.socket
[Unit]
Description=pure-ftp FTP Server Activation Socket
Conflicts=pure-ftpd.service

[Socket]
ListenStream=21
Accept=true

[Install]
WantedBy=sockets.target

Код: Выделить всё

$ cat /usr/lib/systemd/system/pure-ftpd@.service
[Unit]
Description=pure-ftpd FTP Server
After=network-online.target

[Service]
ExecStart=-/usr/sbin/pure-ftpd 
StandardInput=socket
Собственно, на этом всё!

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

сокетная автивация серверов

Непрочитанное сообщение Olej » 29 апр 2023, 00:05

Olej писал(а):
29 апр 2023, 00:01
Собственно, на этом всё!
Но для таких экспериментов, или тестирования результатов своей работы, нужно тщательно убедиться, что никакой другой сервер FTP статически не конфигурирован в системе:

Код: Выделить всё

# systemctl status pure-ftpd
● pure-ftpd.service
     Loaded: loaded (/etc/init.d/pure-ftpd; generated)
     Active: active (exited) since Fri 2023-04-28 15:36:57 EEST; 1h 32min ago
       Docs: man:systemd-sysv-generator(8)
    Process: 19009 ExecStart=/etc/init.d/pure-ftpd start (code=exited, status=0/SUCCESS)
        CPU: 59ms

апр 28 15:36:57 R420 systemd[1]: Starting pure-ftpd.service...
апр 28 15:36:57 R420 pure-ftpd[19009]: Starting ftp server:
апр 28 15:36:57 R420 pure-ftpd[19019]: Running: /usr/sbin/pure-ftpd -l pam -E -J HIGH -u 1000 -O clf:/var/log/pure-ftpd/transfer.log -B
апр 28 15:36:57 R420 systemd[1]: Started pure-ftpd.service.
апр 28 15:36:57 R420 pure-ftpd[19020]: (?@?) [ERROR] Unable to start a standalone server: [Address already in use]
Это не должно быть сюрпризом: все проекты FTP стартуют сразу при инсталляции пакетов:

Код: Выделить всё

# systemctl stop pure-ftpd

# systemctl status pure-ftpd
○ pure-ftpd.service
     Loaded: loaded (/etc/init.d/pure-ftpd; generated)
     Active: inactive (dead) since Fri 2023-04-28 17:10:20 EEST; 2s ago
       Docs: man:systemd-sysv-generator(8)
    Process: 19009 ExecStart=/etc/init.d/pure-ftpd start (code=exited, status=0/SUCCESS)
    Process: 22165 ExecStop=/etc/init.d/pure-ftpd stop (code=exited, status=0/SUCCESS)
        CPU: 26ms
...
P.S. Не ищите сценарии запуска и установки в привычном каталоге /usr/lib/systemd/system — серверы FTP помещают свои скрипты управления «в старом стиле» в каталог /etc/init.d (команды systemd, к счастью, умеют так же хорошо находить и работать с сервисами конфигурированными «в старом стиле»).

Код: Выделить всё

$ ls -l /etc/init.d/ | grep ftp
-rwxr-xr-x 1 root root 5322 сен 19  2021 proftpd
-rwxr-xr-x 1 root root 3172 янв 31  2022 pure-ftpd
Кроме непосредственно самих сервисов FTP нужно остановить и inetd (xinetd) чтобы избежать маскирующего запуска FTP средствами суперсервера:

Код: Выделить всё

# systemctl status inetd
● inetd.service - Internet superserver
     Loaded: loaded (/lib/systemd/system/inetd.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2023-04-28 15:36:56 EEST; 1h 38min ago
       Docs: man:inetd(8)
   Main PID: 18954 (inetd)
      Tasks: 1 (limit: 115786)
     Memory: 548.0K
        CPU: 401ms
     CGroup: /system.slice/inetd.service
             └─18954 /usr/sbin/inetd
     
апр 28 15:36:56 R420 systemd[1]: Starting Internet superserver...
апр 28 15:36:56 R420 systemd[1]: Started Internet superserver.

Код: Выделить всё

# systemctl stop inetd

Код: Выделить всё

# systemctl status inetd
○ inetd.service - Internet superserver
     Loaded: loaded (/lib/systemd/system/inetd.service; enabled; vendor preset: enabled)
     Active: inactive (dead) since Fri 2023-04-28 17:15:25 EEST; 1s ago
       Docs: man:inetd(8)
    Process: 18954 ExecStart=/usr/sbin/inetd (code=exited, status=0/SUCCESS)
   Main PID: 18954 (code=exited, status=0/SUCCESS)
        CPU: 402ms
...
Окончательная проверка на чистоту эксперимента перед запуском созданного сервиса — здесь ничего не должно быть (в ответ):

Код: Выделить всё

# systemctl --full | grep ftp

# ps -A | grep ftp

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

сокетная автивация серверов

Непрочитанное сообщение Olej » 29 апр 2023, 00:06

Теперь запускаем свой cконфигурированный для FTP сервис (сокетной активации):

Код: Выделить всё

# systemctl start pure-ftpd.socket

# systemctl status pure-ftpd.socket
● pure-ftpd.socket - pure-ftp FTP Server Activation Socket
     Loaded: loaded (/lib/systemd/system/pure-ftpd.socket; disabled; vendor preset: enabled)
     Active: active (listening) since Fri 2023-04-28 17:14:27 EEST; 5s ago
     Listen: [::]:21 (Stream)
   Accepted: 0; Connected: 0;
      Tasks: 0 (limit: 115786)
     Memory: 8.0K
        CPU: 845us
     CGroup: /system.slice/pure-ftpd.socket
        
апр 28 17:14:27 R420 systemd[1]: Listening on pure-ftp FTP Server Activation Socket.

Всё! Сервер FTP в готовности и ожидании. Что мы и проверим с любого иного хоста LAN:

Код: Выделить всё

$ ftp 192.168.1.13
Connected to 192.168.1.13.
220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
220-You are user number 1 of 50 allowed.
220-Local time is now 17:19. Server port: 21.
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
Name (192.168.1.13:olej): olej
331 User olej OK. Password required
Password:
230 OK. Current directory is /home/olej
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/olej" is your current location
ftp> system
215 UNIX Type: L8
ftp> exit
221-Goodbye. You uploaded 0 and downloaded 0 kbytes.
221 Logout.
Здесь показана полная FTP-сессия в режиме диалога, от её начала до конца, как она происходила на клиентском компьютере. А на сервере во время этой сессии посмотрим:

Код: Выделить всё

$ systemctl --full | grep ftp
  pure-ftpd@0-192.168.1.13:21-192.168.1.241:48136.service  loaded active running   pure-ftpd FTP Server (192.168.1.241:48136)
  system-pure\x2dftpd.slice                                loaded active active    Slice /system/pure-ftpd
  pure-ftpd.socket                                         loaded active listening pure-ftp FTP Server Activation Socket

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

сокетная автивация серверов

Непрочитанное сообщение Olej » 29 апр 2023, 00:09

И наконец … «как вишенка на торте», я зайду по SSH на сервер linux-ru.ru, базирующийся за тысячи километров в Казахстане … как легко видеть, это арендуемый виртуальный сервер крупного регионального провайдера:

Код: Выделить всё

$ sudo inxi -Mxxx
Machine:   Type: Kvm System: QEMU product: Standard PC (i440FX + PIIX, 1996) v: pc-i440fx-bionic serial: N/A Chassis: type: 1 
           v: pc-i440fx-bionic serial: N/A 
           Mobo: N/A model: N/A serial: N/A BIOS: SeaBIOS v: 1.13.0-1ubuntu1.1 date: 04/01/2014 
$ ip -6 a s dev tun0
3: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 53049 state UNKNOWN qlen 500
    inet6 221:58c9:9a6:99be:f3d:c1ac:2b5b:9771/7 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::d86f:9577:d828:cb4d/64 scope link stable-privacy 
       valid_lft forever preferred_lft forever
Это вот ping ICMPv6 к хосту локальной сети на которой я веду отработку FTP (через тысячи километров, местного провайдера Интернет, роутер-шлюз выхода из локальной сети в Интернет — это к вопросу грядущей «прозрачности» IPv6):

Код: Выделить всё

$ ping -c3 21d:8a7c:aafa:f346:8115:14aa:9ca4:cd7f
PING 21d:8a7c:aafa:f346:8115:14aa:9ca4:cd7f(21d:8a7c:aafa:f346:8115:14aa:9ca4:cd7f) 56 data bytes
64 bytes from 21d:8a7c:aafa:f346:8115:14aa:9ca4:cd7f: icmp_seq=1 ttl=64 time=426 ms
64 bytes from 21d:8a7c:aafa:f346:8115:14aa:9ca4:cd7f: icmp_seq=2 ttl=64 time=118 ms
64 bytes from 21d:8a7c:aafa:f346:8115:14aa:9ca4:cd7f: icmp_seq=3 ttl=64 time=118 ms

--- 21d:8a7c:aafa:f346:8115:14aa:9ca4:cd7f ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 3ms
rtt min/avg/max/mdev = 117.950/220.699/426.072/145.220 ms
А вот клиентская сессия FTP в IPv6 из этого удалённого хоста к только что созданному серверу FTP с сокетной активацией:

Код: Выделить всё

$ ftp 21d:8a7c:aafa:f346:8115:14aa:9ca4:cd7f
Connected to 21d:8a7c:aafa:f346:8115:14aa:9ca4:cd7f.
220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
220-You are user number 1 of 50 allowed.
220-Local time is now 18:30. Server port: 21.
220 You will be disconnected after 15 minutes of inactivity.
Name (21d:8a7c:aafa:f346:8115:14aa:9ca4:cd7f:olej): olej
331 User olej OK. Password required
Password:
230 OK. Current directory is /home/olej
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> exit
221-Goodbye. You uploaded 0 and downloaded 0 kbytes.
221 Logout.

Ответить

Вернуться в «Сети»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей