Назад | Перейти на главную страницу

Как отладить, почему Pure FTPd не может привязаться к IP-адресу?

Я создаю Dockerized систему, которая будет создавать и отключать различные типы серверов в HTTP API для целей тестирования интеграции. Я начинаю свой проект с экспериментов по созданию и запуску нескольких FTP-серверов одновременно.

Я хочу запускать FTP-серверы на разных IP-адресах, чтобы тесты могли создавать и отключать серверы, не мешая друг другу. В будущем это должно позволить при необходимости распараллеливать тесты.

В моем контейнере Docker я настроил различные сети в соответствии с этой конфигурацией Docker Compose:

version: '2'
services:

  missive-box-of-tricks:
    image: missive-box-of-tricks
    networks:
      network-01:
        aliases:
        - network-01
      network-02:
        aliases:
        - network-02
      network-03:
        aliases:
        - network-03
      network-04:
        aliases:
        - network-04
      network-05:
        aliases:
        - network-05
      (trimmed - there's 10 of these)

networks:
  network-01:
    driver: bridge
  network-02:
    driver: bridge
  network-03:
    driver: bridge
  network-04:
    driver: bridge
  network-05:
    driver: bridge
  (trimmed - there's 10 of these)

Это приводит к набору сетей внутри контейнера (снова обрезанных):

~ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:14:00:02  
          inet addr:172.20.0.2  Bcast:172.20.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:27 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:3249 (3.1 KiB)  TX bytes:0 (0.0 B)

eth1      Link encap:Ethernet  HWaddr 02:42:AC:16:00:02  
          inet addr:172.22.0.2  Bcast:172.22.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:27 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:3249 (3.1 KiB)  TX bytes:0 (0.0 B)

eth2      Link encap:Ethernet  HWaddr 02:42:AC:15:00:02  
          inet addr:172.21.0.2  Bcast:172.21.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:27 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:3249 (3.1 KiB)  TX bytes:0 (0.0 B)

eth3      Link encap:Ethernet  HWaddr 02:42:AC:17:00:02  
          inet addr:172.23.0.2  Bcast:172.23.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:27 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:3249 (3.1 KiB)  TX bytes:0 (0.0 B)

eth4      Link encap:Ethernet  HWaddr 02:42:AC:18:00:02  
          inet addr:172.24.0.2  Bcast:172.24.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:27 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:3249 (3.1 KiB)  TX bytes:0 (0.0 B)

Сетевые псевдонимы разрешимы, поэтому я ожидаю, что FTP-сервер сможет прослушивать network-01 и т.д. Я использую эту команду для запуска сервера изнутри контейнера:

PUBLIC_HOST=network-01

# -P -Force the specified IP address in reply to a PASV/EPSV/SPSV command
# -S -Connections are accepted on the specified IP and port
# -l -This is the authentication type, in the form "protocol:path"
# -E -Only allow authenticated users (if you wanted anonymous only you would substitute -e).
# -j -If the user doesn't have a home directory create it at first login.
# -R -Disallow the usage of the chmod command.
# -B -Instruct the standalone server to start in the background
# -g -Custom pidfile location (defaults to /var/run/pure-ftpd.pid)
# -d Verbose logging

/usr/sbin/pure-ftpd \
    -S $PUBLIC_HOST \
    -p $MIN_PASV_PORT:$MAX_PASV_PORT \
    -g $PID_FILE \
    -l $USER_DB \
    -d \
    -E \
    -j \
    -R

Я сбросил PID и файлы базы данных пользователей, чтобы избежать конфликта, но на самом деле даже один сервер не запускается. Я получаю такую ​​ошибку:

Невозможно запустить автономный сервер: адрес недоступен

Я получу то же самое, если добавлю декларацию PASV:

-P $PUBLIC_HOST \

Я также получу то же самое, если укажу IP-адрес явно, а не использую переменную среды.

Итак, почему этот IP-адрес недоступен? Есть ли другой способ создать диапазон IP-адресов внутри среды Docker, а затем привязать экземпляр PureFTP для прослушивания только одного?

Это решено. Для прослушивания определенного IPv4-адреса нельзя просто использовать чистый IP-адрес, а разделитель портов в виде двоеточия не распознается.

Допустимые синтаксисы используют запятую, например, для порта по умолчанию и конкретного порта соответственно:

-S 192.168.0.42,
-S 192.168.0.42,8021