在Linux上设置FTP服务器的防火墙需要特别注意FTP协议的特殊性,因为FTP使用动态端口进行数据传输。以下是详细的设置步骤:
FTP有两种主要模式: - 主动模式(PORT): 服务器主动连接客户端的数据端口 - 被动模式(PASV): 客户端连接服务器的数据端口
现代FTP服务器通常使用被动模式(PASV)。
# 允许FTP控制连接(默认端口21)
sudo iptables -A INPUT -p tcp --dport 21 -j ACCEPT
# 对于被动模式,需要开放端口范围(例如30000-31000)
sudo iptables -A INPUT -p tcp --dport 30000:31000 -j ACCEPT
# 保存iptables规则(根据发行版不同)
sudo iptables-save > /etc/sysconfig/iptables
# 或
sudo service iptables save
# 添加FTP服务(默认包含端口21)
sudo firewall-cmd --permanent --add-service=ftp
# 添加被动模式端口范围
sudo firewall-cmd --permanent --add-port=30000-31000/tcp
# 重新加载防火墙
sudo firewall-cmd --reload
# 允许FTP端口
sudo ufw allow 21/tcp
# 允许被动模式端口范围
sudo ufw allow 30000:31000/tcp
# 启用防火墙
sudo ufw enable
大多数FTP服务器(vsftpd, proftpd等)需要配置被动端口范围:
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=31000
pasv_address=your.server.ip.address
PassivePorts 30000 31000
MasqueradeAddress your.server.ip.address
FTP协议需要特殊的内核模块来处理动态端口:
# 加载ip_conntrack_ftp和ip_nat_ftp模块
sudo modprobe ip_conntrack_ftp
sudo modprobe ip_nat_ftp
# 使模块在启动时自动加载
echo "ip_conntrack_ftp" | sudo tee -a /etc/modules
echo "ip_nat_ftp" | sudo tee -a /etc/modules
配置完成后,使用FTP客户端测试连接,确保主动和被动模式都能正常工作。
如果连接有问题,检查:
- 防火墙规则是否正确应用(iptables -L
或firewall-cmd --list-all
)
- FTP服务器日志(/var/log/vsftpd.log等)
- 确保SELinux不会阻止FTP(如有必要可临时设置为permissive模式测试)