FTP服务搭建(随时盖楼)

FTP:file transfer protocol 文件传输协议。使用端口为20(数据通道,传输文件或目录列表)和21(命令通道,传输用户命令),FTP服务器能够从网上提供文件的传输服务,远程客户端可以上传和下载文件。

linux中常见FTP服务器有:proftpd、vsftp、wu-ftpd。

FTP工作模式有两种:主动模式PROT和被动模式PASV。

主动模式:客户端随机开放1个大于1024的端口N向服务器21端口发起链接,然后开发N+1端口进行监听,并向服务器发出PORT N+1命令,通知服务器自己是主动模式。

服务器接收到命令后,会用本地FTP数据端口20向客户端指定的N+1端口传输数据。

被动模式:客户端随机开发1个大于1024的端口N向服务器21端口发起链接,然后开发N+1端口进行监听,并向服务器发出PASV N+1命令,通知服务器自己是被动模式。

服务器接收到命令后,会开发给1个大于1024的端口M进行监听,然后使用PROT M命令通知客户端,数据端口是M。客户端使用N+1口段和服务器M端口进行传输数据。


首先我们下载我们所需的proftpd源代码文件。

[root@www ~]# wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.6.tar.gz
[root@www  ~]# tar -zxvf proftpd-1.3.6.tar.gz  #报错。
proftpd-1.3.6/
proftpd-1.3.6/.autom4te.cfg
proftpd-1.3.6/.gitattributes
proftpd-1.3.6/.github/
proftpd-1.3.6/.github/CONTRIBUTING.md
proftpd-1.3.6/.github/ISSUE_TEMPLATE.md
proftpd-1.3.6/.gitignore
proftpd-1.3.6/.travis.yml
proftpd-1.3.6/COPYING
proftpd-1.3.6/CREDITS
proftpd-1.3.6/ChangeLog

gzip: stdin: unexpected end of file
tar: 归档文件中异常的 EOF
tar: 归档文件中异常的 EOF
tar: Error is not recoverable: exiting now
[root@www  ~]# ls -l proftpd-1.3.6.tar.gz
-rw-r--r--. 1 root root 242200 10月 17 17:04 proftpd-1.3.6.tar.gz   #压缩文件错误。
[root@www  ~]# ls -l /tmp/proftpd-1.3.6.tar.gz
-rw-r--r--. 1 root root 20251898 10月 17 18:37 /tmp/proftpd-1.3.6.tar.gz  #正确的。
[root@www  ~]#
[root@www ~]# tar -zxvf /tmp/proftpd-1.3.6.tar.gz -C /usr/local/src/
[root@www ~]# cd /usr/local/src/proftpd-1.3.6


开始编译安装前,首先生成Makefile文件。

参数介绍

[root@www proftpd-1.3.6]#./configure --help 查看可用的参数,也可以在   阅读详细的参数。 
[root@www proftpd-1.3.6]#./configure --prefix=/usr/local/proftpd --sysconfdir=/etc --localstatedir=/var/log/proftpd --enable-shadow --enable-autoshadow --with-modules=mod_ratio:mod_readme:mod_wrap

默认安装会安装mod_auth,模块包含的指令http://www.proftpd.org/docs/modules/mod_auth.html

需要安装mod_core,模块包含的指令http://www.proftpd.org/docs/modules/mod_core.html

我这里所用的参数有,比较简单哦~:

--prefix 安装目录放在/usr/local/proftpd下

--sysconfdir 配置文件放在/etc下

--localstatedir 日志文件放在/var/log/proftpd下

--enable-shadow 

--enable-autoshadow 这两项是可以使用/etc/shadow获取密码

--with-modules=mod_ratio:mod_readme:mod_wrap需要使用的模块

另外:

install_user=用户名 install_group=组名 ./configure --prefix=/home/tj/proftpd/devel/build/ ... 使用用户和组名进行安装,不影响运行。



生成了makefile文件就可以make编译安装了。

[root@www proftpd-1.3.6]# make

报错啦:mod_wrap.c:34:18: 错误:tcpd.h:没有那个文件或目录,需要安装tcp_wrappers和tcp_wrappers-devel。

gcc -DHAVE_CONFIG_H  -DLINUX  -I.. -I../include  -O2 -Wall -c mod_wrap.c
mod_wrap.c:34:18: 错误:tcpd.h:没有那个文件或目录
...
...
make[1]: *** [mod_wrap.o] 错误 1
make[1]: Leaving directory `/usr/local/src/proftpd-1.3.3/modules'
make: *** [modules] 错误 2
[root@www proftpd-1.3.3]# make clean
cd src/     && make clean
make[1]: Entering directory `/usr/local/src/proftpd-1.3.3/src'
rm -f *.o
make[1]: Leaving directory `/usr/local/src/proftpd-1.3.3/src'

[root@www proftpd-1.3.6]# yum install tcp_wrappers-7.6-57.el6.x86_64.rpm tcp_wrappers-devel-7.6-57.el6.x86_64.rpm -y
安装完成后所需依赖包后。
[root@www proftpd-1.3.6]# make clean
[root@www proftpd-1.3.6]# make
[root@www proftpd-1.3.6]# make install


查看/etc/proftpd.conf配置文件

#全局设置
设置项1 参数
设置项2 参数
#某个目录的设置
<Directory 路径名>
</Directory>
#关于匿名用户的设置
<Anonymous>
<Limit 限制动作>
</Limit>
</Anonymous>

最简单的配置,也是默认的配置

[root@www ~]# grep -Ev "^#|^$" /etc/proftpd.conf
ServerName                      "ProFTPD Default Installation"        #服务器的名称
ServerType                       standalone                   #服务类型存在两种 standalone 和 inetd/xinetd模式。对于不经常用的ftp服务器来说选择xinetd较好。
DefaultServer                       on                       #是否开启?
Port                          21                         #监听端口
UseIPv6                        off                       #是否开启ipv6
Umask                         022                        #上传文件的默认权限
MaxInstances                       30                        #最大实例即pid数量
TimeoutStalled                                         300                                            #客户端空闲时间
User                          nobody                       #启动服务的用户
Group                         nobody                       #启动服务的组
DefaultRoot ~                                                         
RootLogin off                                             #是否允许root登录ftp,为安全建议off
AllowOverwrite                       off
DisplayLogin                       welcome.msg                  #欢迎信息 
DisplayChdir                                           .message
<Limit SITE_CHMOD>
  DenyAll
</Limit>
<Anonymous ~ftp>
  User    ftp
  Group    ftp
  # We want clients to be able to login with "anonymous" as well as "ftp"
  UserAlias anonymous ftp
  # Limit the maximum number of anonymous logins
  MaxClients 10
  # We want 'welcome.msg' displayed at login, and '.message' displayed
  # in each newly chdired directory.
  DisplayLogin   welcome.msg
  DisplayChdir   .message
  # Limit WRITE everywhere in the anonymous chroot
  <Limit WRITE>
    DenyAll
  </Limit>
</Anonymous>

注:

1.ServerType服务类型存在两种 standalone 和 inetd/xinetd模式。inetd/xinetd会统一管理服务,由inetd/xinetd来监听21端口,若有客户进来则由inetd/xinetd来启动proftpd服务和管理连接,对于不经常用的ftp服务器/流量小的服务器来说选择xinetd较好。

可以编辑xinetd.conf文件
  service ftp
  {
        disable = no
        flags			= REUSE
        socket_type             = stream
        wait                    = no
        user                    = root
        server                  = /usr/sbin/proftpd
        server_args             = -c /etc/proftpd.conf
  }

2.DefaultRoot 限制用户访问目录,此指令会出现在配置文件上下文中(不能存在virtualhost global上下文中)、<VirtualHost>、<Global>中。

DefaultRoot ~ 所有用户的根目录都chroot到家目录,标准语法DefaultRoot 目录 组或所有

DefaultRoot ~ !user_ftp 不是user_ftp组的用户chroot到家目录

DefaultRoot /path/to/dir group1,group2  两个组下的用户chroot到/path/to/dir下。 这里若使用符号链接作为根目录,一定要注意尽量不要使用绝对路径作为根目录。当chroot后会失效的

3.匿名登录且安全上传

<Anonymous /data>
  User                          ftp
  Group                         ftp
  AnonRequirePassword off
  UserAlias                     anonymous ftp
  MaxClients                    10
  DisplayLogin                  welcome.msg
  DisplayChdir                  .message

 <Directory test>
   <Limit STOR CWD>
     AllowALL
   </Limit>
   <Limit READ RMD DELE MKD>
    DenyAll
   </Limit>
 </Directory>
</Anonymous>

4.<Limit>指令有三种参数:ftp命令、ftp命令组、关键字ALL(所有哦)

ftp命令组有:

ALL 所有的FTP命令(除LOGIN)
DIRS 包括CDUP, CWD, LIST, MDTM, MLSD, MLST, NLST, PWD, RNFR, STAT, XCUP, XCWD, XPWD
LOGIN 包括client logins
READ 包括RETR SIZE
WRITE 包括APPE, DELE, MKD, RMD, RNTO, STOR, STOU, XMKD, XRMD
优先级是 单个命令 > 命令组 > ALL

a.限制单个命令(格式SITE_COMMOND):如CHMOD命令(SITE_CHMOD)

<Limit SITE_CHMOD>
 DenyAll
</Limit>

b.如何限制某个用户禁止访问或限制某个ip禁止登陆ftp服务器,使用<Limit>

<Limit LOGIN>

Deny from 192.16.8.146.***

</Limit>

可以查看mod_ifsession模块和mod_wrap2也可以实现。

c.<Limit>的继承,当<Limit>在<Directory>中时目录的子目录也会继承<Limit>的限制哦。除非被更近的<Limit>所替代。

  <Directory /path/to/uploads>#上传
    <Limit ALL>                #第一个limit  在这个目录下进制使用所有命令
      DenyAll
    </Limit>

    <Limit CDUP CWD PWD XCWD XCUP>        #第二个limit  在这个目录下可以使用的命令
      AllowAll
    </Limit>

    <Limit STOR STOU>                    #可以使用的上传命令
      AllowAll
    </Limit>
  </Directory>

d.基本常用的权限限制有以下:

CMD:Change Working Directory 改变目录
MKD:MaKe Directory 建立目录的权限
RNFR: ReName FRom 更改目录名的权限
DELE:DELEte 删除文件的权限
RMD:ReMove Directory 删除目录的权限
RETR:RETRieve 从服务端下载到客户端的权限
STOR:STORe 从客户端上传到服务端的权限
READ:可读的权限,不包括列目录的权限,相当于 RETR,STAT等
WRITE:写文件或者目录的权限,包括 MKD和RMD
DIRS:是否允许列目录,相当于LIST,NLST等权限,还是比较实用的
ALL:所有权限
LOGIN:是否允许登陆的权限

e.可应用的范围有:

AllowUser 针对某个用户允许的Limit
DenyUser 针对某个用户禁止的Limit
AllowGroup 针对某个用户组允许的Limit
DenyGroup 针对某个用户组禁止的Limit
AllowAll 针对所有用户组允许的Limit
DenyAll 针对所有用户禁止的Limit

5.虚拟FTP服务器设置

为什么要有虚拟服务器,在单一主机提供多个站点或地址。

<VirtualHost 10.0.0.1>         #基于ip
ServerName“我的虚拟FTP服务器” 
</VirtualHost>
<VirtualHost ftp.mydomain.com>   #基于名称
    ... 
</ VirtualHost>

6.只允许匿名登录虚拟服务器

<VirtualHost 10.0.0.1>
ServerName "My virtual FTP server"
<Limit LOGIN>
DenyAll
</Limit>
<Anonymous /usr/local/private>
User private
Group private
<Limit LOGIN>
AllowAll
</Limit>
...
</Anonymous>
</VirtualHost>


猜你喜欢

转载自blog.51cto.com/12107790/2306626