ftps协议:
ftp over ssl,传输层是ftp协议,传输层与网络层之间是ssl协议,内容是加密的,但仍然存在控制链路、数据链路,服务端是vsftd进程,加载libssl.XXX相关动态库。
Linux下配置ftp服务支持ftps协议方法:
创建服务端ssl证书,必须是pem格式,包含私钥、证书:(不需要CA证书)
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout /etc/vsftpd.pem -out /etc/vsftpd.pem
修改/etc/vsftpd/vsftpd.conf配置:
ssl_enable=YES
rsa_cert_file=/etc/vsftpd.pem
ssl_tlsv1=YES
ssl_tlsv2=YES
重启ftp服务:
service vsftpd restart 或 service inetd restart
Linux下提供lftp工具做ftps客户端,ftps登录、传输过程只能通过debug方法看到交互记录,抓包看不到具体内容,请求、响应也都是加密的,这样带来一个问题,ftps客户端与服务端之间不能经过防火墙设备。port请求、pasv响应经过网关时,网关无法识别携带的IP、端口信息,也就无法做映射。
lftp> debug
lftp>open ftps://XXX:[email protected]:1310
lftp>dir
显示跟踪日志如下:
---- Resolving host address...
---- Connecting to 218.206.190.10 (218.206.190.10) port 1310
<--- 220 (vsFTPd 2.0.7)
……….
---> FEAT
---> AUTH TLS
<--- 234 Proceed with negotiation.
---- PASV
---- 227 Entering Passive Mode (10,248,12,151,235,76)
---- Connecting to 218.206.190.10 (218.206.190.10) port 60236 (235*256 + 76 = 60236)
............. 一直无法链接成功
<--- QUIT
服务端地址218.206.190.10:1310,网关ip地址218.206.190.10,登录过程使用控制链路没有问题;
执行pasv命令后,服务端返回(10,248,12,151,235,76)信息,都是服务端内网地址、端口;
客户端向网关IP(218.206.190.10)的60236端口建数据链路,一直无法成功。
普通ftp经过网关时,里面的ip、端口都由网关软件做过替换了,pasv响应消息里的内网ip、内网端口都转换成网关映射的ip、端口,ftps经过网关时,没法执行这个转换操作。解决方法,必须在网关做全端口映射,ip问题可以由配置解决,在/etc/lftpd.conf新增如下配置:
set ftp:ssl-allow on
set ftp:ssl-force on
set ftp:ssl-protect-data on
set ftp:ignore-pasv-address yes ---设置数据链路使用控制链路相同的IP,而不使用PASV返回的IP;默认为NO。
测试结果:
lftp :~> open ftps://xxxx:yyyy@218.206.190.10:1310
........................
---> PASV
<--- 227 Entering Passive Mode (10,1,128,123,3,223)
---- Address returned by PASV is ignored according to ftp:ignore-pasv-address setting
---- Connecting data socket to (10.254.255.123) port 991
---> LIST
<--- 150 File status okay; about to open data connection.
Sftp协议:
是ssh协议中一个单独协议,使用22端口,不区分控制链路、数据链路,内容是加密的,服务端是sshd进程,与vsftpd进程无关。通过抓包可以确认,登录、传输过程都使用22端口,因此不存在ftps那种不能过防火墙问题。