最近需要配置一个支持ipv6的vsftpd服务,但只有ipv4的服务能正常工作。ipv6的客户端连上后,除了pwd命令可以执行外,其他命令都报550 Permission denied.Passive mode refused.的错误。经过一番琢磨后发现了问题的所在。下面我来描述下我遇到的问题及解决方法。希望能够帮助到有同样困扰的朋友。
[root@TD313 ~]# ftp 2090:db8:85a3:9812::34 8021
Connected to 2090:db8:85a3:9812::34 (2090:db8:85a3:9812::34).
220-Authorized uses only. All activity may be monitored and reported.
220
Name (2090:db8:85a3:9812::34:root): ftpbatch
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> ls
550 Permission denied.
550 Permission denied.
Passive mode refused.
ftp>
1. 本来在/etc/vsftpd/目录下创建两个配置文件,同时监听ipv4和ipv6。
vsftpd.conf
vsftpdv6.conf
按照提示,分别配置如下:
listen=YES
#listen_ipv6=YES
及
#listen=YES
listen_ipv6=YES
然后在两个配置文件中cmds_allowed都是支持这些命令:
FEAT,REST,CWD,LIST,MDTM,MKD,NLST,PASS,PASV,PORT,PWD,QUIT,RMD,SIZE,STOR,TYPE,USER,ACCT,CDUP,HELP,MODE,NOOP,REIN,STAT,STOU,STRU,SYST,RETR
但是这些配置虽然能使客服端使用ipv6的地址连接上服务端,却无法使用除了pwd之外的命令。报错信息如上。
2. 后来在客服端中打开debug模式,发现了两个命令,EPSV,LPSV
ftp> debug
Debugging on (debug=1).
ftp> ls
---> EPSV 2
550 Permission denied.
---> LPSV
550 Permission denied.
Passive mode refused.
ftp>
搜了下,原来cmds_allowed中的PASV只支持ipv4协议。EPSV才能同时支持ipv4及ipv6。可以参考:
https://superuser.com/questions/801514/in-ftp-what-are-the-differences-between-passive-and-extended-passive-modes
3. 最后在listen_ipv6的配置文件的cmds_allowed配置项中添加了EPSV及LPSV。然后就能成功使用ls,cd这样的命令,能成功上传文件了。(我觉得把PASV换成EPSV就能解决问题了,但还没有尝试。)