主动\被动模式下 FTP 服务器的适当 iptables 规则

use*_*351 4 linux ftp iptables centos6 proftpd

我在 CentOS6 上安装了 ProFTPD 服务器。如果我使 ftp 本地主机,我可以正确连接,但如果我从外部尝试,我会收到消息“没有到主机的路由”。但有一条到主机的路由,因为我是通过 SSH 连接的。

我尝试添加以下 iptable 规则:

iptables -A INPUT  -p tcp -m tcp --dport 21 -m conntrack --ctstate ESTABLISHED -j ACCEPT -m comment --comment "Allow ftp connections on port 21"
iptables -A OUTPUT -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT -m comment --comment "Allow ftp connections on port 21"

iptables -A INPUT  -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -m comment --comment "Allow ftp connections on port 20"
iptables -A OUTPUT -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED -j ACCEPT -m comment --comment "Allow ftp connections on port 20"

iptables -A INPUT  -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED -j ACCEPT -m comment --comment "Allow passive inbound connections"
iptables -A OUTPUT -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -m comment --comment "Allow passive inbound connections"
Run Code Online (Sandbox Code Playgroud)

并重新启动 proftpd 和 iptables 服务。我可以做什么来解决这个问题?

Yoe*_*oel 7

为了允许 FTP,您需要在服务器上遵循以下规则:

  1. 允许客户端向21端口发起控制连接,如下:

    iptables -A INPUT  -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT -m comment --comment "Allow ftp connections on port 21"
    iptables -A OUTPUT -p tcp -m tcp --sport 21 -m conntrack --ctstate ESTABLISHED -j ACCEPT -m comment --comment "Allow ftp connections on port 21"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 对于主动模式,允许服务器从20端口发起数据连接,如下:

    iptables -A OUTPUT -p tcp -m tcp --sport 20 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -m comment --comment "Allow ftp connections on port 20"
    iptables -A INPUT  -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED -j ACCEPT -m comment --comment "Allow ftp connections on port 20"
    
    Run Code Online (Sandbox Code Playgroud)
  3. 对于被动模式,允许客户端在非特权端口上发起数据连接:

    iptables -A INPUT -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -m comment --comment "Allow passive inbound connections"
    iptables -A OUTPUT -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED -j ACCEPT -m comment --comment "Allow passive inbound connections"
    
    Run Code Online (Sandbox Code Playgroud)

普通conntrack模块应该正确跟踪何时RELATED在主动模式下建立数据连接,但是您可能需要加载模块nf_conntrack_ftp以正确跟踪何时在被动模式下建立此类连接:

  • 检查是否已加载lsmod | grep nf_conntrack_ftp.
  • 加载它modprobe nf_conntrack_ftp

或者,您可以将RELATEDstate 替换为NEWstate,虽然安全性较差,但肯定可以完成工作。

此链接提供了上述规则的基本原理的简明摘要。