FTP的问题
FTP协议
这是一个由于FTP协议所造成的问题, 让我们先看一下FTP协议.
FTP一般需要使用两个端口, 端口21只是一个命令端口, 真正传送数据的时候, 还需要另外一个数据端口. 问题就出现在第二个数据端口上.
打开这个数据端口的时候有两种方式, 一种是passive(PASV command)方式, 由FTP Server端提供一个连接的IP/Port, FTP
Client连接到这个IP/Port上进行数据传输. 另一种是active(PORT command)方式, 由FTP Client提供IP/Port,
再由FTP Server回叫至Client提供的地址. 具体采用哪一种方式, 是由FTP
Client决定的, Client通过PASV或PORT命令通知Server采用什么方式. 正是这样的握手方式, 给Server端和Client端都造成了麻烦. 这个问题的具体描述详见
target=_blank>http://www.daemonnews.org/200109/ftpnat.html
FTP Server
Server端一般不希望使用passive方式, 这种方式要求防火墙动态地打开PASV的端口.
而active方式对于Server的防火墙没有什么特殊的要求. 但是FTP
Server是不能选择的, 除非声明不支持passive方式. 一般的解决方法是, 在防火墙上固定地打开一些端口, 如 15001-19999, 每次通信, FTP
Server软件可以从这些端口中选择一个作为PASV的端口通知FTP Client. 如果你的FTP
Server不支持指定passive端口范围, 你应该考虑更换FTP Server了. 这种方式防火墙需要增加规则
pass in quick on tun0 proto tcp from any to 0/32 port 15000>< 20000
flags S keep state keep frags
FTP Client
根据上面的协议规则, 如果FTP Client采用passive方式, 对于防火墙来讲没有什么特殊的要求, 我们可以把问题留给FTP Server.
好消息是,一般的FTP Client软件都支持passive方式, 我使用的网络蚂蚁(netant), 网际快车(FlashGet)默认方式都是passive,
WS_FTP是可以设置的, 这样防火墙就不需要特殊处理了. Unix下需要设置
FTP_PASSIVE_MODE=yes; export FTP_PASSIVE_MODE
坏消息是, 浏览器的FTP使用的是active方式, 而且好像还不能更改. 不过现在直接使用浏览器FTP的人已经是很少了
------ 我从来就不用浏览器下载.
还有, 有一些FTP站点, 不支持passive方式. 我曾经访问过一些私人的FTP站点, 就无法使用passive下载, 也许是他们在设计防火墙的时候没有考虑吧.
支持active模式可以通过在NAT上增加proxy解决的. Linux通过增加ip_conntrack_ftp解决, ipnat已经完成了这一功能, 我们只需要增加一条规则就可以了.
那就是我前面ipnat.conf中的第一条规则. 该proxy可以还提供反向FTP代理, 用于FTP Server. 可惜的是, 这样有可能造成安全隐患,详见 target=_blank>http://www.false.net/ipfilter/2001_11/0273.html.
我曾经与其他一些ipfilter的使用者讨论过这个问题, 一般认为, 如果gateway兼做对外的FTP Server, 需要对外提供FTP服务的话, 最好还是不要开放这一proxy, 内部用户只允许使用passive方式.
如果仅仅是做一个对外的代理服务器, 即FTP只对内部机器开放, 开放这一proxy应该是安全的.