FTP服务一般运行在20和21两个端口。端口20用于在客户端和服务器之间传输数据流,而端口21用于传输控制流,并且是命令通向ftp服务器的进口。当数据通过数据流传输时,控制流处于空闲状态。

 

FTP有两种使用模式:主动和被动。主动模式要求客户端和服务器端同时打开并且监听一个端口以建立连接。在这种情况下,客户端由于安装了防火墙会产生一些问题。所以,创立了被动模式。被动模式只要求服务器端产生一个监听相应端口的进程,这样就可以绕过客户端安装了防火墙的问题。

 

  一个主动模式的FTP连接建立要遵循以下步骤:

 

  1.客户端打开一个随机的端口(端口号大于1024,在这里,我们称它为x),同时一个FTP进程连接至服务器的21号命令端口。此时,源端口为随机端口x,在客户端,远程端口为21,在服务器。

 

  2.客户端开始监听端口(x+1),同时向服务器发送一个端口命令(通过服务器的21号命令端口),此命令告诉服务器客户端正在监听的端口号并且已准备好从此端口接收数据。这个端口就是我们所知的数据端口。

 

  3.服务器打开20号源端口并且建立和客户端数据端口的连接。此时,源端口为20,远程数据端口为(x+1)。

 

  4.客户端通过本地的数据端口建立一个和服务器20号端口的连接,然后向服务器发送一个应答,告诉服务器它已经建立好了一个连接。

 

FTP的缺陷 

 1.密码和文件内容都使用明文传输,可能产生不希望发生的窃听。

 

  2.因为必须开放一个随机的端口以建立连接,当防火墙存在时,客户端很难过滤处于主动模式下的FTP流量。这个问题通过使用被动模式的FTP得到了很大解决。

 

  3.服务器可能会被告知连接一个第三方计算机的保留端口。

 

  FTP虽然可以被终端用户直接使用,但是它是设计成被FTP客户端程序所控制。

 

  运行FTP服务的许多站点都开放匿名服务,在这种设置下,用户不需要帐号就可以登录服务器,默认情况下,匿名用户的用户名是:“anonymous”。这个帐号不需要密码,虽然通常要求输入用户的邮件地址作为认证密码,但这只是一些细节或者此邮件地址根本不被确定,而是依赖于FTP服务器的配置情况。

vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序。特点是小巧轻快,安全易用。

应用实例
挂载光盘,安装vsftpd
[root@localhost ~]# mount /dev/cdrom /mnt/cdrom/
mount: block device /dev/cdrom is write-protected, mounting read-only
[root@localhost ~]# yum list vsftpd
Loaded plugins: rhnplugin, security
This system is not registered with RHN.
RHN support will be disabled.
cluster | 1.3 kB 00:00
clusterstorage | 1.3 kB 00:00
VT | 1.3 kB 00:00
server | 1.3 kB 00:00
Installed Packages
vsftpd.i386 2.0.5-12.el5 installed
此时显示已安装过


查看服务的配置信息
[root@localhost ftppart]# rpm -qc vsftpd
/etc/logrotate.d/vsftpd.log
/etc/pam.d/vsftpd
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf
/etc/vsftpd/vsftpd_conf_migrate.sh

启动服务
[root@localhost ~]# service ftpd start
为 vsftpd 启动 vsftpd: [确定]
查看端口,此时只有21号端口开放
[root@localhost ~]# netstat -utpln |grep ftp
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 5378/vsftpd

ftp的根目录位于/var/ftp,该目录下有个pub目录,是用于匿名用户访问的
使用匿名用户登陆,发现用户登陆的位置为ftp的根下,且只能在此目录下进行切换和下载文件
[root@localhost ftppart]# ftp 10.106.42.100
Connected to 10.106.42.100.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (10.106.42.100:user1): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
227 Entering Passive Mode (10,106,42,100,229,122)
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 4096 Mar 20 05:32 priv 该目录是后来创建的
drwxr-xr-x 2 0 0 4096 Mar 20 05:21 pub
226 Directory send OK.
ftp> !dir
lost+found public
ftp> cd pub
250 Directory successfully changed.
ftp> dir
227 Entering Passive Mode (10,106,42,100,252,19)
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Mar 20 05:21 anony 该文件是后来创建的
226 Directory send OK.
ftp> cd /var/ftp
550 Failed to change directory.
ftp> bye
221 Goodbye.

创建一个本地用户
[root@localhost ftppart]# useradd user1
[root@localhost ftppart]# echo "123"|passwd --stdin user1
Changing password for user user1.
passwd: all authentication tokens updated successfully.
此时登陆ftp,发现用户登入的目录为用户的家目录,且可以随便操作
[root@localhost ftppart]# ftp 10.106.42.100
Connected to 10.106.42.100.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (10.106.42.100:user1): user1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/user1"
ftp> cd /etc/httpd
250 Directory successfully changed.
ftp> pwd
257 "/etc/httpd"
ftp> bye
221 Goodbye.


新增加硬盘,用作FTP空间
建立公共目录 /mnt/ftppart/public 权限为只读
个人目录 /mnt/ftppart/home 每个人只有10M
速度限制 匿名 100k/s 本地1M/s
负载限制 同时在线用户20 每用户连接数2

添加一个新的硬盘,可以查看到新的硬盘信息
[root@localhost ~]# fdisk -l

Disk /dev/sda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 1288 10241437+ 83 Linux
/dev/sda3 1289 1543 2048287+ 82 Linux swap / Solaris

Disk /dev/sdb: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/sdb doesn't contain a valid partition table
将新的硬盘分区
[root@localhost ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.


The number of cylinders for this disk is set to 2610.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-2610, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-2610, default 2610):
Using default value 2610

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.


重新读取分区表
[root@localhost ~]# partprobe /dev/sdb
格式话硬盘
[root@localhost ~]# mkfs -t ext3 /dev/sdb1
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
2621440 inodes, 5241198 blocks
262059 blocks (5.00%) reserved for the super user
First data block=0

Maximum filesystem blocks=0
160 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000

Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 38 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.

创建挂载点,挂载硬盘
[root@localhost ~]# mkdir /mnt/ftppart
[root@localhost ~]# mount /dev/sdb1 /mnt/ftppart/

在ftppart目录下,创建public目录及其下的几个文件供匿名用户访问
[root@localhost ~]# cd /mnt/ftppart/
[root@localhost ftppart]# mkdir public
[root@localhost ftppart]# cd public/
[root@localhost ftppart]# touch f{1,2}
[root@localhost public]# dd if=/dev/zero of=f3 bs=1M count=5
5+0 records in
5+0 records out
5242880 bytes (5.2 MB) copied, 0.0422957 seconds, 124 MB/s
[root@localhost public]# ll -h
总计 5.1M
-rw-r--r-- 1 root root 0 03-20 12:33 f1
-rw-r--r-- 1 root root 0 03-20 12:33 f2
-rw-r--r-- 1 root root 5.0M 03-20 22:04 f3

创建个人目录
[root@localhost public]# cd ../

[root@localhost ftppart]# mkdir home
[root@localhost ftppart]# ll
总计 24
drwxr-xr-x 2 root root 4096 03-20 13:51 home
drwx------ 2 root root 16384 03-20 12:14 lost+found
drwxr-xr-x 2 root root 4096 03-20 12:33 public
添加本地登陆用户
[root@localhost ftppart]#useradd user2
[root@localhost ftppart]#echo"123"|passwd --stdin user2
用此用户登陆会发现该用户登陆的默认位置为该用户的家目录,
将其默认的登陆位置改为ftppart/home:
方法1:修改passwd文件下的用户家目录的位置,并将其原来家目录下的所有文件都拷贝到新的家目录中
[root@localhost ftppart]# vim /etc/passwd---->找到user2的信息,改为
user2:x:501:501::/mnt/ftppart/home/user2:/bin/bash
[root@localhost ftppart]# mv /home/* /mnt/ftppart/home/
方法2:在创建新本地用户的时候直接指明该用户的家目录
[root@localhost ftppart]# useradd user3 -d /mnt/ftppart/home/user3
方法3:修改用户的默认家目录位置,此后再创建用户就会使用新的家目录
[root@localhost ftppart]# useradd -D -b /mnt/ftppart/home
[root@localhost ftppart]# useradd user4
[root@localhost ftppart]# tail /etc/passwd
avahi-autoipd:x:100:101:avahi-autoipd:/var/lib/avahi-autoipd:/sbin/nologin
xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin
gdm:x:42:42::/var/gdm:/sbin/nologin
sabayon:x:86:86:Sabayon user:/home/sabayon:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
distcache:x:94:94:Distcache:/:/sbin/nologin
user1:x:500:500::/home/user1:/bin/bash
user2:x:501:501::/mnt/ftppart/home/user2:/bin/bash
user3:x:502:502::/mnt/ftppart/home/user3:/bin/bash
user4:x:503:503::/mnt/ftppart/home/user4:/bin/bash
 

liunx下搭建FTP服务器_数据流
磁盘配额
设置永久挂载并加入磁盘配额选项
[root@localhost ftppart]# vim /etc/fstab 加入
/dev/sdb1 /mnt/ftppart auto defaults,usrquota 0 0
 

liunx下搭建FTP服务器_客户端_02


重新挂载
[root@localhost ftppart]# mount
/dev/sda2 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
none on /proc/fs/vmblock/mountPoint type vmblock (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/sdb1 on /mnt/ftppart type ext3 (rw,usrquota)
/dev/hdc on /mnt/cdrom type iso9660 (ro)
做磁盘配额扫描,如果该目录是第一次扫描,需要-c,此时查看目录下多了个磁盘配额文件
[root@localhost ftppart]# quotacheck -augv -c
quotacheck: Scanning /dev/sdb1 [/mnt/ftppart] quotacheck: Cannot stat old user quota file: 没有那个文件或目录
quotacheck: Old group file not found. Usage will not be substracted.
done
quotacheck: Checked 17 directories and 16 files
quotacheck: Old file not found.

[root@localhost ftppart]# ll
总计 32
-rw------- 1 root root 7168 03-20 14:32 aquota.user
drwxr-xr-x 5 root root 4096 03-20 14:16 home
drwx------ 2 root root 16384 03-20 12:14 lost+found
drwxr-xr-x 2 root root 4096 03-20 12:33 public
针对每个用户做配额
[root@localhost ftppart]# edquota -u user2
[root@localhost ftppart]# edquota -p user2 user3
[root@localhost ftppart]# edquota -u user3
针对sdb1分区激活磁盘配额
[root@localhost ftppart]# quotaon /dev/sdb1
编辑开机脚本,启动自动生效
[root@localhost ftppart]# echo "quotaon /dev/sdb1" >/etc/rc.d/rc.local
[root@localhost ftppart]# vim /etc/rc.d/rc.local
 

liunx下搭建FTP服务器_服务器_03


修改vsftpd的主配置文件,写入以下选项、
[root@localhost ftppart]# vim /etc/vfstpd/vsftpd.conf
anon_root=/mnt/ftppart/public 修改匿名用户的家目录
auon_max_rate=100000 设置匿名用户的速率(默认为0,无限制)
local_max_rate=1000000 设置本地用户的速率
max_clients=20 设置客户端最大连接数量
max_per_ip=2 设置每用户的最大连接数
 

liunx下搭建FTP服务器_职场_04


重启服务
[root@localhost ftppart]# service vsftpd restart
关闭 vsftpd: [确定]
为 vsftpd 启动 vsftpd: [确定]

测试
匿名用户
 

 

liunx下搭建FTP服务器_客户端_05


本地用户user2
 

 

liunx下搭建FTP服务器_数据流_06 

 

liunx下搭建FTP服务器_职场_07

 

限速测试

liunx下搭建FTP服务器_客户端_08

liunx下搭建FTP服务器_客户端_09 

同时在线用户测试

 

liunx下搭建FTP服务器_休闲_10