【问题标题】:Ftps server doesn't work properly using kubernetes使用 kubernetes 的 Ftps 服务器无法正常工作
【发布时间】:2020-06-12 22:19:11
【问题描述】:

我在 ftps-filezilla 和 Kubernetes 上遇到了好几个星期的问题。

上下文

我有一个使用 Kubernetes 和 ftps 的学校项目。 我需要在 kubernetes 的 21 端口创建一个 ftps 服务器,它需要在 alpine linux 上运行。 因此,我使用 docker 容器创建了我的 ftps-alpine 服务器的映像。 我测试它,如果它自己正常工作: 使用docker run --name test-alpine -itp 21:21 test_alpine 我在 filezilla 中有这个输出:

    Status: Connecting to 192.168.99.100:21…
    Status: Connection established, waiting for welcome message…
    Status: Initializing TLS…
    Status: Verifying certificate…
    Status: TLS connection established.
    Status: Logged in
    Status: Retrieving directory listing…
    Status: Calculating timezone offset of server…
    Status: Timezone offset of server is 0 seconds.
    Status: Directory listing of “/” successful

它工作成功,filezilla 看到我的 ftps 目录中的文件 我现在很好(在活动模式下工作)。

问题

所以我想要的是在我的 kubernetes 集群中使用我的图像(我使用 Minikube)。 当我将 docker 映像连接到 kubernetes 中的入口服务部署时,我有:

    Status: Connecting to 192.168.99.100:30894…
    Status: Connection established, waiting for welcome message…
    Status: Initializing TLS…
    Status: Verifying certificate…
    Status: TLS connection established.
    Status: Logged in
    Status: Retrieving directory listing…
    Command:    PWD
    Response:   257 “/” is the current directory
    Command:    TYPE I
    Response:   200 Switching to Binary mode.
    Command:    PORT 192,168,99,1,227,247
    Response:   500 Illegal PORT command.
    Command:    PASV
    Response:   227 Entering Passive Mode (172,17,0,5,117,69).
    Command:    LIST
    Error:  The data connection could not be established: EHOSTUNREACH - No route to host
    Error:  Connection timed out after 20 seconds of inactivity
    Error:  Failed to retrieve directory listing

设置


ingress.yaml :

    kind: Ingress
    metadata:
    annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    namespace: default
    name: ingress-controller
    spec:
    backend:
    serviceName: my-nginx
    servicePort: 80
    backend:
    serviceName: ftps-alpine
    servicePort: 21

ftps-alpine.yml :

    apiVersion: v1
    kind: Service
    metadata:
    name: ftps-alpine
    labels:
    run: ftps-alpine
    spec:
    type: NodePort
    ports:

    port: 21
    targetPort: 21
    protocol: TCP
    name: ftp21
    port: 20
    targetPort: 20
    protocol: TCP
    name: ftp20
    selector:
    run: ftps-alpine
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: ftps-alpine
    spec:
    selector:
    matchLabels:
    run: ftps-alpine
    replicas: 1
    template:
    metadata:
    labels:
    run: ftps-alpine
    spec:
    - name: ftps-alpine
    image: test_alpine
    imagePullPolicy: Never
    ports:
    - containerPort: 21
    - containerPort: 20

我做了什么

  • 当我看到错误消息:错误:数据连接无法 建立:EHOSTUNREACH - 没有路由来托管谷歌它,我明白了 这条信息 : FTP in passive mode : EHOSTUNREACH - No route to host .而且我已经在活动模式下运行了我的 ftps 服务器。
  • 更改 vsftpd.conf 文件和我的服务:
vsftpd.conf :

    seccomp_sandbox=NO
    pasv_promiscuous=NO
    listen=NO
    listen_ipv6=YES
    anonymous_enable=NO
    local_enable=YES
    write_enable=YES
    local_umask=022
    dirmessage_enable=YES
    use_localtime=YES
    xferlog_enable=YES
    connect_from_port_20=YES
    chroot_local_user=YES
    #secure_chroot_dir=/vsftpd/empty
    pam_service_name=vsftpd
    pasv_enable=YES
    pasv_min_port=30020
    pasv_max_port=30021
    user_sub_token=$USER
    local_root=/home/$USER/ftp
    userlist_enable=YES
    userlist_file=/etc/vsftpd.userlist
    userlist_deny=NO
    rsa_cert_file=/etc/ssl/private/vsftpd.pem
    rsa_private_key_file=/etc/ssl/private/vsftpd.pem
    ssl_enable=YES
    allow_anon_ssl=NO
    force_local_data_ssl=YES
    force_local_logins_ssl=YES
    ssl_tlsv1=YES
    ssl_sslv2=NO
    ssl_sslv3=NO
    allow_writeable_chroot=YES
    #listen_port=21

我确实将我的 kubernetes 的节点端口更改为 30020 和 30021,并将它们添加到容器端口。 我更改了 pasv 最小端口和最大端口。 我添加了我的 minikube ip 的 pasv_adress。 没什么用。

问题

除了我的 kubernetes 集群,我如何才能成功获得第一条消息?

如果您有任何问题需要澄清,没问题。

更新

感谢 coderanger,我提前了,但有这个问题:

Status: Connecting to 192.168.99.100:30894...
Status: Connection established, waiting for welcome message...
Status: Initializing TLS...
Status: Verifying certificate...
Status: TLS connection established.
Status: Logged in
Status: Retrieving directory listing...
Command:    PWD
Response:   257 "/" is the current directory
Command:    TYPE I
Response:   200 Switching to Binary mode.
Command:    PASV
Response:   227 Entering Passive Mode (192,168,99,100,178,35).
Command:    LIST
Error:  The data connection could not be established: ECONNREFUSED - Connection refused by server

【问题讨论】:

    标签: docker kubernetes port ftps vsftpd


    【解决方案1】:

    首先,您需要将被动端口范围修复为实际的端口 20,就像您在服务中设置的那样:

    pasv_min_port=20
    pasv_max_port=20
    

    然后您需要覆盖 pasv_address 以匹配用户应该连接的任何 IP,选择您的节点 IP 之一。

    【讨论】:

    • 感谢您的帮助,我在 vsftpd 文件中进行了一些更改:pasv_min 和 max 为 20 和 pasv_adress=my_minikuke_ip 但有:命令:PASV 响应:227 进入被动模式(172,17, 0,6,117,69)。命令:LIST 错误:无法建立数据连接:EHOSTUNREACH - 没有到主机的路由
    • pasv_address=192.168.99.100.
    • 227 Entering Passive Mode (192,168,99,100,4,37)
    【解决方案2】:

    它适用于以下更改:

    apiVersion: v1
        kind: Service
        metadata:
          name: ftps-alpine
          labels:
            run: ftps-alpine
        spec:
          type: NodePort
          ports:
          - port: 21
            targetPort: 21
            nodePort: 30025
            protocol: TCP
            name: ftp21
          - port: 20
            targetPort: 20
            protocol: TCP
            nodePort: 30026
            name: ftp20
          - port: 30020
            targetPort: 30020
            nodePort: 30020
            protocol: TCP
            name: ftp30020
          - port: 30021
            targetPort: 30021
            nodePort: 30021
            protocol: TCP
            name: ftp30021
          selector:
            run: ftps-alpine
        ---
    
        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: ftps-alpine
        spec:
          selector:
            matchLabels:
              run: ftps-alpine
          replicas: 1
          template:
            metadata:
              labels:
                run: ftps-alpine
            spec:
              containers:
              - name: ftps-alpine
                image: test_alpine
                imagePullPolicy: Never
                ports:
                - containerPort: 21
                - containerPort: 20
                - containerPort: 30020
                - containerPort: 30021
    

    对于 vsftpd.conf :

    seccomp_sandbox=NO
    pasv_promiscuous=NO
    listen=YES
    listen_ipv6=NO
    anonymous_enable=NO
    local_enable=YES
    write_enable=YES
    local_umask=022
    dirmessage_enable=YES
    use_localtime=YES
    xferlog_enable=YES
    connect_from_port_20=YES
    chroot_local_user=YES
    #secure_chroot_dir=/vsftpd/empty
    pam_service_name=vsftpd
    pasv_enable=YES
    pasv_min_port=30020
    pasv_max_port=30021
    user_sub_token=$USER
    local_root=/home/$USER/ftp
    userlist_enable=YES
    userlist_file=/etc/vsftpd.userlist
    userlist_deny=NO
    rsa_cert_file=/etc/ssl/private/vsftpd.pem
    rsa_private_key_file=/etc/ssl/private/vsftpd.pem
    ssl_enable=YES
    allow_anon_ssl=NO
    force_local_data_ssl=YES
    force_local_logins_ssl=YES
    ssl_tlsv1=YES
    ssl_sslv2=NO
    ssl_sslv3=NO
    allow_writeable_chroot=YES
    #listen_port=21
    pasv_address=#minikube_ip#
    

    【讨论】:

    • NodePort 类型的 2 个服务对象名称分别为 ftp30021ftp30020 是否有任何特殊原因?
    • 不,我随机选择名字。我可以给它们起不同的名字。
    • 我想问的是端口3002030021上是否存在这个2xNodePorts。他们有必要吗?您是否尝试在使用活动模式时不使用它们?
    • 是的,我现在在集群中使用 pasv 模式。我确实尝试在我的部署中删除 2 端口,但它不起作用。如果可能,我会尽量简化。
    猜你喜欢
    • 2012-01-20
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 2013-03-22
    • 2017-06-02
    • 2015-10-27
    • 2016-12-30
    • 2014-12-28
    相关资源
    最近更新 更多