一、在VMware的RHEL6.9中搭建 ftp 服务器的基本步骤
1. 安装FTP服务器
rpm -qa | grep vsftpd #查看是否已安装vsftpd
yum -y install vsftpd #如果没有安装执行该命令安装
使用yum安装前需预先建立安装源,参见https://blog.csdn.net/ikaoni/article/details/103595047
2. 修改vsftpd服务配置文件(匿名用户有关配置)
vi /etc/vsftpd/vsftpd.conf #编辑vsftpd配置文件,包含以下内容
anonymous_enable=YES
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
3. 设置匿名用户主目录的权限
chown -Rf ftp /var/ftp/pub #将默认ftp目录的所有者改为ftp
ll -d /var/ftp/pub #查看目录权限
drwxr-xr-x. 3 ftp root 4096 10月 14 13:31 /var/ftp/pub #说明设置是正确的
4. 设置防火墙
RHEL6中的设置(iptables):
方法一:关闭防火墙(不推荐):service iptables stop #常用的有start, stop, status
方法二:不关闭iptables,设置规则:
(1)主动模式:
iptables -I INPUT -p tcp --dport 21 -j ACCEPT #开放命令端口21
iptables -I INPUT -p tcp --dport 20 -j ACCEPT #开放数据端口20
(2)被动模式:
iptables -I INPUT -p tcp --dport 21 -j ACCEPT #开放命令端口21
iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
vi /etc/sysconfig/iptables-config #编辑iptables配置文件,修改下面一行
IPTABLES_MODULES="ip_conntrack_ftp" #原来=后面是空串
为安全起见,还可以进一步配置数据端口,即去掉第二行(-m state --state这行),做如下修改:
vi /etc/vsftpd/vsftpd.conf #编辑vsftpd服务的配置文件
pasv_enable=YES #启用被动模式(注释掉也是被动模式)
pasv_min_port=3000 #数据端口号最小值
pasv_max_port=4000 #数据端口号最大值
iptables -I INPUT -p tcp --dport 3000:4000 -j ACCEPT #开放数据端口3000--4000
注意修改后保存和重启服务:
service iptables save #保存iptables规则(重启不丢失)
service iptables restart #重新启动iptables防火墙。
service vsftpd restart #重新启动vsftpd服务
由于OUTPUT默认是ACCEPT,不用再设置出口方向的规则了。在配置文件中,主动模式被动模式可以同时使用。具体采用哪一个决定于客户端,像FlashFXP、Xftp这些软件都可以在连接选项中选择主动模式还是被动模式。
RHEL7中的设置(firewall):
运行firewall-config命令打开firewall的GUI配置界面,默认当前区域是pub,在运行时和永久配置中勾选其中ftp项。
5. 设置SELinux
方法一:关闭SELinux(不推荐):setenforcing 0 #设置运行模式为permissive,这是临时起作用。
如果要永久有效(重启不丢失),需要编辑selinux配置文件:vi /etc/selinux/config,修改SELINUX=enforcing一行为:SELINUX=permissive
方法二:不关闭SELinux,设置策略:
getsebool -a | grep ftp #查看现有ftp策略条目,其中一条如下
allow_ftpd_full_access --> off #当前该条目设置是off
setsebool -P allow_ftpd_full_access=on #将该项改为on,-P表示永久生效(重启不丢失)
6. 启动 ftp 服务
RHEL6中的命令:
service vsftpd start #启动 ftp 服务
service vsftpd status #查看 ftp 服务状态,是否启动成功
service vsftpd stop #必要时停止服务
service vsftpd restart #必要时重启服务
chkconfig vsftpd on #设置 vsftpd 服务开机启动
chkconfig --list vsftpd #检查 vsftpd 在哪些级别启动
RHEL7中的命令:
systemctl start vsftpd
systemctl status vsftpd
systemctl stop vsftpd
systemctl restart vsftpd
systemctl enable vsftpd.service
systemctl list-units --type=service
二、C程序匿名访问ftp服务器出现的问题
1. 无法设置和获取服务器当前路径
bSuccess=FtpSetCurrentDirectory (hFtpSession, DIRECTORY); //设置服务器当前路径,返回FALSE,应为TRUE
FtpGetCurrentDirectory(hFtpSession, buffer, &bufsize); //获取服务器当前路径,返回buffer为空串,应为 "/"
解决方法:
hIntSession=InternetOpen (szAppName, INTERNET_OPEN_TYPE_PRECONFIG,
NULL, NULL, INTERNET_FLAG_ASYNC) ;
把最后一个参数INTERNET_FLAG_ASYNC改成 0 就可以了。大神説这个参数是异步标志,可能和FTP Server有关。
2. 无法获取服务器文件列表
hFind=FtpFindFirstFile (hFtpSession, TEMPLATE, &finddata, 0, 0) ; //返回hFind为NULL,不正确
解决方法:
getenforcing #查看当前SELinux运行模式
setenforcing 0 #将当前运行模式设置为Permissive
如果要永久设定为Permissive模式,还需要修改SELinux配置文件:
vi /etc/sysconfig/selinux #编辑SELinux配置文件
SELINUX=permissive #将这行原来的enforcing改为permissive
如果使用enforcing模式,需要设置策略,以后补充。