如何调试为什么 Pure FTPd 无法绑定到 IP 地址?

如何调试为什么 Pure FTPd 无法绑定到 IP 地址?

我正在构建一个 Dockerised 系统,该系统将在 HTTP API 中创建和拆除各种服务器类型,以进行集成测试。我通过试验如何同时创建和运行多个 FTP 服务器来启动该项目。

我想在不同的 IP 地址上运行 FTP 服务器,这样测试就可以创建和拆除服务器而不会互相干扰。将来,如果需要,测试应该可以并行进行。

在我的 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 地址不可用? 还有其他方法可以在 Docker 环境中创建一系列 IP 地址,然后绑定一个 PureFTP 实例来监听其中一个吗?

答案1

这个问题已经解决。要监听特定的 IPv4 地址,不能只使用裸 IP 地址,而且冒号作为端口分隔符不会被识别。

有效的语法使用逗号,如下所示,分别表示默认端口和特定端口:

-S 192.168.0.42,
-S 192.168.0.42,8021

相关内容