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