一、故障描述

  由于开发提出需求,为他们搭建内部ftp服务器,搭建好后,提交给他们,测试可以正常使用。后来过了一段时间后,有一天无法登陆了。于是去ftp主机上检查问题,ftp的配置文件没有改动,端口监听也正常。telnet也可以通。但是用网页,或者winscp 访问就是无法连接。后来谷歌后,发现ftp的iptables 规则比其它应用不太像,有点特别。需要特别的修改下防火墙。(询问后,得知之前其它运维同事加固过该机器的防火墙....)

  

二、解决方式

  1.在原有的防火墙规则中加入以下规则。

-A INPUT -p tcp -s 192.168.30.0/24 -p tcp -m state NEW --dport  -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

  2.加入规则,重启后,虽然能登陆了,但是使用ftp工具时一直报这个错误。无法列出目录。

图1.

图2.

  3.后来在iptables 的配置文件中,加入一个模块后,就可以了。可以使用以下命令去添加,永久生效。如下:

sed -i '$ a IPTABLES_MODULES="ip_conntrack_ftp"' /etc/sysconfig/iptables-config

  之后重启iptables,即可将该ftp跟踪模块加载到内核中。ip_conntrack_ftp模块是专用于跟踪ftp连接的。

三、原因分析

  1.涉及到了主动和被动模式

  主动模式: client 打开一个随机端口 port1 去连接 server的 21 号端口,与server的默认21号端口建立连接后。这个时候,client会再打开一个随机端口 port 2等待服务器来连接。服务器收到用户端的命令后,就使用20专用数据传输端口去连接client随机开放的port 2端口。

  (注:如果客户端开了防火墙,可能会阻塞ftp 服务器20端口与port 2 之间的连接,这个时候,被动模式就出现了。)

如下图:

  

   注:图片来源于文末的参考资料

  被动模式:client使用一个随机端口 去连接ftp server 的21 端口,并发出PASV的要求。 server 去回应 client,并告知clinet : 我已经将本机的 port 3 打开。你来连接吧。之后 client 就会收到 server 发送的 服务器ip+port3的 数据包。 client 就会在本机上打开一个随机的端口 port 4 ,用 port 4去连接服务器上的 port3 端口。这样client 和server 就建立了数据传输的连接。

如下图:

  

  

   注:图片来源于文末的参考资料

  2. 期间我通过使用tcpdump 的分析,也更加的对以上的知识原理进行了进一步的实践和学习。

四、主动&被动学习验证

  1.环境介绍:  client 端: 192.168.30.58

          server端:   192.168.30.203

  

  2.主动模式验证:

  server 端运行tcpdump 监听:

  

  !!!纠正一个错误:上图中的标注客户端将本机的随机开放的端口发送给服务器内容的那一条,实际上不是在这里发送的,而是在 第一次 ftp-data(20)端口 与 端口49404连接的往上数第四条,是在那儿发送的随机端口。

  客户端登陆执行的命令:

  

  可能大家会对上述中的client后续随机打开的端口计算方法有点疑问,一开始我也是,后来查了一下,解释如下:

  PORT 命令 用于打开端口的命令。格式为 PORT a,b,c,d,e,f。其中 a,b,c,d 为点分十进制形式的 IP 地址;e,f 表示端口号,为 2 个 10 进制数字,用以标识 e×256 + f 运算出来的端口 号。本文章的e,f也就是192,252. 运行上面的公式后,就得到了端口号为49404

  3.被动模式验证:

  server 端运行tcpdump 监听:

   

  其实我们也可以使用 tcpdump 时,在命令最后加上 -X ,可以详细的看到报文内容。我也是通过这种方式看到在哪一条进行的端口发送的。

  客户端登陆执行的命令:

  

五、总结 

  1.主动模式:服务器只需要开启21和20 端口,虽然比较安全,但是如果客户端开启了防火墙,那么可能会无法传输数据。

  2.被动模式:默认开启一个21端口后,后续服务器会对每个用户的连接请求随机开放一个端口,服务器安全性降低。

  3.在iptables 中,我们需要为ftp 加上一个跟踪模块,即:ip_conntrack_ftp

  4.尽量避免在公网中使用ftp传输数据,因为用户及密码是明文传输的。

该文章属于作者原创,如有转载或者分享,请注明出处以及该文章链接. 作者:飞走不可 http://www.cnblogs.com/hanyifeng/p/5718313.html

参考资料:

https://www.youtube.com/watch?v=bqrlBicM8lE

http://phorum.com.tw/ShowPost/5609.aspx

http://www.cyberciti.biz/faq/iptables-passive-ftp-is-not-working/

Linux 为FTP 服务器添加iptables规则--案例分析的更多相关文章

  1. Linux篇---ftp服务器的搭建

    一.前述 企业中linux搭建ftp服务器还是很实用的,所以本文针对centoos7和centoos6搭建服务器教程做个总结. 二.具体 1.显示如下图则表示已安装 vsftp软件.如果未显示则需要安 ...

  2. 《Linux下FTP服务器搭建及FTP使用》

    .LOGAndy:mxtd114 <Linux下FTP服务器搭建> 0.root登录 1.安装ftp # yum -y install ftp 2.安装vsftpd # yum -y in ...

  3. 使用Linux搭建FTP服务器实现文件共享

    使用Linux搭建FTP服务器实现文件共享... ---------------- Linux中的文件共享:FTPVSFTPDVSFTPD虚拟用户 FTP可以用在Linux与Linux 和Window ...

  4. Linux启动ftp服务器530 Permission denied解决方法(已试,行)

    Linux启动ftp服务器530 Permission denied解决方法重新在虚拟机下安装了linux.现在我想启动linux自带的ftp服务器:#service  vsftpd  start . ...

  5. 适合Centos Web服务器的iptables规则

    适合Centos Web服务器的iptables规则IPT="/sbin/iptables"$IPT --delete-chain$IPT --flush$IPT -P INPUT ...

  6. 自学linux——18.FTP服务器的搭建

    Centos7下FTP服务器的搭建 一.FTP的作用 文件传输协议(File Transfer Protocol,FTP),是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用 20. ...

  7. Linux建立FTP服务器

    http://blog.chinaunix.net/uid-20541719-id-1931116.html http://www.cnblogs.com/hnrainll/archive/2011/ ...

  8. Linux 之 FTP服务器搭建

    FTP服务器搭建 参考教程:[千峰教育] 1.关闭防火墙: service iptables stop 2.关闭Selinux setenforce 0 3.安装所需要依赖及编译工具 yum inst ...

  9. Linux搭建ftp服务器简单教程及使用方法

    参考文章:https://www.waitig.com/linux-or-centos-install-vsftpd-and-setup-it.html 步骤概括如下: 安装:yum install ...

随机推荐

  1. vue 初级小总结

    (1)插值,即渲染文本 文本:数据绑定最常见的形式就是使用 {{...}}(双大括号)的文本插值 <h1>{{ message }}</h1> data() { return ...

  2. ubuntu16 sogou install

    1,下载搜狗deb文件(ubuntu16不要参考搜狗旧的安装文档): http://pinyin.sogou.com/linux/ 2,双击sogoupinyin_2.1.0.0086_amd64.d ...

  3. stark组件02

    1.怎么在显示页面添加新字段(a标签)?在admin.py下注册就好了 当我们需要在admin页面添加新的a标签时,需要引入一个类似safe功能的模块 from django.utils.safest ...

  4. windows 按时自动化任务

    参考文章: 1. 巧用Windows 7计划任务设置定时提醒 http://jingyan.baidu.com/article/acf728fd279fe5f8e510a333.html 2. cmd ...

  5. day5 io模型

    五种概览:http://www.cnblogs.com/xiehongfeng100/p/4763225.html http://sukai.me/linux-five-io-models/  内有多 ...

  6. html5大纲算法(目录树)

    看了<CSS那些事儿>我一直遵循着给每个板块写一个h标签,并保持层次,比如导航条.焦点图我都写了一个缩进隐藏的h标签.这种规范一般人根本看不出来,即使是行内的大多数人也觉得没有必要.可是我 ...

  7. ajax完成团队信息异步添加【实际项目】

    第一:ajax往后台传参如何串(目前理解是json数组直接传给对象) 第二:ajax返回的数值通过PrintWriter.print方法返回 [参考前台页面关于团队信息是如何实现的] 参考页面user ...

  8. POJ3696 The Windy's 【网络流】

    #include<iostream> #include<vector> #include<cstring> #include<algorithm> #i ...

  9. ubuntu16安装最新版docker

    ubuntu16.04安装最新版docker.docker-compose.docker-machine https://www.cnblogs.com/tianhei/p/7802064.html ...

  10. EXCEL某列长度超过255个字符导入SQL SERVER2005的处理方法

    将注册表中 Jet引擎. HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Jet/4.0/Engines/Excel 如果是:ACE引擎. HKEY_LOCAL_MACHI ...