如何配置 vsftpd 和 iptables 以监听端口 21 但在另一个端口上运行?

如何配置 vsftpd 和 iptables 以监听端口 21 但在另一个端口上运行?

我们有一个 Java 进程,其中包含一个嵌入式 FTP 服务器,我想在 RHEL5 机器上运行它。我不想以 root 身份运行该进程,也不想让客户端在建立连接时必须指定端口。似乎我应该能够配置 vsftpd 以侦听备用端口(例如 20000),然后配置 ipchains 以将端口 21 上的所有流量转发到 20000。我认为具体来说我需要:

  1. 配置 vsftpd 监听 20000 端口
  2. 配置ip_conntrack_ftp将21端口的流量转发到20000

所以我的第一个问题是这看起来是一种合理的方法吗?

为了完成步骤 1,我修改了 vsftpd.conf 以包含以下行:

listen_port=20000

然后我可以重新启动 vsftpd 并通过执行以下操作来验证它是否正在监听 20000:

> ftp tstweb1 20000
Connected to tstweb1.pulseenergy.com.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (tstweb1:cclark):

然后我继续登录,没有任何问题。第 1 步完成。

至于步骤 2,我没有看到已加载的模块:

> /sbin/lsmod | grep ftp

>

因此我尝试使用正确的端口转发信息来加载它:

> /sbin/modprobe ip_conntrack_ftp ports=21,20000

我确认它已经加载:

> /sbin/lsmod | grep ftp
ip_conntrack_ftp       41489  0 
ip_conntrack           91109  3 ip_conntrack_ftp,iptable_nat,ip_nat

但是当我尝试使用它时,连接被拒绝:

> ftp tstweb1
ftp: connect: Connection refused

我知道 FTP 是一种复杂的协议,具有主动和被动模式以及多个端口上的通信,但我认为模块ip_conntrack_ftp会为我隐藏很多内容。我是否需要另外编写一些特定的 iptables 规则?

答案1

我认为您正在寻找的是重定向:

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 21 -j REDIRECT --to-port 20000

并且您需要使用passive-ftp。

相关内容