PHP+CMS+网站 / Web与技术 · 2011年09月12号 0

在OpenBSD上配置vsftpd

研究了一下在OpenBSD上配置vsftp服务器。之前一直觉得vsftpd的配置好难,对其中的一些配置感到很费解,所以都没有很好的配置过,反倒Serv-U和FileZilla就配置过几次。
ftp协议我就不说了,关键注意主动模式和被动模式的主要区别和用在什么情况下就好了现在的ftp服务器都提供了这两种模式的支持,如果两种都配置了,那选择哪种作为数据连接就取决于客户端的配置了。
在OpenBSD上安装vsftp很简单,pkg_add 就行了。下面来看看vsftpd的配置文件,路径是/etc/vsftpd.conf,我把大部分指令列出来,其中一些默认的是没有列在文件中的要自己添加,还有一些不常用到指令可以看帮助文件。

### Server settings
listen=YES                     #采用守护程序的形式启动
background=YES                 #启动后是否在后台运行
nopriv_user=nobody             #默认以nobody 为此服务的执行时使用的用户身份。这用户最好是一个专用的用户,而不是用户nobody
secure_chroot_dir=/usr/share/empty
#当vsftpd守护进程不需要访问文件系统时(即无登录用户时),这个目录将被作为一个安全的容器,vsftpd不能对它有读写权限。
#listen_address=               #vsftpd监听那个接口的ip,默认是所有
port_enable=YES                #打开主动模式
pasv_enable=YES                #打开被动模式
#pasv_addr_resolve=YES|NO      #在被动模式下是否可以使用域名来代表外网IP,服务器会去解析具体IP地址的。
#pass_address=                 #可以填IP地址,如果上一项是YES的话这里可以填上服务器的域名,如果服务器是在内网的,则填上服务器外网IP(这点很重要)。
listen_port=21
connect_from_port_20=YES       #在PORT模式下是否使用默认的20端口作为传输端口。
#ftp_data_port=20              #若在PORT模式下不使用默认的20数据端口,则在此处设定端口。
pasv_max_port=65400            #这项和下一项用于限定被动模式可以使用的数据端口范围。
pasv_min_port=65535
accept_timeout=60              #接受建立联机的超时设定,单位秒。
connect_timeout=60             #客户端空闲的超时时间。
data_connection_timeout=300    #空闲的数据连接的超时时间。
idle_session_timeout=300      #空闲(发呆用户)会话的超时时间
#ftpd_banner=                  #此参数定义了login banner string(登录欢迎语字符串)
#banner_file=                  #此项指定一个文本文件,当使用者登入时,会显示此该文件的内容,通常为欢迎话语或是说明。
ascii_download_enable=YES      #vsftpd默认是禁用ascii模式传输的。
ascii_upload_enable=YES
max_clients=0                  #最大并发连接数,0为不限制
max_login_fails=3              #最多可重试次数
max_per_ip=0                   #每ip最大连接数,0为不限

### secrue settings
#pam_service_name=vsftpd       #VSFTPD进行PAM认证时所使用的PAM配置文件名,默认值是vsftpd,默认PAM配置文件是/etc/pam.d/vsftpd,但在OpenBSD中是没有PAM的。

#ls_recurse_enable=NO          #允许使用”ls -R” 指令,在一个大型FTP站点的根目录下使用”ls – R”会消耗大量系统资源
hide_ids=YES                   #是否隐藏文件的所有者和组信息
write_enable=YES               #控制是否允许用户使用任何可以修改文件系统的FTP 的指令,比如STOR、DELE、RNFR、RNTO、MKD、RMD、APPE 以及SITE等。
#deny_file={*.mp3,*.avi}       #限制上传下载这些文件
#hide_file={.*,*.hide}         #隐藏这些文件
#lock_upload_files=NO          #如果设成YES的话,上传时续传可能会出问题。
#### vsftpd的用户分为三类:匿名用户、本地用户(local user)以及虚拟用户(guest)。
###anonymous’ settings
#anonymous_enable=YES           #允许匿名用户登录
#ftp_username=ftp               #匿名用户映射到该用户名,即匿名用户在系统中以该用户身份出现
#no_anon_password=NO            #控制匿名用户登录时是否需要密码
#deny_email_enable=NO           #拒绝使用banned_email_file参数指定文件中所列出的e-mail地址进行登录的匿名用户
#banned_email_file=/etc/vsftpd.banned_emails
#secrue_email_list_enable=YES   #匿名用户必需提供了email_password_fiel指定文件中的密码才能登录
#email_password_file=/etc/vsftpd.email_passwords
#anon_root=/var/ftp/            #设定匿名用户的根目录,但这个目录是不能让匿名用户有写入权限的,必须自己在/var/ftp目录中一个目录,让匿名这个目录有写入权限,匿名用户才能上传。
#anon_mkdir_write_enable=NO     #FTP匿名用户必需对新目录的上层目录拥有写权限
#anon_other_write_enable=NO     #控制匿名用户是否拥有除了上传和新建目录之外的其他权限,如删除、更名等
#anon _upload_enable=NO         #匿名用户要能上传文件,还需要两个条件:一,write_enable参数为YES;二,在文件系统上,FTP匿名用户对某个目录有写权限。
#anon_world_readable_only=YES   #控制是否只允许匿名用户下载可阅读文档,NO则允许匿名用户浏览整个服务器的文件系统。
#chmod_enable=YES               #是否允许更改文件的权限。
#chown_uploads=NO               #是否修改匿名用户所上传文件的所有权。
#chown_username=                #指定拥有匿名用户上传文件所有权的用户,不推荐用root
#anon_umask=077                 #匿名用户新增文件的umask 数值,默认值为077
#anon_max_rate=                 #设定用户速率单位是字节
### local user’s settings
local_enable=YES                #控制vsftpd所在的系统的用户是否可以登录vsftpd。
#local_root=                    #定义所有本地用户(虚拟用户的配置文件也适用)的根目录。当本地用户登入时,将进入到此目录下.
#user_config_dir=               #定义用户个人配置文件所在的目录。用户的个人配置文件为该目录下的同名文件。个人配置文件的格式与vsftpd.conf格式相同。
userlist_enable=YES             #此选项被激活后,VSFTPD将读取userlist_file参数所指定的文件中的用户列表
userlist_deny=NO                #决定禁止还是只允许由userlist_file指定文件中的用户登录FTP服务器,YES为禁止。
userlist_file=/etc/vsftpd.user_list #指出userlist_enable选项生效后,被读取的包含用户列表的文件,而除此以外的其他本地用户则不能登录。
chroot_local_user=YES           #将本地用户限制在自家目录中,NO则不限制,这个选项会影响到chroot_list_file的作用。
#passwd_chroot_enable=NO        #当此选项激活时,与chroot_local_user选项配合,chroot()容器的位置基于passwd文件中指定的目录
chroot_list_enable=YES          #允许读取chroot_list_file指定的文件,文件中的用户将会被限制在自家目录中
chroot_list_file=/etc/vsftpd.chroot_list
local_umask=022                 #地用户新增档案时的umask 数值。默认值为077
local_max_rate=0
### virtual user’s settings
#guest_enable=NO                #所有的非匿名登入者都视为guest,这里开启了虚拟用户功能
#guest_username=ftp             #定义VSFTPD的guest用户在系统中的用户名
#virtual_use_local_privs=NO     #虚拟用户使用与本地用户相同的权限,当此参数关闭(NO)时,虚拟用户使用与匿名用户相同的权限
### log settings
#xferlog_enable=YES|NO          #控制是否启用一个日志文件,用于详细记录上传和下载
#vsftpd_log_file=/var/log/vsftpd.log  #日志文件
#log_ftp_protocol=YES|NO        #当此选项激活后,所有的FTP请求和响应都被记录到日志中。提供此选项时,xferlog_std_format不能被激活
#xferlog_std_format=YES|NO      #控制日志文件是否使用与wu-ftp相同的的格式
#xferlog_file=/var/log/xferlog  #当使用xferlog_std_forma时,这个选项设定该种记录传输日志的文件名

设置基本就是以上这些,虚拟用户的设置还没有试过,我测试的主要是本地用户登录。
建立两个本地用户,一个能上传和修改,一个只能浏览和下载,它们的主目录是一样的,主要的区别是上传的用户具有对主目录的写权限,而另外一个没有。
在测试过程中出现了一些错误,在连续上传几个文件时就出错:

错误: 无法打开传输通道。原因:通常每个套接字地址(协议/网络地址/端口)只允许使用一次。
错误: 上传失败

响应: 500 OOPS: vsf_sysutil_bind
命令: PORT 192,168,27,30,255,250
响应: 500 OOPS: child died

在网上没找到解决方法,后来在客户端上改大了用于连接的端口范围后问题解决了。