阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Linux 为FTP 服务器添加iptables规则–案例分析

265次阅读
没有评论

共计 2375 个字符,预计需要花费 6 分钟才能阅读完成。

一、故障描述

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

二、解决方式

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

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

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

图 1.

Linux 为 FTP 服务器添加 iptables 规则 -- 案例分析

图 2.

Linux 为 FTP 服务器添加 iptables 规则 -- 案例分析

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 之间的连接,这个时候,被动模式就出现了。)

如下图:

Linux 为 FTP 服务器添加 iptables 规则 -- 案例分析

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

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

如下图:

Linux 为 FTP 服务器添加 iptables 规则 -- 案例分析

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

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

更多 iptables 相关教程见以下内容

CentOS 7.0 关闭默认防火墙启用 iptables 防火墙  http://www.linuxidc.com/Linux/2015-05/117473.htm

iptables 使用范例详解 http://www.linuxidc.com/Linux/2014-03/99159.htm

Linux 防火墙 iptables 详细教程 http://www.linuxidc.com/Linux/2013-07/87045.htm

iptables 的备份、恢复及防火墙脚本的基本使用 http://www.linuxidc.com/Linux/2013-08/88535.htm

Linux 下防火墙 iptables 用法规则详解 http://www.linuxidc.com/Linux/2012-08/67952.htm

Linux 下 iptables 防火墙设置 http://www.linuxidc.com/Linux/2015-10/123843.htm

四、主动 & 被动学习验证

1. 环境介绍:client 端:192.168.30.58

server 端:   192.168.30.203

2. 主动模式验证:

server 端运行 tcpdump 监听:

Linux 为 FTP 服务器添加 iptables 规则 -- 案例分析

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

客户端登陆执行的命令:

Linux 为 FTP 服务器添加 iptables 规则 -- 案例分析

可能大家会对上述中的 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 监听:

 Linux 为 FTP 服务器添加 iptables 规则 -- 案例分析

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

客户端登陆执行的命令:

Linux 为 FTP 服务器添加 iptables 规则 -- 案例分析

五、总结

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

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

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

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

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-08/134163.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计2375字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中