感谢支持
我们一直在努力

Linux基础教程–架设FTP服务器[上部]

[此次FTP服务器的搭建为期真长,先前一直被一个小细节给困住,排了一整天的错都找不出答案,一直以为是目录权限或者配置文件出错,后来竟发现是空间不足导致,着实晕倒~恰逢去了清远的两天一日游,因此错开了这篇博文的时间段……]

一、FTP技术概览
1、FTP的简单概述与工作模式
2、FTP服务器的安装和配置文件
3、搭建FTP服务器,实现匿名用户可以下载、上传
4、搭建FTP服务器,允许匿名用户访问下载,但不可以上传,虚拟登陆用户
    twentyfour可以上传下载,但不得离开自家目录,配合iptables和
    tcp_wrapper做简单的安全策略
5、搭建FTP服务器,禁止匿名用户访问,实现公共用户public只可以访问下
    载共享目录文件share1 内部员工internal可以上传下载内部共享目录
    share2,所有用户不得离开默认目录,并且对客户端的连接数及下载速
    度做不同的限制
 
二、FTP的简单概述与工作模式

  1. FTPFile Transfer Protocol,文件传输协议)是TCP/IP协议簇的协议之一,FTP服务器能在网络上 提供文件传输服务,可以给用户提供上传和下载文件。FTP可以通过很多软件实现,如vsftpdProFTPpure-ftpd等。linux下面最常用的FTP服务器架设使用vsftpd软件,vsftpd 是一个基于GPL发布的FTP服务器软件,其中的vs是“ Very Secure”的缩写,RedHat默认安装的ftp服务器软件即为vsftpd
  2. FTP的工作模式分为standard模式(主动模式)和passive模式(被动模式)
    standard模式(主动模式):
    FTP客户端首先和FTP服务器的TCP21端口建立连接,传送数据时,服务器端通过TCP20端口连接到客户端指定的端口发送数据,FTP服务器必须主动跟客户端建立一个新的连接,以便传送数据。
    passive模式(被动模式):client开启大于1024的X端口连接服务器的21(命令端口),当21号端口连接成功后,client会发送PASV命令,通知服务器自己处于被动模式,服务器收到这个消息后,就会开放一个大于1024的端口Y通知client,client接到通知后就会用X+1来连接服务器的Y端口,简单的说就是client主动连接服务器
  3. 一般都是使用standard模式(主动模式),FTP服务器必须主动跟客户端建立连接。
     
    三、FTP服务器的安装和配置文件
  4. FTP服务器的安装
    [root@51cto ~]# rpm -aq |grep vsftpd
                                      //通过光盘带有的RPM包安装即可
    vsftpd-2.0.5-12.el5
    只有把vsftpd安装后就可以启动服务
    [root@51cto ~]# service vsftpd start    //开启ftp服务
    为 vsftpd 启动 vsftpd:                                    [确定]
    [root@51cto ~]# chkconfig –level 3 vsftpd on   
                                      //使得ftp在系统级别3默认开启
    [root@51cto ~]# netstat -antup |grep vsftpd             
                                      //查看vsftpd服务端口是否起来
    tcp    0   0 0.0.0.0:21      0.0.0.0:*            LISTEN      3737/vsftpd
    默认安装之后就可以实现匿名用户访问了
    先特别注意一个:
    暂时先关闭selinux
    [root@51cto ~]# setenforce 0
    关闭iptables
    [root@51cto ~]# service iptables stop
    清除防火墙规则:                                          [确定]
    把 chains 设置为 ACCEPT 策略:filter                      [确定]
    正在卸载 Iiptables 模块:                                  [确定]
  5.  在Windows中测试如下:RHCE253--架设FTP服务器[上部]www.linuxidc.com

FTP服务器的配置文件
 /etc/vsftpd/vsftpd.conf  主配置文件
 /etc/vsftpd/ftpusers     黑名单文件,优先级最高
 /etc/vsftpd/user_list    默认为黑名单,当userlist_deny=NO时为白名单
 /usr/share/doc/vsftpd-*/  vsftp服务器的模版和白皮书
 /etc/init.d/vsftpd       服务的脚本
 /usr/sbin/vsftpd         守护进程
 /etc/xinetd.d/vsftpd     xinetd进程启动的配置文件
 /usr/share/doc/vsftpd-*/vsftpd.xinetd  xinetd进程启动的配置模版
 /var/log/xferlog(默认)  /var/log/vsftpd.log   日志文件
对于上面的配置文件将在服务当中具体讲解对应的内容,先查看/etc/passwd文件
[root@51cto ~]# cat /etc/passwd |grep ftp
ftp :x:14:50:FTP User:/var/ftp:/sbin/nologin
vsftpd软件安装之后就自动在/etc/passwd文件中生成该虚拟用户,登陆shell为/sbin/nologin
所以匿名用户登陆ftp服务器实际使用的用户就是ftp用户,如下在Linux中登陆ftp
[root@51cto ~]# ftp 218.192.86.145
Connected to 218.192.86.145.
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 (218.192.86.145:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 “/”
ftp> ls
227 Entering Passive Mode (218,192,86,145,148,37)
150 Here comes the directory listing.
drwxrwxrwx    2 0        0            4096 Oct 18 02:47 pub
226 Directory send OK.
ftp> bye
221 Goodbye.
这里有一点特别注意的是所显示的/目录不是系统的根目录,而是ftp这个用户的自家目录,
即/var/ftp目录,如下查看该目录的权限:
[root@51cto ~]# ll -d /var/ftp/         //可以看出是755
drwxr-xr-x 3 root root 4096 09-27 21:46 /var/ftp/
我们在到ftp用户的自家目录下创建新目录,并在目录里创建新文件24.txt
[root@51cto ~]# cd /var/ftp/
[root@51cto ftp]# mkdir 51cto
[root@51cto ftp]# ll
总计 16
drwxr-xr-x 2 root root 4096 10-14 04:11 51cto
drwxr-xr-x 2 root root 4096 2007-12-13 pub
[root@51cto ftp]# cd 51cto/
[root@51cto 51cto]# vim 24.txt
[root@51cto 51cto]# ll
总计 8
-rw-r–r– 1 root root 19 10-14 04:12 24.txt
Windows中查看,是否能下载:
RHCE253--架设FTP服务器[上部]www.linuxidc.com
 
RHCE253--架设FTP服务器[上部]www.linuxidc.com
右键复制即可下载该文件。这里有一个问题特别说明的就是/var/ftp目录权限不能修改,不然无法登陆ftp了,如:
[root@51cto ~]# chmod 777 /var/ftp/
[root@51cto ~]# ll -d /var/ftp/
drwxrwxrwx 3 root root 4096 10-18 10:47 /var/ftp/
[root@51cto ~]# ftp 218.192.86.145
Connected to 218.192.86.145.
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 (218.192.86.145:root): ftp
331 Please specify the password.
Password:
500 OOPS: vsftpd: refusing to run with writable anonymous root
Login failed.
ftp> quit
[root@51cto ~]# chmod 755 /var/ftp
[root@51cto ~]# ll -d /var/ftp/
drwxr-xr-x 3 root root 4096 10-18 10:47 /var/ftp/
[root@51cto ~]# ftp 218.192.86.145
Connected to 218.192.86.145.
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 (218.192.86.145:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> bye
221 Goodbye.
总结:由此可看,只有安装好ftp服务器,开启服务器,那么我们就使用匿名用户登陆ftp服务器,该用户是ftp,登陆shell为/sbin/nologin,登陆到自家目录/var/ftp该目录的权限是755,不得修改权限,可以实现下载。
 
四、搭建FTP服务器,实现匿名用户可以下载、上传

  • 从上面已经知道,只要安装好vsftpd软件,开启ftp服务,就可以使用匿名用户登陆,下载
    文件,但是不可以使用上传:
    RHCE253--架设FTP服务器[上部]www.linuxidc.com650) this.width=650;” border=0>
    所以要现实匿名用户的上传权限,只要编辑FTP主配置文件将如下两行前的“#”去掉:
    #anon_upload_enable=YES
    #anon_mkdir_write_enable=YES
  • 最终该主配置文件如下:
    [root@51cto ~]# grep -v “#” /etc/vsftpd/vsftpd.conf
    anonymous_enable=YES
    local_enable=YES
    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
    xferlog_std_format=YES
    listen=YES
    pam_service_name=vsftpd
    userlist_enable=YES
    tcp_wrappers=YES
    重启FTP服务测试:
    [root@51cto ~]# /sbin/service vsftpd restart
    关闭 vsftpd:                                              [确定]
    为 vsftpd 启动 vsftpd:                                    [确定]
    到这里测试的时候会发现还是上传不了文件,那是因为目录权限的问题:
    [root@51cto ~]# ll -d /var/ftp/pub/
    drwxr-xr-x 2 root root 4096 10-18 11:31 /var/ftp/pub/
    [root@51cto ~]# ll -d /var/ftp/
    drwxr-xr-x 4 root root 4096 10-18 11:11 /var/ftp/
    对于匿名用户ftp来说是其他组用户,所以要修改/var/ftp/pub/为777,但不可以修改
    /var/ftp/的权限,不然就无法登陆FTP了:
    [root@51cto ~]# chmod 777 /var/ftp/pub/
    [root@51cto ~]# ll -d /var/ftp/pub/
    drwxrwxrwx 2 root root 4096 10-18 11:31 /var/ftp/pub/
    然后测试:
    RHCE253--架设FTP服务器[上部]www.linuxidc.com
    总结:要实现匿名用户可以上传,需在FTP主配置文件下确保如下两行:
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    并且赋予共享目录777的访问权限,就可以实现匿名用户的上传功能五、搭建FTP服务器,允许匿名用户访问下载,但不可以上传,虚拟登陆用户
    twentyfour可以上传下载,但不得离开自家目录,配合iptables和tcp_wrapper
    做简单的安全策略。
  • 如上禁止匿名用户上传,只要把主配置文件下面两行前面添加注释“#”:
    #anon_upload_enable=YES
    #anon_mkdir_write_enable=YES
  • 创建虚拟用户twentyfour
    [root@51cto ~]# useradd twentyfour -s /sbin/nologin
    [root@51cto ~]# passwd twentyfour
    Changing password for user twentyfour.
    New UNIX password:
    BAD PASSWORD: it is WAY too short
    Retype new UNIX password:
    passwd: all authentication tokens updated successfully.
    虚拟用户即为该用户可以访问FTP服务,但不能登陆Linux系统,查看虚拟用户:
    [root@51cto ~]# cat /etc/passwd |grep twentyfour
    twentyfour:x:502:502::/home/twentyfour:/sbin/nologin
    可见该虚拟用户的自家目录是/home/twentyfour,登陆shell为/sbin/nologin
    [root@51cto ~]# su – twentyfour
    This account is currently not available.
    可以看得出该虚拟用户是无法切换管理Linux系统的!
  • 实现虚拟用户上传下载功能
    RHCE253--架设FTP服务器[上部]www.linuxidc.com
     
    RHCE253--架设FTP服务器[上部]www.linuxidc.com
     
    Linux系统下用虚拟用户twentyfour登陆FTP服务器:
    [root@51cto ~]# ftp 218.192.86.145
    Connected to 218.192.86.145.
    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 (218.192.86.145:root): twentyfour
    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 (218,192,86,145,168,223)
    150 Here comes the directory listing.
    drwxr-xr-x    2 502      502          4096 Oct 18 04:49  登陆成功了
    226 Directory send OK.
    ftp> pwd
    257 “/home/twentyfour”
    ftp> cd /etc
    250 Directory successfully changed.
    ftp> mget passwd
    mget passwd? y
    227 Entering Passive Mode (218,192,86,145,191,109)
    150 Opening BINARY mode data connection for passwd (1834 bytes).
    226 File send OK.
    1834 bytes received in 0.00018 seconds (1e+04 Kbytes/s)
    ftp>
  • 从上面可以看到该虚拟用户登陆到FTP服务器的默认的目录是/home/twentyfour,并且可以离开自家目录切换到/etc下拷贝passwd文件,可见这是很不安全的,所以一定要限制任何登陆到FTP的用户不得离开默认的目录,这个限制方法第4点说明。现在是知道该虚拟用户可以
    下载默认目录的文件,但能否上传文件呢?先查看自家目录权限:
    [root@51cto ~]# ll -d /home/twentyfour/
    drwx—— 4 twentyfour twentyfour 4096 10-18 12:50 /home/twentyfour/
    该目录的所有者是虚拟用户twentyfour,所以是具有上传功能的,测试:
    RHCE253--架设FTP服务器[上部]www.linuxidc.com
    可以发现虚拟用户默认就具有上传下载功能的。
  • 解决不得离开自家目录问题(一定要做,安全起见)
    这里需要借助chroot_list功能限制登陆FTP的用户不得离开自家目录,只能在/目录下,
    具体做法是编辑FTP主配置文件,将如下两行前的“#”去掉:
    #chroot_list_enable=YES
    #chroot_list_file=/etc/vsftpd/chroot_list
    然后创建默认不存在的文件/etc/vsftpd/chroot_list,添加用户twentyfour:
    [root@51cto ~]# vim /etc/vsftpd/chroot_list
    [root@51cto ~]# cat /etc/vsftpd/chroot_list
    twentyfour
    这里要注意一个地方就是/etc/vsftpd/chroot_list每一行一个用户,凡是出现在该文件的
    用户登陆FTP就只能处于自家目录,无法访问系统文件。做完后重启FTP服务测试:
    [root@51cto ~]# /sbin/service vsftpd restart
    关闭 vsftpd:                                              [确定]
    为 vsftpd 启动 vsftpd:                                    [确定]
    [root@51cto ~]# ftp 218.192.86.145
    Connected to 218.192.86.145.
    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 (218.192.86.145:root): twentyfour
    331 Please specify the password.
    Password:
    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> pwd
    257 “/”
    ftp> ls
    227 Entering Passive Mode (218,192,86,145,205,193)
    150 Here comes the directory listing.
    -rw-r–r–    1 502      502        923095 Oct 18 04:56 51CTO下载-Linux运维趋势_第0期
    _运维自动化.pdf
    drwxr-xr-x    2 502      502          4096 Oct 18 04:49 登陆成功了
    226 Directory send OK.
    ftp> cd /etc
    550 Failed to change directory.
    ftp> bye
    221 Goodbye.
    如上可以看到该虚拟用户默认处于/目录下,也即是/home/twentyfour/目录,并且无法切换到
    其他目录,这样系统就安全很多了。
  • iptables和tcp_wrapper简答安全策略(具体的安全放在RHCE253最后讲述)
  • 通过iptables实现一条规则:
    匹配来自源为218.192.87.4的tcp包,连接自己的21号端口,匹配了的包就被REJECT
    首先查看iptables的状态:
    [root@51cto ~]# service iptables status
    表格:filter
    Chain INPUT (policy ACCEPT)
    num  target     prot opt source               destination
    Chain FORWARD (policy ACCEPT)
    num  target     prot opt source               destination
    Chain OUTPUT (policy ACCEPT)
    num  target     prot opt source               destination
    可以看出现在是没有任何策略机制,如下添加���令规则:
    [root@51cto ~]# iptables -A INPUT -s 218.192.87.4 -p tcp –dport 21 -j REJECT
    [root@51cto ~]# iptables -nL
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination
    REJECT     tcp    218.192.87.4         0.0.0.0/0   tcp dpt:21 reject-with icmp-port-unreachable
    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination
    [root@51cto ~]# service iptables save
    将当前规则保存到 /etc/sysconfig/iptables:                 [确定]
    [root@51cto ~]# service iptables restart
    清除防火墙规则:                                                            [确定]
    把 chains 设置为 ACCEPT 策略:filter                         [确定]
    正在卸载 Iiptables 模块:                                              [确定]
    应用 iptables 防火墙规则:                                           [确定]
    载入额外 iptables 模块:ip_conntrack_netbios_ns            [失败]
    218.198.87.4Windows中测试:
    RHCE253--架设FTP服务器[上部]www.linuxidc.com
     
    RHCE253--架设FTP服务器[上部]www.linuxidc.com
    可以发现218.198.87.4这个ip地址无法连接FTP服务器,如下去掉原先的规则:
  • [root@51cto ~]# iptables -D INPUT 1      //把第一条规则去掉
    [root@51cto ~]# iptables -nL
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination
    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination
    然后在Windows中再次测试:
    RHCE253--架设FTP服务器[上部]www.linuxidc.com
    去除iptables规则后又可以允许218.198.87.4这个ip地址连接FTP服务器了
  • 使用TCP Wrapper可以控制系统服务的存取,限制用户对系统服务访问
    Hosts.allow 允许访问的计算机列表
    如果显示的允许某机器访问,则提供访问权
    Hosts.deny 拒绝访问的计算机列表
    如果显示的拒绝某机器访问,则拒绝其访问
    注意:
            若两个文件都提供了同一个机器列表,则Hosts.allow优先。
            若两个文件都没有提供机器列表,则允许访问。
    如下定义源IP218.192.87.4的主机不允许访问FTP服务器:
    编辑Hosts.deny 拒绝文件,在最后添加如下内容:
    [root@51cto ~]# vim /etc/hosts.deny
    [root@51cto ~]# grep -v “#” /etc/hosts.deny
    vsftpd:         218.192.87.4
    重启xinetd服务,然后在Windows中测试:
    [root@51cto ~]# service xinetd restart
    停止 xinetd:                                              [确定]
    启动 xinetd:                                              [确定]
    RHCE253--架设FTP服务器[上部]www.linuxidc.com
    可以看到该主机被拒绝了,如下通过优先方式在Hosts.allow中添加218.192.87.4
    [root@51cto ~]# vim /etc/hosts.allow
    [root@51cto ~]# grep -v “#” /etc/hosts.allow
    vsftpd:         218.192.87.4
    [root@51cto ~]# service xinetd restart
    停止 xinetd:                                              [确定]
    启动 xinetd:                                              [确定]
    重新在Windows中测试:
    RHCE253--架设FTP服务器[上部]www.linuxidc.com
    总结:虚拟用户的创建必须指定登陆shell/sbin/nologin,使得虚拟用户无法登陆Linux系统,但可以访问Linux提供的服务;默认虚拟用户登陆到FTP后的自家目录在/home/xx下,并且可以离开自家目录,为了安全起见必须用过chroot_list功能限制虚拟用户只能处于自家目录。虚拟用户默认情况下可以上传下载,出问题可以通过chmod修改目录权限解决。最后可以通过iptables和tcp_wrapper做一些简单的安全策略,拒绝某源IP主机对FTP服务的访问。
  • 赞(0) 打赏
    转载请注明出处:服务器评测 » Linux基础教程–架设FTP服务器[上部]
    分享到: 更多 (0)

    听说打赏我的人,都进福布斯排行榜啦!

    支付宝扫一扫打赏

    微信扫一扫打赏