Linux系统中FTP服务详解

本文详细介绍了Linux系统中如何配置和管理VSFTPD服务,包括FTP的主动和被动模式,以及如何设置匿名用户、本地用户权限、监听地址和日志记录。通过示例展示了关闭匿名用户、限制本地用户权限、启用写权限和禁锢用户家目录的配置步骤,确保FTP服务的安全性和可控性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

VSFTP 是“very secure FTP daemon”的缩写,安全性是它的一个最大的特点。vsftpd是一款在linux发行版本中最受推崇的FTP服务器程序。

特点是小巧轻快,安全易用。

FTP模式:ftp主动模式(port):21(验证,握手),20(数据传输)

ftp被动模式(pasv):21(验证,握手),1024-65535(数据传输),一般的FTP服务器都采用此模式作为默认模式

FTP的客户端:命令行客户端:ftp/lftp(可以兼容shell的快捷操作)/sftp图形工具: IE/firefox/cute-ftp/filezilla(win/linux)

查看是否装包:
[root@desktopx ~]# rpm -q vsftpd

vsftpd-3.0.2-22.el7.x86_64

安装软件:

yum install vsftpd
[root@desktopx ~]# rpm -ql vsftpd
/etc/logrotate.d/vsftpd         ----日志轮转
/etc/pam.d/vsftpd ----pam模块验证
/etc/vsftpd ----配置目录
/etc/vsftpd/ftpusers         ----访问控制列表
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf         ----主配置文件
/usr/lib/systemd/system/vsftpd.service ----启动脚本
/usr/sbin/vsftpd ----二进制命令
/var/ftp ----匿名用户的默认家目录
/var/ftp/pub ----匿名用户的公共目录
systemctl restart vsftpd
查看连接端口:
[root@desktopx ~]# netstat -tnpl |grep :21
tcp6 0 0 :::21 :::* LISTEN 4774/vsftpd
yum install ftp lftp ----安装ftp客户端
iptables -F ----清空防火墙
setenforce 0

实例1:关闭匿名用户登录

vim /etc/vsftpd/vsftpd.conf

anonymous_enable=NO -    ---是否允许匿名用户访问

测试:使用网页访问ftp://172.16.0.X 否
使用命令的客户端访问:
创建一个本地用户:
useradd ftp01 ----创建用户
echo 123 |passwd --stdin ftp01 ----授予密码
ftp 172.16.0.X
ftp01 ----用户
123 ----密码

实例2:关闭本地用户登录,开启匿名用户登录

anonymous_enable=YES
local_enable=NO ----是否开启本地用户
测试:
网页 可登陆
本地 不可登录
[root@desktopx ~]# ftp 172.16.0.251
Connected to 172.16.0.251 (172.16.0.251).
220 (vsFTPd 3.0.2)
Name (172.16.0.251:root): ftp01
530 This FTP server is anonymous only. ----仅支持匿名用户登录
Login failed.
ftp>
ftp> user anonymous ----匿名用户登录
331 Please specify the password.
Password: ----回车,不输入密码
230 Login successful.
ftp> ls
227 Entering Passive Mode (172,16,0,251,196,29).
150 Here comes the directory listing.
drwxr-xr-x 5 0 0 78 Mar 27 10:29 pub
226 Directory send OK.
ftp>

实例3:本地用户的写权限

local_enable=YES
write_enable=NO
[root@desktopx ~]# ftp 172.16.0.251
Connected to 172.16.0.251 (172.16.0.251).
220 (vsFTPd 3.0.2)
Name (172.16.0.251:root): ding
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir ftp ----创建一个目录(测试是否成功)

实例4:本地用户文件生成码

local_umask=020
touch 10.txt
chmod 777 10.txt
ftp 172.16.0.251
ding
123
put 10.txt
实例5:开启匿名用户的上传和下载功能

yum install lftp

anon_upload_enable=YES
anon_mkdir_write_enable=YES
chmod 777 /var/ftp/pub
[root@desktopx ~]# lftp 172.16.0.251
lftp 172.16.0.251:~> cd pub ----进入pub目录
cd ok, cwd=/pub
lftp 172.16.0.251:/pub> put ding-1
lftp 172.16.0.251:/pub> ls
drwxrwxrwt 2 0 0 4096 Mar 26 11:17 2018-03-19
drwxrwxrwx 2 0 0 331 Mar 27 12:26 2018-03-27
drwxrwxrwx 2 0 0 226 Mar 23 01:54 cherrytree
-rw------- 1 14 50 0 Apr 03 06:54 ding-1
-rw-r--r-- 1 0 0 4952 Mar 21 07:06 man.config
实例6:不能给用户或匿名用户的家目录完全权限
chmod 777 /var/ftp
[root@desktopx ~]# lftp 172.16.0.251
lftp 172.16.0.251:~> ls
ls: Login failed: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
lftp 172.16.0.251:~>exit
chmod 755 /var/ftp
[root@desktopx ~]# lftp 172.16.0.251
lftp 172.16.0.251:~> ls
drwxrwxrwx 6 0 0 104 Apr 03 06:54 pub
实例7:添加message
[root@desktopx ~]# vim /home/ftp01/.message
[root@desktopx ~]# ftp 172.16.0.251
Connected to 172.16.0.251 (172.16.0.251).
220 (vsFTPd 3.0.2)
Name (172.16.0.251:root): ftp01
331 Please specify the password.
Password:^C
530 Login incorrect.
[root@desktopx ~]#
[root@desktopx ~]# echo 123 |passwd --stdin ftp01
Changing password for user ftp01.
passwd: all authentication tokens updated successfully.
[root@desktopx ~]# ftp 172.16.0.251
Connected to 172.16.0.251 (172.16.0.251).
220 (vsFTPd 3.0.2)
Name (172.16.0.251:root): ftp01
331 Please specify the password.
Password:
230-嘿~!兄弟,你确定要来我家ftp吗?            ----vim /home/ftp01/.message 里的内容
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
xferlog_enable=YES ----是否开启上传、下载ftp日志
connect_from_port_20=YES ----是否开启20号端口
实例8:匿名用户上传之后文件修改所有者
48 chown_uploads=YES                 ----开启修改属性功能
49 chown_username=ftp01                 ----修改所有者为ftp01 用户
xferlog_file=/var/log/xferlog         ----ftp日志存放的位置
idle_session_timeout=600 ----空闲回话超时时间600s
data_connection_timeout=120 ----数据传输超时连接120s
ftp的欢迎语
86 ftpd_banner=Welcome to Uplooking FTP service.
[root@desktopx ~]# ftp localhost
Trying ::1...
Connected to localhost (::1).
220 Welcome to Uplooking FTP service.
Name (localhost:root): ftp01
331 Please specify the password.
Password:
实例9:禁锢家目录(本地用户)
100 chroot_local_user=YES ----是否禁锢用户家目录(限制所有本地用户)
启动禁锢列表
101 chroot_list_enable=YES ----禁锢用户列表
102 # (default follows)
103 chroot_list_file=/etc/vsftpd/chroot_list (黑名单)
三个选项全开,只放通列表中的用户不被禁锢家目录(白名单)
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
实例10:修改本地用户或者匿名用户的家目录:
/var/ftp anonymous匿名用户登录的家目录
$HOME 本地用户的家目录(ding ===$HOME===/home/ding)
先给匿名用户和本地用户重新创建家目录
[root@desktopx ~]# mkdir /anon
[root@desktopx ~]# cp /etc/hosts /anon/
[root@desktopx ~]# mkdir /local
[root@desktopx ~]# cp /etc/passwd /local
然后到配置文件中指定他们的家
#chroot_local_user=YES
#chroot_list_enable=YES
#chroot_list_file=/etc/vsftpd/chroot_list
anon_root=/anon
local_root=/local
重启服务
systemctl restart vsftpd
测试:本地用户测试结果
[root@desktopx ~]# ftp 172.16.0.251
Connected to 172.16.0.251 (172.16.0.251).
220 (vsFTPd 3.0.2)
Name (172.16.0.251:root): ftp01
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (172,16,0,251,234,58).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 3373 Apr 03 08:43 passwd
实例11:基于不同端口号的虚拟主机访问
listen_port=21 默认
需求:
匿名用户访问可以是21端口
本地用户访问的端口是2121端口
解决需求方法:启动两个实例
生成两个配置文件
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd2.conf
[root@desktopx ~]# grep -v '#' /etc/vsftpd/vsftpd.conf |grep -v '^$'
anonymous_enable=YES
local_enable=NO
write_enable=YES
local_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
chown_uploads=YES
chown_username=ftp01
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
anon_root=/anon
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
[root@desktopx ~]# grep -v '#' /etc/vsftpd/vsftpd2.conf |grep -v '^$'
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
local_root=/local
listen=NO
listen_port=2121
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
启动服务:
生成启动文件
[root@desktopx ~]# cp /usr/lib/systemd/system/vsftpd.service /usr/lib/systemd/system/vsftpd2.service
vim /usr/lib/systemd/system/vsftpd2.service
1 [Unit]
2 Description=Vsftpd ftp daemon
3 After=network.target
4
5 [Service]
6 Type=forking
7 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd2.conf
8
9 [Install]
10 WantedBy=multi-user.target
[root@desktopx ~]# systemctl restart vsftpd
[root@desktopx ~]# systemctl restart vsftpd2
测试:
1、查看端口
21
2121
[root@desktopx ~]# netstat -tnpl |grep :21
tcp6 0 0 :::21 :::* LISTEN 8000/vsftpd
tcp6 0 0 :::2121 :::* LISTEN 8008/vsftpd
2、21号端口是不是只有匿名可以登录,匿名用户的家目录是不是/anon目录看到hosts文件
[root@desktopx ~]# ftp 172.16.0.251
Connected to 172.16.0.251 (172.16.0.251).
220 (vsFTPd 3.0.2)
Name (172.16.0.251:root): ding
530 This FTP server is anonymous only.
Login failed.
3、2121端口是否仅本地用户登录,以及家目录是否为/local,文件为passwd
[root@desktopx ~]# ftp 172.16.0.251 2121
Connected to 172.16.0.251 (172.16.0.251).
220 (vsFTPd 3.0.2)
Name (172.16.0.251:root): ding
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (172,16,0,251,240,251).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 3373 Apr 03 08:43 passwd
226 Directory send OK.ftp> 实例12:基于不同ip地址的虚拟主机:
ftp>
实例12:基于不同ip地址的虚拟主机:
[root@desktopx ~]# netstat -tnpl |grep :21tcp 0 0 172.16.0.251:21 0.0.0.0:* LISTEN 2421/vsftpd tcp 0 0 192.168.0.251:2121 0.0.0.0:* LISTEN 2430/vsftpd

需求:我们是基于msgplus业务用户的共享服务访问,其次网管网与客服网络进行分离,客服网络监听在10.1.1.1/24地址,

网管网需要监听在172.16.0.1/24的地址,并且限制业务用户只能在$HOME内共享文件,配置信息如下:

cat /etc/vsftpd/vsftpd.conf |grep -v '#' |grep -v "^$"

anonymous_enable=NO------禁止使用匿名登录

local_enable=YES------开启本地用户登录

write_enable=YES

local_umask=022

dirmessage_enable=YES

xferlog_enable=YES------开启日志

xferlog_file=/var/log/xferlog

connect_from_port_20=YES

xferlog_std_format=YES

chroot_local_user=YES------禁锢用户家目录

listen=YES

listen_address=10.1.1.1------监听客服网络地址

listen_ipv6=NO

pam_service_name=vsftpd

userlist_enable=YES

tcp_wrappers=YES

 

cat /etc/vsftpd/vsftpd2.conf |grep -v '#' |grep -v "^$"

anonymous_enable=NO------禁止使用匿名登录

local_enable=YES------开启本地用户登录

write_enable=YES

local_umask=022

dirmessage_enable=YES

xferlog_enable=YES------开启日志

xferlog_file=/var/log/xferlog

connect_from_port_20=YES

xferlog_std_format=YES

chroot_local_user=YES------禁锢用户家目录

listen=YES

listen_address=10.1.1.1------监听网管网络地址

listen_ipv6=NO

pam_service_name=vsftpd

userlist_enable=YES

tcp_wrappers=YES

 

生成两个监听的启动文本

 cp /u/usr/lib/systemd/system/vsftpd.service /usr/lib/systemd/system/vsftpd2.service

vim  /usr/lib/systemd/system/vsftpd2.service

  1 [Unit]

  2 Description=Vsftpd ftp daemon

  3 After=network.target

  4

  5 [Service]

  6 Type=forking

  7 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd2.conf----将启动控制的配置文件修改为vsftpd2的配置文件

  8

  9 [Install]

 10 WantedBy=multi-user.target

3)配置完成之后添加对应的ip地址之后,就可以启动vsftpd及vsftpd

systemctl  restart  vsftpd

systemctl  restart  vsftpd2

查看监听:

[root@localhost ~]# netstat -tnpl |grep :21

tcp        0      0 172.16.0.1:21           0.0.0.0:*               LISTEN      38321/vsftpd        

tcp        0      0 10.1.1.1:21             0.0.0.0:*               LISTEN      38314/vsftpd 

Linuxftp命令详解 FTP> ! 从 ftp系统退出到外壳。 FTP> ? 显示 ftp 命令说明。? 与 help 相同。 格式:? [command] 说明:[command]指定需要帮助的命令名称。如果没有指定 command,ftp 将显示全部命令的列表。 FTP> append 使用当前文件类型设置将本地文件附加到远程计算机上的文件。 格式:append local-file [remote-file] 说明:local-file 指定要添加的本地文件。 remote-file 指定要添加 local-file 的远程计算机上的文件。如果省略了 remote-file,本地文件名将被用作远程文件名。 FTP> ascii 将文件传送类型设置为默认的 ASCII。 说明:FTP 支持两种文件传送类型,ASCII 码和二进制图像。在传送文本文件时应该使用ASCII。 FTP> bell 切换响铃以在每个文件传送命令完成后响铃。默认情况下,铃声是关闭的。 FTP> binary(或bi) 将文件传送类型设置为二进制。 FTP> bye(或by) 结束与远程计算机的 FTP 会话并退出 ftpFTP> cd 更改远程计算机上的工作目录。 格式:cd remote-directory 说明:remote-directory 指定要更改的远程计算机上的目录。 FTP> close 结束与远程服务器的 FTP 会话并返回命令解释程序。 FTP> debug 切换调试。当调试打开时,发送到远程计算机的每个命令都打印,前面是字符串“>”。默认情况下,调试是关闭的。 FTP> delete 删除远程计算机上的文件。 格式:delete remote-file 说明:remote-file 指定要删除的文件。 FTP> dir 显示远程目录文件和子目录列表。 格式:dir [remote-directory] [local-file] 说明:remote-directory 指定要查看其列表的目录。如果没有指定目录,将使用远程计算机中的当前工作目录。Local-file 指定要存储列表的本地文件。如果没有指定,输出将显示在屏幕上。 FTP> disconnect 从远程计算机断开,保留 ftp 提示。 FTP> get 使用当前文件转换类型将远程文件复制到本地计算机。 格式:get remote-file [local-file] 说明:remote-file 指定要复制的远程文件。 Local-file 指定要在本地计算机上使用的名称。如果没有指定,文件将命名为 remote-file。 FTP >glob 切换文件名组合。组合允许在内部文件或路径名中使用通配符(*和?)。默认情况下,组合是打开的。 FTP >hash 切换已传输的每个数据块的数字签名 (#) 打印。数据块的大小是2048 字节。默认情况下,散列符号打印是关闭的。 FTP >help 显示 ftp 命令说明。 格式:help [command] 说明:command 指定需要有关说明的命令的名称。如果没有指定 command,ftp 将显示全部命令的列表。 FTP >lcd 更改本地计算机上的工作目录。默认情况下,工作目录是启动 ftp 的目录。 格式:lcd [directory] 说明:directory 指定要更改的本地计算机上的目录。如果没有指定directory,将显示本地计算机中当前的工作目录。 FTP >literal 将参数逐字发送到远程 FTP 服务器。将返回单个的 FTP 回复代码。 格式:literal argument [ ...] 说明:argument 指定要发送到 FTP 服务器的参数。 FTP >ls 显示远程目录文件和子目录的缩写列表。 格式:ls [remote-directory] [local-file] 说明:remote-directory 指定要查看其列表的目录。如果没有指定目录,将使用远程计算机中的当前工作目录。 local-file 指定要存储列表的本地文件。如果没有指定,输出将显示在屏幕上。 FTP >mdelete 删除远程计算机上的文件。 格式:mdelete remote-files [ ...] 说明:remote-files 指定要删除的远程文件。 FTP >mdir 显示远程目录文件和子目录列表。可以使用 mdir 指定多个文件。 格式:mdir remote-files [ ...] local-file 说明:remote-files 指定要查看列表的目录。必须指定 remote-files。请键入 - 使用远程计算机上的当前工作目录。 local-file 指定要还原列表的本地文件。请键入- 在屏幕上显示列表。 FTP >mget 使用当前文件传送类型将远程文件复制到本地计算机。 格式:mget remote-files [ ...] 说明:remote-files 指定要复制到本地计算机的远程文件。 FTP >mkdir 创建远程目录。 格式:mkdir directory 说明:directory 指定新的远程目录的名称。 FTP >mls 显示远程目录文件和子目录的缩写列表。 格式:mls remote-files [ ...] local-file 说明:remote-files 指定要查看列表的文件。必须指定 remote-files; 请键入- 使用远程计算机上的当前工作目录。 local-file 指定要存储列表的本地文件。请键入 - 以在屏幕上显示列表。 FTP >mput 使用当前文件传送类型将本地文件复制到远程计算机上。 格式:mput local-files [ ...] 说明:local-files 指定要复制到远程计算机的本地文件 FTP >open 与指定的 FTP 服务器连接。 格式:open computer [port] 说明:computer 指定要连接的远程计算机。可以通过 IP 地址或计算机名称指定计算机(DNS 或主机文件必须可用)。如果自动登录打开(默认),ftp 还将尝试自动将用户登录到 FTP 服务器port 指定用来联系 FTP 服务器的端口号。 FTP >prompt 切换提示。如果关闭提示时 mget 及 mput 传送所有文件,Ftp在多文件传送过程中将提示允许您有选择地检索或存储文件。默认情况下,提示是 打开的。 FTP >put 使用当前文件传送类型将本地文件复制到远程计算机上。 格式:put local-file [remote-file] 说明:local-file 指定要复制的本地文件。 remote-file 指定要在远程计算机上使用的名称。如果没有指定,文件将命名为 local-file。 FTP >pwd 显示远程计算机上的当前目录。 FTP >quit 结束与远程计算机的 FTP 会话并退出 ftpFTP >quote 将参数逐字发送到远程 FTP 服务器。将返回单个的 FTP 回复代码。 Quote 与 literal 相同。 格式:quote argument [ ...] 说明:argument 指定要发送到 FTP 服务器的参数。 FTP >recv 使用当前文件传送类型将远程文件复制到本地计算机。Recv 与 get相同。 格式:recv remote-file [local-file] 说明:remote-file 指定要复制的远程文件。 local-file 指定要在本地计算机上使用的名称。如果没有指定,文件将命名为 remote-file。 FTP >remotehelp 显示远程命令帮助。 格式:remotehelp [command] 说明:command 指定需要帮助的命令的名称。如果没有指定 command,ftp将显示全部远程命令的列表。 FTP >rename 重命名远程文件。 格式:rename filename newfilename 说明:filename 指定要重命名的文件。 newfilename 指定新的文件名。 FTP >rmdir 删除远程目录。 格式:rmdir directory 说明:directory 指定要删除的远程目录的名称。 FTP >send 使用当前文件传送类型将本地文件复制到远程计算机上。Send 与put 相同。 格式:send local-file [remote-file] 说明:local-file 指定要复制的本地文件。 remote-file 指定要在远程计算机上使用的名称。如果没有指定,文件将命名为 local-file。 FTP >status 显示 FTP 连接和切换的当前状态。 FTP >trace 切换数据包跟踪。Trace 在运行 ftp 命令时显示每个数据包的路由。 FTP >type 设置或显示文件传送类型。 格式:type [type-name] 说明:type-name 指定文件传送类型。默认设置为 ascii。如果没有指定type-name,将显示当前的类型。 FTP >user 指定远程计算机的用户。 格式:user username [password] [account] 说明:user-name 指定登录到远程计算机所使用的用户名。password 指定 user-name 的密码。如果没有指定,但必须指定,ftp 会提示输入密码。 account 指定登录到远程计算机所使用的帐户。如果没有指定account,但是需要指定,ftp 会提示您输入帐户。 FTP >verbose 切换 verbose 模式。如果打开,将显示所有 ftp 响应。在文件传送完成后,将同时显示与传送效率有关的统计信息。默认情况下,verbose 是打开的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值