已索引

FTP服务器在与客户端通讯的过程中会用到两个端口,一个是控制端口,通常是21/tcp,一个是数据端口,运行在主动模式下的FTP服务器的数据端口一般是20/tcp,运行在被动模式下的FTP服务器的数据端口通常是一个随机端口/tcp。

现今FTP服务器普遍都是跑在被动服务器模式下(原因这儿不做解释),这就为服务器的防火墙配置造成了问题,因为被动模式下的服务器使用的数据端口不是固定的。

很多初学的朋友普通以为放行21/tcp端口就好了,这是错误的,看下面的实验:

1、将 iptables 的策略恢复为红帽的默认值
执行 setup > Network configuration > Firewall configuration,选中 Enabled
这样会把 iptables 的策略重置为默认策略,默认策略只开放了sshd服务

2、安装 ftp 服务器软件并开启 ftp 服务

[root@server1 ~]# yum install -y vsftpd; service vsftpd restart
[root@server1 ~]# chkconfig vsftpd on

3、在 iptables 中开放 21/tcp 端口

[root@server1 ~]# iptables -I INPUT -p tcp --dport 21 -j ACCEPT
[root@server1 ~]# service iptables save

4、客户端访问测试

[root@station1 ~]# ftp server1.example.com
Connected to server1.example.com (192.168.1.61).
220 (vsFTPd 2.2.2)
Name (server1.example.com:root): ftp
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 (192,168,1,61,45,120).
ftp: connect: No route to host   <--- 数据通道不通
ftp>

为了解决这个,专门开发了名为 nf_conntrack_ftp 的内核模块。

在RHEL6中,配置 iptables 使用该模块:

[root@server1 ~]# vim /etc/sysconfig/iptables-config
IPTABLES_MODULES="nf_conntrack_ftp"

[root@server1 ~]# /etc/init.d/iptables restart

这种解决方法是官方推荐的方法,它适用于 RHEL6, 它是当需要使用的时候才加载 nf_conntrack_ftp 模块,而网上流行的在/etc/rc.local中开机加载 nf_conntrack_ftp 的方法就会一直占用内存,而不管到底现在有没有使用。

在 RHEL7 中,只需要在 firewalld 中开放预置的 ftp 服务就好了。firewalld 中的 ftp 服务已经为我们配置好了使用 nf_conntrack_ftp 模块。

-- By 许望(RHCA、OCM、VCP)
最后修改:2023 年 01 月 10 日 09 : 35 AM
如果觉得我的文章对你有用,请随意赞赏