搭建FTP
1)环境描述:
-Host操作系统:win7
-Guest操作系统:Ubuntu11.10 服务器版
-虚拟机软件:ORACLE VirtualBOX4.0.8
-虚拟机网络连接方式:NAT (其他虚拟机软件,例如vmware也很类似)
-Host上的FTP客户端软件,Filezilla 3.5.1
-Guest上的FTP服务端软件,proftpd 1.3.4
2)网络连接方式的选择:
虚拟机软件都是通过虚拟网络接口(包括虚拟路由器/交换机等)的方式实现Host和Guest的互访,以及Guest访问外网的需求,VirtualBOX支持以下四种网络连接方式
a)NAT方式;
可以从Guest通过NAT方式访问外网(相对Host而言)资源,Guest通过虚拟的DHCP服务器获取内网(私有)IP地址;
b)Bridged Adapter;
实际上是通过搭建虚拟网桥,将Host的物理网卡与Guest的虚拟网卡桥接,相当于通过Host的单一物理网卡,连接了一个HUB,Host和Guest都通过这个HUB连接到外网;这种方式是限制最少的模式,但是由于Guest完全暴露在外网,因此安全性方面完全依赖Guest;
c)Internal networking;
手册上说这种方式类似Bridge,但是实际上比Bridge方式限制多多了,无法访问外网,外网也无法访问Guest,只是Guest之间可以通过相同的命名实现互访,比较安全;
d)Host-only adapter;
这种方式比较令人困惑,个人感觉用处并不大,但是从手册上的描述来看,如果存在一个Web服务器和数据库服务器,可以只将WEB服务器暴露给外部,同时隐藏数据库服务器;
考虑到目前HOST主机是通过3G上网卡上网,并没有一个可用的物理网卡提供给虚拟机使用,同时虚拟机需要经常访问外网下载更新包,因此采用NAT方式,搭配port forward实现Host和Guest的文件交互;
设置NAT方式以后,在Guest中通过DHCP自动获取到的IP地址是10.0.2.15,网关地址是10.0.2.2,Host主机的无线和有线网络都处于断开状态,Host只是通过3G网卡连接互联网。
3)FTP的两种工作方式
国内网站对于两种工作方式的描述也不少,但还是老外的一篇文章讲的最清楚,其中包括了详细的例子:http://slacksite.com/other/ftp.html
简单来说,主动(active)和被动模式(passive),在建立控制链接(PORT 21)的时候,没什么区别,区别只在于建立数据链接的时候,主动模式的连接是从服务端的PORT20发起,到客户端的随机端口(端口由客户端软件指定);被动模式的连接是从客户端的随机端口发起,到服务端的随机端口(端口由服务端软件指定)。
在配置端口映射 port forward的时候,两种方式都能够正常工作,但是配置方法有很大区别,后面的篇幅将详细描述两种配置方法
4)FTP软件的选择
FTP客户端软件的选择比较多,cuteftp/flashfxp等商业软件,个人比较喜欢开源的file zilla,该有的功能基本上全有,支持比较复杂的配置,界面也说不上难看。
FTP服务端的软件,我用过的不算多,但是考虑到配置的灵活性,选择了Proftpd,后面有针对proftpd配置的描述。
客户端和服务端的FTP软件安装都不复杂,采用操作系统的默认安装方式就可以,ubuntu下apt-get install proftpd就ok了,默认配置暂时不需要修改。
5)针对主动模式(Active)的配置
a)客户端(file zilla)的配置:
编辑->设置->连接->FTP->传输模式 ,设置为主动,取消“失败后允许返回到其他传输模式”的选择
->主动模式,限制file zilla使用的本地端口,49100~49199,这样做是为了方便后续的观察
主动模式IP,使用以下IP地址,10.0.2.2,这是在Guest中的网关地址,取消“本地连接不使用外部IP地址”的选择
另外,在连接管理器中,站点的传输设置,设置为“主动”
b)服务端的配置:
都使用默认设置即可
c)虚拟机的网络设置
虚拟机的设置页面,网络->网络连接->高级->port forwarding,添加从Host到Guest的21端口映射,即Host 21 -> Guest 21
当使用主动模式连接时,连接过程如下:
-首先Host发起访问Guest 21端口的连接,进行身份验证;
-通过后,Host(file zilla)会通过PORT指令,打开Host的49100~49199端口范围内的一个随机端口,并告诉Guest;
-Guest会使用本地的20端口,连接Host的上述随机端口,进行数据传输
在Host和Guest上,都可以通过netstat -an查看端口连接的情况
6)针对被动模式(Passive)的配置
a)客户端(File Zilla)的配置:
编辑->设置->连接->FTP->传输模式 ,设置为被动,取消“失败后允许返回到其他传输模式”的选择
->被动模式,被动模式,选择“使用服务器的外部IP地址来代替”
另外,在连接管理器中,站点的传输设置,设置为“被动”
b)服务端的配置:
proftpd的配置文件位于/etc/proftpd/proftpd.conf
PassivePorts 设置为49000 49009 ,这是Host访问时,建立数据链接的随机服务端口范围
masqueradeAddress设置为127.0.0.1 ,这是Host访问时,由Guest提供给Host访问的“伪装地址”,如果不设置这个参数,则Guest返回给Host的地址就会是10.0.2.15
c)虚拟机的网络设置
虚拟机的设置页面,网络->网络连接->高级->port forwarding,添加从Host到Guest的21端口映射,即Host 21 -> Guest 21
另外,还需要增加49000 ~ 49009的十个端口的映射,VirtualBOX这里的设置不是很方便,不能指定端口范围,因此只能一个一个设置
当使用被动模式连接时,连接过程如下:
-首先Host发起访问Guest 21端口的连接,进行身份验证; 这里与主动方式一样
-通过后,Guest(proftpd)会通过PORT指令,打开Guest的49000~49009端口范围内的一个随机端口,并告诉Host(File Zilla);
-Host会使用本地的随机端口,连接Guest(proftpd)的上述随机端口,进行数据传输
在Host和Guest上,都可以通过netstat -an查看端口连接的情况