感受VMware NAT对应用层协议的影响(配置guest机FTP server蛋疼实录)

不要问我为什么要在VMware下的guest机配置一个FTP server,但是我确实需要这样做。显然需要端口转发嘛,在virtual network settings里设置下21到21的转发。Done。


这时候问题来了,FTP的passive mode的端口怎么办?多扯几句关于passive/active的区别,这个p和a啊,指的是服务器的行为。在客户端连接到服务器21端口,建立命令连接后,传数据都是靠另外一条tcp连接的,但这一条TCP连接的建立,就比较复杂了。所谓passive,就是服务器(被动地)开放一个高端口监听,等待客户端连接;而active,则是客户端打开一个端口,请求服务器(主动)来连。显然后者听起来比较奇葩,哪有服务器发起连接的?要是客户端是NAT或者有防火墙怎么办?所以一般最好使用passive mode,对客户端环境不高。但反过来,passive mode对服务器网络环境要求就高了,不仅要允许21端口的入站连接,还要允许某一群高端口的入站连接。

于是呢,我就要配置VMware的入站连接的转发了。(这个过程会导致悲剧的结果,如果不想研究,请直接跳到结论)


(在DEBUG前,请关闭防火墙,以防干扰结果)


在guest机中,启动FTP server,设置监听端口21,passive mode的端口范围50000-50100

自然顺理成章地,在vmware NAT中转发50000-50100.但尼玛悲剧的是,它的转发只能一个端口一个端口设置(太不科学了)!忍着爆发的情绪,输了21个端口,即50000-50020,先这么着吧。同时设置passive mode时要求客户端连接的ip(显然是NAT的外网ip啦,要是内网IP人家还怎么连)。

然后我就用外网电脑一客户端连接之,命令连接显然没有问题,但在entered passive mode之后,服务器声称打开了【外网IP:50000】端口,但客户端收到的却是【外网IP:50541】端口,显然后者端口是个随机的,NAT没转发,怎么可能被FTP server收到!但试n遍都是同样的状态,就想到是不是NAT的问题?

于是在文章《VMware Workstation建立FTP服务器并使用PASV模式》中提到的常见问题中,有类似的情况,他提供的解决办法是不要使用默认的21到21的映射,你可以搞一个外网21到内网20021的映射呀,于是我就这样做了。嘿,果然端口号不被篡改了,直来直去爽歪歪!

但是处女座的我对现状依然不满(疑问):

  1. 为毛非要我21到20021的映射,凭什么21到21就乱搞我?
  2. 为毛VMware的NAT这么sb,不支持端口段转发?(TP-Link路由都支持呢)
  3. 明明能用了,为毛我还是不满???
在我纠结之时,看到文章 《FTP主动与被动之NAT》提到:

中国的ip地址资源太少,很多情况下ftp会话两端要经过层层NAT、网关、防火墙。 导致PORT PASV中的ip 信息不一定都是正确的。比如client的ip是192.168.0.107,其实它是通过NAT连接上网的,该NAT对外的internet地址是218.2.135.1,那么client 发送的PORT指令中携带的192,168,0,107,xx,yy 对于server是没有意义的。 所幸现在的 NAT、防火墙一般都有FTP应用层感知能力,它能够截获ftp会话中的PORT PASSIVE, 自动将private的ip翻译成对外的正确的ip,并实时的在NAT上开放临时端口转发 。刚才的例子就会翻译成 218,2,135,1,xx,yy。 所以一般情况下,ftp还是能够正常工作的。


卧槽?NAT原来这么智能啊,你不主动发起连接,他都能帮你开转发啊。。。

想想之前遇到的端口被篡改事件,以及把映射端口变成20021就不影响的现象,应该和NAT有巨大关系。


结论

VMware的NAT是极其智能的,它可以感知应用层数据,帮你在傻瓜状态下实现passive mode。

触发条件:

NAT转发规则:21到21,表示你这个就是FTP服务。(只要任何一端端口换了,它就不管了,因此疑问1得以解释)

工作原理:

检测FTP应用层数据,当发出192,168,0,107,xx,yy时,它自动改成218,2,135,1, zz,ww,并建立外网zzww到内网xxyy的端口转发。

解决方法(正确的配置):

  • 对于VMware,只需要配置21到21的端口转发
  • 对于guest中的FTP server,设置passive mode时要求客户端连接的ip为内网IP(或者选择default)
  • 不需要手工指定passive mode port range
此时服务器entered passive mode后,会通知客户端打开了一个【内网IP:某一端口】,NAT会将这句话自动改为【外网IP:另一端口】,并自动映射,从此皆大欢喜。因此往往涉及端口段的转发,VMware NAT是不需要的,因此没有提供这个功能(由此证明TP-Link是没有这么智能的?至此疑问2被解答)

(所以说我之前所有的设置都白费了,VMware提供了极为傻瓜的解决方案,而我知其一不知其二,硬是掺和进这一过程。所以要么21到21,完全让VMware解决;要么设置个20021非默认端口,自己一个一个配置转发passive mode range吧!)

对于疑问3,任何一点知识和经验都是由学习或实践积累而得,可以说我没时间阅读VMware的手册,就要抽出时间解决这些蛋疼问题。但蛋疼的就是自己的,花两个小时解决一个问题,而且弄清楚来龙去脉,岂不是很爽?

解决计算机问题完全靠滚雪球效应,知识越多(尤其是原理),解决得越快,很高兴自己走到了 有信心解决一切问题的地步了,虽然耗时仍然很长……

(最后请记得把防火墙重新打开,并配置开放NAT可能开放的端口段,应该是50000以上,我这里是51000-52000)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值