关于在linux下配置vsftpd的ftp服务,网上有很多教程,但是我在64位linux下还是碰到了一些问题,最后总算解决了。
vsftpd的官方地址是:http://vsftpd.beasts.org/,目前最新的是版本是v2.1.2,但是我在用2.1.2的过程中,make的时候提示一些错误,undef VSF_BUILD_SSL才能make通过。后来放弃了使用最新版,下载了经典的v2.0.3版本。
首先查询源代码的一个头文件,改成都define各个包:
[root@sherpdatabak vsftpd-2.0.3]# cat builddefs.h
#ifndef VSF_BUILDDEFS_H
#define VSF_BUILDDEFS_H#define VSF_BUILD_TCPWRAPPERS
#define VSF_BUILD_PAM
#define VSF_BUILD_SSL#endif /* VSF_BUILDDEFS_H */
然后执行make,中间会碰到2个错误:
[root@sherpdatabak vsftpd-2.0.3]# make
/lib/libpam.so.0: could not read symbols: 文件格式错误
collect2: ld returned 1 exit status
/lib/libcap.so.1: could not read symbols: 文件格式错误
collect2: ld returned 1 exit status
其原因是64位的linux和32位的有些不同,要修改一下配置,把对应的地址从/lib/改为/lib64/:
[root@sherpdatabak vsftpd-2.0.3]# vi vsf_findlibs.sh
......
locate_library /lib64/libpam.so.0 && echo "/lib64/libpam.so.0";
locate_library /lib64/libcap.so.1 && echo "/lib64/libcap.so.1";
......
然后make通过并安装即可
[root@sherpdatabak vsftpd-2.0.3]# install -m 755 vsftpd /usr/local/sbin/vsftpd
[root@sherpdatabak vsftpd-2.0.3]# install -m 644 vsftpd.8 /usr/share/man/man8
[root@sherpdatabak vsftpd-2.0.3]# install -m 644 vsftpd.conf.5 /usr/share/man/man5
[root@sherpdatabak vsftpd-2.0.3]# install -m 644 vsftpd.conf /etc/vsftpd.conf
检查db包是否安装
[root@sherpdatabak vsftpd-2.0.3]# rpm -qa|grep db4
db4-4.2.52-7.3.el4
db4-devel-4.2.52-7.3.el4
db4-utils-4.2.52-7.3.el4
db4-4.2.52-7.3.el4
增加虚拟用户登录文件,注意这里的/etc/pam.d/ftp文件,也要用/lib64/路径下的验证文件才行,很多教程没有写这一点,导致在64位的linux下虚拟用户无法登录:
[root@sherpdatabak vsftpd-2.0.3]# cat /home/logins.txt
test
123
[root@sherpdatabak vsftpd-2.0.3]# db_load -T -t hash -f /home/logins.txt /etc/vsftpd_login.db
[root@sherpdatabak vsftpd-2.0.3]# chmod 600 /etc/vsftpd_login.db
[root@sherpdatabak vsftpd-2.0.3]# cat /etc/pam.d/ftp
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd_login
account required /lib64/security/pam_userdb.so db=/etc/vsftpd_login
[root@sherpdatabak vsftpd-2.0.3]# useradd -d /bkfiles -s /sbin/nologin vsftpd
[root@sherpdatabak vsftpd-2.0.3]# chown vsftpd.vsftpd /bkfiles
修改vsftpd配置文件:
[root@sherpdatabak vsftpd-2.0.3]# vi /etc/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
listen=YES
listen_port=21
max_clients=100
max_per_ip=5
idle_session_timeout=600
data_connection_timeout=120
accept_timeout=60
connect_timeout=60
tcp_wrappers=YES
guest_enable=YES
guest_username=vsftpd
virtual_use_local_privs=YES
#pam_service_name=ftp
chroot_local_user=YES
pasv_enable=YES
pasv_min_port=30998
pasv_max_port=30999
注意这里启用pasv模式,并且要在iptables中打开对应的端口,否则客户端软件在验证pasv模式时会无法登录从而改用port模式登录,具体选用什么模式要根据客户端和服务器的网络安全设置情况来决定。什么叫做PASV mode(被动模式传送)?FTP有2种模式,抄一段介绍如下:
Port模式:
当客户端C向服务端S连接后,使用的是Port模式,那么客户端C会发送一条命令告诉服务端S(客户端C在本地打开了一个端口N在等着你进行数据连接),当服务端S收到这个Port命令后 就会向客户端打开的那个端口N进行连接,这种数据连接就生成了。
Pasv模式:
当客户端C向服务端S连接后,服务端S会发信息给客户端C,这个信息是(服务端S在本地打开了一个端口M,你现在去连接我吧),当客户端C收到这个信息后,就可以向服务端S的M端口进行连接,连接成功后,数据连接也建立了。
从上面的解释中,可以看到两种模式主要的不同是数据连接建立的不同,对于Port模式,是客户端C在本地打开一个端口等服务端S去连接建立数据连接;而Pasv模式就是服务端S打开一个端口等待客户端C去建立一个数据连接。
然后就可以启动服务了:
[root@sherpdatabak vsftpd-2.0.3]# /usr/local/sbin/vsftpd /etc/vsftpd.conf &
[root@sherpdatabak vsftpd-2.0.3]# ps -ef | grep vsftpd
root 16477 1 0 Jun22 ? 00:00:00 /usr/local/sbin/vsftpd /etc/vsftpd.conf
总结一点,使用虚拟用户登录vsftpd的功能,在64位linux下的安装配置关键就是/lib64/这里的更改,其他参照网上的教程,应该都不会有什么问题。