zoukankan      html  css  js  c++  java
  • Vsftp安装及配置主动模式/被动模式

     第一章、前言

    FTP的主动模式(active mode)和被动模式(passive mode)

    大多数的TCP服务是使用单个的连接,一般是客户向服务器的一个周知端口发起连接,然后使用这个连接进行通讯。
    但是,FTP协议却有所不同,它使用双向的多个连接,而且使用的端口很难预计。一般,FTP连接包括:
    一个控制连接 (control connection)
    这个连接用于传递客户端的命令和服务器端对命令的响应。它使用服务器的21端口,生存期是整个FTP会话时间。
    几个数据连接 (data connection)
    这些连接用于传输文件和其它数据,例如:目录列表等。这种连接在需要数据传输时建立,而一旦数据传输完毕就关闭,每次使用的端口也不一定相同。
    而且,数据连接既可能是客户端发起的,也可能是服务器端发起的。
    
    在FTP协议中,控制连接使用周知端口21 ,因此使用ISA的IP PACKET FILTER就可以这种连接进行很好的安全保护。
    相反,数据传输连接的目的端口通常实现无法知道,因此处理这样的端口转发非常困难。
    FTP协议使用一个标准的端口21作为ftp-data端口,但是这个端口只用于连接的源地址是服务器端的情况,在这个端口上根本就没有监听进程。
    FTP的数据连接和控制连接的方向一般是相反的,也就是说,是服务器向客户端发起一个用于数据传输的连接。
    连接的端口是由服务器端和客户端协商确定的。FTP协议的这个特征对ISA 转发以及防火墙和NAT的配置增加了很多困难。
    
    除此之外,还有另外一种FTP模式,叫做被动模式 (passive mod)。在这种模式下,数据连接是由客户程序发起的,和刚才讨论过的模式(我们可以叫做主动模式 )相反。
    是否采取被动模式取决于客户程序,在ftp命令行中使用passive命令就可以关闭/打开被动模式。

    第二章、安装vsftp

    1.关闭防火墙

    [root@mail ~]# iptables -L -n  #查看当前防火墙状态,及启用规则,当前机器防火墙规则为iptables默认规则
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 
    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 
    
    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination         
    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 
    
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination         
    [root@mail ~]# service iptables save                             #如果当前机器有其他iptables规则建议先保留
    iptables:将防火墙规则保存到 /etc/sysconfig/iptables:     [确定]    #规则保留至/etc/sysconfig/iptables文件中
    [root@mail ~]# service iptables stop  #关闭防火墙
    iptables:将链设置为政策 ACCEPT:filter                    [确定]
    iptables:清除防火墙规则:                                 [确定]
    iptables:正在卸载模块:                                   [确定]
    [root@mail ~]# iptables -L -n  #确认当前防火墙规则
    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     

    2.安装vsftp及配置vsftp被动模式(默认为被动模式)

    [root@mail ~]# yum install vsftpd -y
    [root@mail ~]# vim /etc/vsftpd/vsftpd.conf 
    [root@mail ~]# egrep -v "^#|^$" /etc/vsftpd/vsftpd.conf #除了添加注释选项,未注释选项均为默认值
    anonymous_enable=NO  #禁止匿名用户登录
    local_enable=YES
    write_enable=YES
    local_umask=022
    dirmessage_enable=YES
    xferlog_enable=YES
    connect_from_port_20=YES
    xferlog_std_format=YES
    #chroot_local_user=YES !!!------> #是否将所有用户限制在主目录,默认为NO chroot_list_enable
    =YES #现在用户被锁定在自己的home目录中 chroot_list_file=/etc/vsftpd/chroot_list #与上一选项相配合,在这个配置文件中添加用户,每个用户一行,则在这个文件里的用户登录ftp后,可以访问上级目录。不再的用户只能访问自己的home目录
    listen
    =YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES [root@mail ~]# useradd -M -d /data/ftp -s /sbin/nologin ftp_user #创建一个测试用户,不允许登录 [root@mail ~]# echo "123456"|passwd --stdin ftp_user #设置密码 更改用户 ftp_user 的密码 。 passwd: 所有的身份验证令牌已经成功更新。

     [root@mail ~]# mkdir /data/ftp -p                          #创建用户家目录
     [root@mail ~]# chown ftp_user:ftp_user /data/ftp/          #授权

    [root@mail ~]# echo "ftp_user" >> /etc/vsftpd/chroot_list  #将用户名添加至锁定文件中
    [root@mail ~]# service vsftpd start                        #启动服务
    为 vsftpd 启动 vsftpd:                                    [确定]
    [root@mail ~]# chkconfig vsftpd on
    测试是否可以登录,我这使用的是WinSCP客户端工具

    点击登录

     

    #对ftp的增删改查可以自行测试,应该没有问题

    下面我们打开防火墙,再次从新登陆ftp服务器

     

    可以看到由于防火墙的原因,现在已经无法连接到服务器了,现在放行21端口
    [root@eshop-cache04 ~]# vim /etc/sysconfig/iptables  #参考22端口复制一行修改为21即可,如果在命令行下使用命令,记得规则一定要插入在REJECT  all  ... 这条之前,否则防火墙规则将不会生效
    [root@eshop
    -cache04 ~]# service iptables restart iptables:将链设置为政策 ACCEPT:filter [确定] iptables:清除防火墙规则: [确定] iptables:正在卸载模块: [确定] iptables:应用防火墙规则: [确定] [root@eshop-cache04 ~]# iptables -L -n
    再次登录

     

     

     现在我们发现已经可以登录服务器了,但是无法浏览数据,这是因为数据端口在被动模式下是一个随机端口

    问题分析:

    主动模式 下,客户连接 TCP/21,服务器通过 TCP/20 连接客户的随机端口 
    ————这种情况下,通过状态防火墙可以解决 iptables -A INPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
    被动模式 下,客户连接 TCP/21,客户再通过其他端口连接服务器的随机端口
    卡住的原因,是因为服务器在被动模式下没有打开临时端口让 client 连过来,因此需要几个条件
    1、client 没有防火墙时,用主动模式连接即可
    2、server 没有防火墙时,用被动模式即可
    3、双方都有防火墙时,vsftpd 设置被动模式高端口范围,server 打开那段范围,client 用被动模式连接即可
    4、加载 ip_conntrack_ftp 模块,使 server 支持 connection tracking,支持临时打洞,client 用被动模式即可
    5、server 使用 ip_conntrack_ftp、client 使用 ip_conntrack_ftp 和 ip_nat_ftp,支持临时打洞和临时 NAT 穿越打洞,双方使用主动或被动模式均可
    
    优点:不影响ftp配置;缺点:客户会感觉到连接有些延迟。原因参见ip_conntract的实现原理
    配置临时"打洞",并重启服务
    [root@eshop-cache04 ~]# grep -w IPTABLES_MODULES  /etc/sysconfig/iptables-config  #修改此配置,添加两个模块
    IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"
    [root@eshop-cache04 ~]# service iptables restart
    iptables:将链设置为政策 ACCEPT:filter [确定]
    iptables:清除防火墙规则: [确定]
    iptables:正在卸载模块: [确定]
    iptables:应用防火墙规则: [确定]
    iptables:载入额外模块:ip_nat_ftp ip_conntrack_ftp [确定]   #可以看到,两个模块已经加载
    重新登录

    已经没有问题了

    三、配置服务为主动模式

    [root@eshop-cache04 ~]# tail -1 /etc/vsftpd/vsftpd.conf  
    pasv_enable=NO   #关闭pasv模式,启动主动模式
    [root@eshop-cache04 ~]# /etc/init.d/vsftpd restart
    关闭 vsftpd:                                              [确定]
    为 vsftpd 启动 vsftpd:                                    [确定]
    重启后,再次登录

     

    可以看到已经连接服务器,但是无法浏览数据,现在我们先允许20端口可以访问,步骤参考21端口即可,重启iptabls后重启访问

    可以看到还是没有权限浏览数据

    问题分析:参考此链接   https://www.cnblogs.com/tdalcn/p/6940147.html

    验证问题:

    [root@mail ~]# ftp 192.168.1.103            #另外一台Linux客户端
    Connected to 192.168.1.103 (192.168.1.103).
    220 (vsFTPd 2.2.2)
    Name (192.168.1.103:root): test_user        #按提示输入账号密码
    331 Please specify the password.
    Password:
    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> ls                                     #浏览数据,与客户端工具相同,没有权限浏览
    550 Permission denied.
    Passive mode refused.
    ftp> passive                                #关闭客户端的pasv
    Passive mode off.
    ftp> ls                                     #再次浏览,可以正常访问了
    200 PORT command successful. Consider using PASV.
    150 Here comes the directory listing.
    -rw-r--r--    1 501      501             8 Nov 15 11:23 新建文件
    226 Directory send OK.

    现在我们可以看到,由于service端关闭了pasv模式,但是client端默认还是pasv模式导致无法正常浏览数据,客户端需要关闭pasv模式改为port模式才能正常访问

    解决:客户端加入相关参数,在连接时关闭pasv

    命令行下:

    [root@mail ~]# ftp -A 192.168.1.103
    Connected to 192.168.1.103 (192.168.1.103).
    220 (vsFTPd 2.2.2)
    Name (192.168.1.103:root): test_user
    331 Please specify the password.
    Password:
    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> ls                                   #直接可以访问了
    200 PORT command successful. Consider using PASV.
    150 Here comes the directory listing.
    -rw-r--r--    1 501      501             8 Nov 15 11:23 新建文件
    226 Directory send OK.

    客户端:

    点击高级

    点击连接,关闭被动模式选项

    选择保存

    再次访问

    没有问题

    总结:

    下面的图表会帮助管理员们记住每种FTP方式是怎样工作的:
      主动FTP:
         命令连接:客户端 >1023端口 -> 服务器 21端口
         数据连接:客户端 >1023端口 <- 服务器 20端口 
      被动FTP:
         命令连接:客户端 >1023端口 -> 服务器 21端口
         数据连接:客户端 >1023端口 -> 服务器 >1023端口 
      下面是主动与被动FTP优缺点的简要总结:   主动FTP对FTP服务器的管理有利,但对客户端的管理不利。因为FTP服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能被客户端的防火墙阻塞掉。被动FTP对FTP客户端的管理有利,但对服务器端的管理不利。因为客户端要与服务器端建立两个连接,其中一个连到一个高位随机端口,而这个端口很有可能被服务器端的防火墙阻塞掉。   幸运的是,有折衷的办法。既然FTP服务器的管理员需要他们的服务器有最多的客户连接,那么必须得支持被动FTP。我们可以通过为FTP服务器指定一个有限的端口范围来减小服务器高位端口的暴露。这样,不在这个范围的任何端口会被服务器的防火墙阻塞。虽然这没有消除所有针对服务器的危险,但它大大减少了危险

    四、OUTPUT默认策略为DROP时配置ftp服务

    可以看到,之前的iptables的OUTPUT链默认策略是ACCEPT  (其实INPUT链默认也是ACCEPT,但是默认最后一条规则--reject-with icmp-host-prohibited 表示拒绝所有其他不符合任何一条规则的数据包)

    1.主动模式:

    先添加OUTPUT允许22端口(或者自定义的ssh链接端口),否则当默认策略改变时ssh无法登陆,如果机器在机房那就只能通知机房了....

    [root@eshop-cache04 ~]# cat /etc/sysconfig/iptables  
    -A OUTPUT -p tcp --sport 22 -j ACCEPT                #放行22端口
    [root@eshop-cache04 ~]# service iptables restart     #重启生效
    [root@eshop-cache04 ~]# iptables -L -n -v            #使用-v参数,查看规则是否匹配
    Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
    ......
    Chain OUTPUT (policy DROP 4 packets, 240 bytes)
     pkts bytes target     prot opt in     out     source               destination         
        9  1444 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp spt:22         #这边可以看到已经匹配到数据包了,没有问题
    [root@eshop-cache04 ~]# iptables -P OUTPUT DROP              #当上一步骤没有问题时,我们再修改默认策略为DROP

    使用客户端工具进行访问

     

     可以看到登录失败,下面我们放行ftp21 20端口,参照22,步骤省略,再次访问

     

    可以正常访问

    2.被动模式:(由于被动模式下数据端口是随机的,所以我们需要为FTP服务器指定一个有限的端口范围,在防火墙上放行这段端口即可)

    修改模式为被动模式,并制定数据端口

    [root@eshop-cache04 ~]# tail -3 /etc/vsftpd/vsftpd.conf   #修改或添加以下三行,我们定义随机端口为7000~8000之间
    pasv_enable=YES
    pasv_min_port=7000
    pasv_max_port=8000
    [root@eshop-cache04 ~]# /etc/init.d/vsftpd restart        #重启vsftp服务
    [root@eshop-cache04 ~]# cat  /etc/sysconfig/iptables      #修改防火墙规则,添加INPUT和OUTPUT对7000~8000端口放行数据
    # Firewall configuration written by system-config-firewall
    # Manual customization of this file is not recommended.
    *filter
    :INPUT ACCEPT [0:0]
    :FORWARD ACCEPT [0:0]
    :OUTPUT DROP [0:0]
    -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    -A INPUT -p icmp -j ACCEPT
    -A INPUT -i lo -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
    -A INPUT -p tcp --dport 7000:8000 -j ACCEPT
    -A INPUT -j REJECT --reject-with icmp-host-prohibited
    -A FORWARD -j REJECT --reject-with icmp-host-prohibited
    -A OUTPUT -p tcp --sport 22 -j ACCEPT
    -A OUTPUT -p tcp --sport 21 -j ACCEPT
    -A OUTPUT -p tcp --sport 7000:8000 -j ACCEPT
    COMMIT
    [root@eshop-cache04 ~]# iptables -L -n

     修改客户端访问模式,进行访问

     

     

    可以正常访问,至此,ftp相关配置全部完成!

     

  • 相关阅读:
    二分图 洛谷P2055 [ZJOI2009]假期的宿舍
    并查集 洛谷P1640 [SCOI2010]连续攻击游戏
    贪心 洛谷P2870 Best Cow Line, Gold
    贪心 NOIP2013 积木大赛
    快速幂 NOIP2013 转圈游戏
    倍增LCA NOIP2013 货车运输
    树形DP 洛谷P2014 选课
    KMP UVA1328 Period
    动态规划入门 BZOJ 1270 雷涛的小猫
    KMP POJ 2752Seek the Name, Seek the Fame
  • 原文地址:https://www.cnblogs.com/panwenbin-logs/p/9962086.html
Copyright © 2011-2022 走看看