原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 http://navyaijm.blog.51cto.com/4647068/816598
用iptables做端口转发是个很实用的功能,可以让我们忽略协议细节而实现透明转发,对于加密的数据传输更是好用。
ftp协议不同于http协议,因为ftp的控制端口和数据端口是分离的,在被动模式下,数据端口是通过控制信息来商定的,所以我们不能简单地对21端口做转发。
注:假定我们是通过在 本机IP 上做NAT设置使 源IP 可以通过 本机IP 访问到 目标IP
1、首先书写并运行nat命令
modprobe iptable_nat
/sbin/iptables -t nat -A POSTROUTING -d 目标ip -p tcp --dport 21 -j MASQUERADE
/sbin/iptables -t nat -A PREROUTING -d 本机ip -p tcp --dport 21 -j DNAT --to-dest 目标IP:21
2、这个时候可以通过iptables -t nat -L命令进行查看目前nat,现在已经可以进行ftp的连接和登录了,同时一些控制命令也是正常的,但是使用LIST命令就会失败,抓包有如下结果。
本机IP.00021-源IP.01289: 227 Entering Passive Mode (目标IP,8,215)
源IP.01289-本机IP.00021: LIST -al
本机IP.00021-源IP.01289: 425 Security: Bad IP connecting.
3、出现上述问题的原因是,源IP通过本机IP转发到目标IP,在进入被动模式的时候,目标IP发送了目标的IP给源IP,所以源IP就直接尝试和目标IP建立数据连接,因为建立数据连接和控制连接的ip不同,所以目标IP拒绝访问。
4、对于这个问题vsftp有一个设置可以放弃这种安全检查,手册是如下说明的:
pasv_promiscuous
Set to YES if you want to disable the PASV security check that ensures the data connection originates from the same IP address as the control connection. Only enable if you know what you are doing! The only legitimate use for this is in some form of secure tunnelling scheme, or perhaps to facilitate FXP support.
Default: NO
5、如果按照第4步的说明,配置为pasv_promiscuous,那么这个时候访问ftp是正常的,但是就像上面说的那样,控制连接由本机ip和目标Ip建立,数据连接由源IP和目标IP建立,估计这种情况对于99%的情况来说不是我们想要的。
6、在进入被动模式的时候,是否可以修改PASV里面的目标IP为本机IP呢,这个就是ip_nat_ftp做得事情,如下安装模块:
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
可以通过lsmod查看是否生效,我的如下:
ip_conntrack_ftp 76273 0
ipt_MASQUERADE 7873 11
iptable_nat 27237 2 ipt_MASQUERADE
ip_conntrack 45957 3 ip_conntrack_ftp,ipt_MASQUERADE,iptable_nat
iptable_filter 6721 1
ip_tables 21441 3 ipt_MASQUERADE,iptable_nat,iptable_filter
7、现在在访问一下ftp,则一切正常了。
本文出自 “屌丝运维男” 博客,请务必保留此出处http://navyaijm.blog.51cto.com/4647068/816598