Redhat6.5 Linux Ftp 配置步骤.
理论基础
- 命令端口
- 数据端口
- 主动模式(PORT):客户端开端口,服务端连接客户端进行数据通讯
- 被动模式(PASV):服务端开端口,客户端连接服务端进行数据通讯(ftp实现并发靠的就是开多少个端口。感觉不是很合理,端口不能复用?可以用来限制并发)
- 命令
- USER
- PASS
- SIZE
- CWD
- PASV
- PORT
- PETR
- STOR
- REST
- QUIT
FTP服务安装启动
- 可以使用yum命令直接安装ftp
yum install vsftpd
- 开启关闭命令
service vsftpd start
service vsftpd stop
方式一:FTP虚拟用户配置
添加账号
增加用户
root用户执行
1 | # useradd -d /data1/ftp -s /sbin/nologin virtusers //增加用户virtusers,并制定virtusers用户的主目录为/data1/virtusers 。 创建一个用户提供给虚拟用户使用 |
查看用户信息
1 | cat /etc/passwd|grep virtusers |
修改VSFTPD配置
默认是被动模式:pasv_enable=YES
vi /etc/vsftpd/vsftpd.conf
1 | anonymous_enable=NO //不允许匿名账号访问 |
1 | vim ftpusers 最高级别黑名单 |
修改防火墙
cat /etc/sysconfig/iptables
1 | A INPUT -s 10.68.250.13 -m state --state NEW -m tcp -p tcp --dport 2021 -j ACCEPT |
设置虚拟FTP账号
虚拟账号它不是真实存在于系统中的,即/etc/passwd文件里没有的,它是借助于宿主账号virtusers。 奇数行是账号,偶数行是密码
1
2
3
4
5
6
7
8
9[root@infotech vsftpd]# cat virtusers
lteinfotech
lteinfotech1
ftpuser
1234888
docuser
1234888
docadmin
doc88888生成虚拟用户口令的db文件(设置600权限)
1
2[root@infotech vsftpd]# db_load -T -t hash -f /etc/vsftpd/virtusers /etc/vsftpd/virtusers.db
[root@infotech vsftpd]# chmod 600 /etc/vsftpd/virtusers.db锁定目录(非必要)
1
2[root@infotech vsftpd]# cat /etc/vsftpd/chroot_list //将虚拟用户放在这个列表文件里,说明这些用户登陆后都只能锁定到对应主目录内
docuser配置虚拟配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19[root@infotech vsftpd]# mkdir vconf //此目录名是在vsftpd.conf配置中指定的,里面是虚拟用户配置文件(文件名是虚拟用户名)
[root@infotech vconf]# pwd
/etc/vsftpd/vconf
[root@infotech vconf]# cat lteinfotech
local_root=/data1/document //指定虚拟账号登陆后的主目录,目录权限要是宿主账号virtusers,这样就可以实现账号映射。chown -R virtusers.virtusers /data1/ftp key是其他目录,但是要授权。可以为不同ftp账号分配不同目录
anonymous_enable=NO
write_enable=YES //写权限
local_umask=022
anon_upload_enable=NO //上传权限
anon_mkdir_write_enable=NO //创建目录权限
anon_other_write_enable=NO //删除和重命名权限
idle_session_timeout=300
data_connection_timeout=90
max_clients=1
max_per_ip=1
local_max_rate=0
pam_service_name=vsftpd
chroot_local_user=YES
virtual_use_local_privs=NO // 如果是NO使用anon权限,否则使用主账号权限系统其他配置
1
2
3
4
5[root@infotech vsftpd]# ll /lib64/security/pam_userdb.so
[root@infotech vsftpd]# cat /etc/pam.d/vsftpd //注释原先内容修改如下
#%PAM-1.0
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/virtusers
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/virtusers1
2[root@infotech vsftpd]# cat /etc/passwd|grep virtusers
virtusers:x:501:501::/data1/ftp:/sbin/nologin1
2
3
4
5
6
7
8
9
10
11
12
13
14[root@infotech vsftpd]# chown -R virtusers.virtusers /data1/document //设置虚拟账号指定的主目录的权限为virtusers,这样就可以映射到宿主账号
[root@infotech data1]# ll
鎬荤敤閲24
drwxr-xr-x 3 root root 4096 11鏈27 17:07 backup
drwxr-xr-x 2 root root 4096 3鏈 9 2018 blank
drwxr-xr-x 3 virtusers virtusers 4096 1鏈 3 10:53 document
drwxr-xr-x. 15 virtusers virtusers 4096 4鏈 13 2018 ftp
drwxr-xr-x 7 virtusers virtusers 4096 12鏈 3 11:12 north
drwxr-xr-x 9 root root 4096 4鏈 13 2018 transit
[root@infotech vsftpd]# chmod -R 700 /data1/document
[root@infotech vsftpd]# /etc/init.d/vsftpd start
[root@infotech vsftpd]# ll /data1/ftp/
方式二:建立一个新的FTP账号
root用户执行
1 | # useradd -d /data1/document docadmin //增加用户docadmin,并制定test用户的主目录为/data1/document |
1 | setfacl -R -m u:admin:rwx /data1/document --赋权admin账号对于document目录的权限 rwx 只读 只写 执行权限 |
主配置文件
1 | anonymous_enable=NO |
重启vsftpd服务后发现还是无法使用,通过如下修改可以使用
1 | [root@infotech vsftpd]# vi /etc/pam.d/vsftpd |
得出结论vsftpd虚拟用户和本地用户不能共存。有可以共存的策略把required
改成sufficient
1 | auth sufficient pam_userdb.so db=/etc/vsftpd/vuser_passwd |
Linux 客户端命令
在本机访问可以使用127.0.0.1或者本机ip。使用外网映射的ip是无法访问的。所以对于有的系统需要连接ftp服务器最好是提供配置像可以配置使用内部IP还是外部IP,有些组网情况下不可用。
1 | ftp 192.168.33.224 288 # ftp ip port |
FTP用户配置
不同网络环境下的应用
- 主动模式,客户端在虚拟机中需要使用桥接模式才能与服务端进行数据通信,被动模式的话不会有问题
- 主动模式,如果客户端在阿里云的话可能需要独立IP,阿里云默认使用的估计是NAT所以会报错
500 Illegal PORT command
- 主动模式,Client通过路由器访问外网,外网的Server增么范围内网开的数据端口的?
FTP Client → NAT → internet → NAT → FTP Server
这种情况,设备以主动模式访问FTP服务器时,由于NAT设备不会聪明的变更FTP包中的IP地址,从而导致无法访问服务器,防火墙也类似。NAT要对端口进行映射估计可以使用。
Port模式的FTP步骤如下:
- 客户端发送一个TCP
SYN(TCP同步)包给服务器段众所周知的FTP控制端口21,客户端使用暂时的端口作为它的源
端口; - 服务器端发送SYN ACK(同步确认)包给客户端,源端口为21,目的端口为客户端上使用的暂时端口;
- 客户端发送一个ACK(确认)包;客户端使用这个连接来发送FTP命令,服务器端使用这个连接来发送FTP应答;
- 当用户请求一个列表(List)请求或者发起一个要求发送或者接受文件的请求,客户端软件使用PORT命令,这个命令包含了一个暂时的端口,客户端希望服务器在打开一个数据连接时候使用这个暂时端口;PORT命令也包含了一个IP地址,这个IP地址通常是客户自己的IP地址,而且FTP也支持第三方(third-party)模式,第三方模式是客户端告诉服务器端打开与另台主机的连接;
- 服务器端发送一个SYN包给客户端的暂时端口,源端口为20,暂时端口为客户端在PORT命令中发送给服务器端的暂时端口号;
- 客户端以源端口为暂时端口,目的端口为20发送一个SYN ACK包;
- 服务器端发送一个ACK包;
- 发送数据的主机以这个连接来发送数据,数据以TCP段(注:segment,第4层的PDU)形式发送(一些命令,如STOR表示客户端要发送数据,RETR表示服务器段发送数据),这些TCP段都需要对方进行ACK确认(注:因为TCP协议是一个面向连接的协议)
- 当数据传输完成以后,发送数据的主机以一个FIN命令来结束数据连接,这个FIN命令需要另一台主机以ACK确认,另一台主机也发送一个FIN命令,这个FIN命令同样需要发送数据的主机以ACK确认;
- 客户端能在控制连接上发送更多的命令,这可以打开和关闭另外的数据连接;有时候客户端结束后,客户端以FIN命令来关闭一个控制连接,服务器端以ACK包来确认客户端的FIN,服务器同样也发送它的FIN,客户端用ACK来确认。
当使用FTP时候,网络中的防火墙必须要声明相应的端口,防火墙必须要跟踪FTP对话然后检查PORT命令,防火墙必须要参与从服务器端到客户端在PORT命令中指定的端口连接的建立过程。如果网络中使用了NAT(注:网络地址翻译),那么NAT的网关同样也需要声明相应的端口,网关需要把在PORT命令中指定的IP地址翻译成分配给客户的地址,然后重新计算TCP的Checksum;如果网关没有正确地执行这个操作,FTP就失败了。
黑客可能会利用FTP支持第三方特性这一特点,在PORT命令中设置IP地址和端口号参数来指定一台目标主机的地址和端口号(有时候称这种攻击为FTP反弹攻击),例如黑客可以让一台FTP服务器不断地从它的源端口20发送TCP SYN包给一系列目的端口,让FTP服务器看起来正在进行端口扫描,目的主机不知道攻击来自黑客的主机,看起来攻击象是来自FTP服务器。一些常用的FTP应用在PORT命令中设置地址为0.0.0.0,这样做的意图是让FTP服务器只需要与打开控制连接的相同客户进行数据连接,设置地址为0.0.0.0可能会让防火墙不知所措。
被动模式
- 设置端口范围
- 还要设置外网的IP
需要将命令端口和数据端口在路由器上映射到公网里,其中命令端口是21和22,数据端口是35001-35005。
还有一种称之为DMZ主机的把所有端口都映射到外网,不是很好的做法。
如果服务器在阿里云需要配置放行策略 云服务器ECS-网络和安全-安全组-配置规则-入方向
很多防火墙在设置的时候都是不允许接受外部发起的连接的,所以许多位于防火墙后或内网的FTP服务器不支持PASV模式,因为客户端无法穿过防火墙打开FTP服务器的高端端口;而许多内网的客户端不能用PORT模式登陆FTP服务器,因为从服务器的TCP 20无法和内部网络的客户端建立一个新的连接,造成无法工作。
设置5个PASV端口一般意味着单个客户端支持5个并发数据传输,其它的要排队等待。连接的组成是客户端IP+Port+服务端IP+Port。由于TCP连接断开可能出现TIME_WAIT一段时间不可用,所以可以通过使用多个端口或者其他模式保持可用状态。