如何configurationvsftpd和iptables侦听端口21,但在另一个端口上运行?

我们有一个Java进程,其中包含一个embedded式FTP服务器,我想在RHEL5机器上运行。 我不想以root身份运行进程,我不希望客户端在build立连接时必须指定端口。 看来我应该能够configurationvsftpd监听另一个端口(例如20000),然后configurationipchains将端口21上的所有stream量转发到20000.我想具体我需要:

  1. configurationvsftpd在端口20000上侦听
  2. configurationip_conntrack_ftp将端口21的stream量转发到20000

所以我最初的问题是这似乎是一个合理的方法?

为了完成第一步,我修改了我的vsftpd.conf文件,使其具有以下行:

 listen_port=20000 

然后,我可以重新启动vsftpd,并通过执行以下操作validation它是否正在侦听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): 

我继续login没有问题。 第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规则吗?

我认为你正在寻找的是REDIRECT:

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

你需要使用passive-ftp。