【FTP】FTP Server实现

58 阅读1分钟

服务端实现代码

采用apache ftpserver实现

依赖

<dependencies>
    <dependency>
        <groupId>org.apache.ftpserver</groupId>
        <artifactId>ftpserver-core</artifactId>
        <version>1.1.1</version>
    </dependency>
</dependencies>

ExplicitFTPSServer

开启隐式ssl连接

package com.macrosan;

import org.apache.ftpserver.DataConnectionConfigurationFactory;
import org.apache.ftpserver.FtpServer;
import org.apache.ftpserver.FtpServerFactory;
import org.apache.ftpserver.listener.Listener;
import org.apache.ftpserver.listener.ListenerFactory;
import org.apache.ftpserver.ssl.SslConfigurationFactory;
import org.apache.ftpserver.usermanager.ClearTextPasswordEncryptor;
import org.apache.ftpserver.usermanager.PasswordEncryptor;
import org.apache.ftpserver.usermanager.PropertiesUserManagerFactory;

import java.io.File;

public class ExplicitFTPSServer {

    public static void main(String[] args) {
        try {
            // 创建 FTP 服务器工厂
            FtpServerFactory serverFactory = new FtpServerFactory();

            // 设置监听器
            ListenerFactory factory = new ListenerFactory();

            // 设置监听器仅绑定 IPv4 地址
            factory.setServerAddress("0.0.0.0");

            // 配置 SSL
            SslConfigurationFactory ssl = new SslConfigurationFactory();
            ssl.setKeystoreFile(new File("/root/ftp-test/keystore.jks"));  // 替换为您的keystore文件路径
            ssl.setKeystorePassword("123456");  // 替换为您的keystore密码
            factory.setSslConfiguration(ssl.createSslConfiguration());
            factory.setImplicitSsl(false); // 设置为显式 SSL

            // 配置数据连接
            DataConnectionConfigurationFactory dataConFactory = new DataConnectionConfigurationFactory();
            dataConFactory.setPassivePorts("1200-1210"); // 设置数据连接端口范围
            factory.setDataConnectionConfiguration(dataConFactory.createDataConnectionConfiguration());

            // 设置监听器端口
            factory.setPort(21);  // 显式 FTPS 使用 21 端口
            Listener explicitSslListener = factory.createListener();
            serverFactory.addListener("default", explicitSslListener);

            // 设置用户管理
            PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory();
            userManagerFactory.setFile(new File("users.properties"));  // 用户配置文件
            PasswordEncryptor passwordEncryptor = new ClearTextPasswordEncryptor();
            userManagerFactory.setPasswordEncryptor(passwordEncryptor);
            serverFactory.setUserManager(userManagerFactory.createUserManager());


            // 启动服务器
            FtpServer server = serverFactory.createServer();
            server.start();

            System.out.println("FTP 服务器启动,显式 FTPS 端口: 21");
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

users.properties

# admin user
ftpserver.user.admin.userpassword=admin
ftpserver.user.admin.homedirectory=/root/ftp-test/ftpserver  # 修改目录
ftpserver.user.admin.enableflag=true
ftpserver.user.admin.writepermission=true
ftpserver.user.admin.maxloginnumber=10
ftpserver.user.admin.maxloginperip=2
ftpserver.user.admin.idletime=300

客户端连接

客户端使用FileZilla,下载链接:filezilla-project.org/download.ph…

image.png

数据包传输情况

image.png