200 PORT command successful. Consider using PASV.

今天登陆一个外网的FTP,网页能正常登陆及浏览,但dos窗口下却只能登陆上去,但输入ls命令却被拒绝了,可能是对端采用了NAT转换,主动模式登陆不进去,解决办法如下。 

230 Login successful.
ftp> ls
200 PORT command successful. Consider using PASV.
425 Failed to establish connection.

 

 �P於 FTP

事��上�o�H知道如何操作 iptables 工具�o�不足以�O定好您的防火��及 NAT �o您�要�Ω鞣N TCP/IP 服�斩家�有相��程度的了才行�s您必�知道一���B�的建立�^程是怎�拥末o每一��封包�幼魇窃��囊欢怂偷搅硪欢说摹D�除了要知道每一��封包的�碓春湍康奈恢珐o�要知道它��的�碓床嚎诤湍康牟嚎凇6�且�o我��不要忘�了�s所有�B�都是�p向的�o您除了要照��目�舳说剿欧�器端的�求�o也要照��乃欧�器到客�舳说幕��。下面�o�我��看一看火��的�O定如何影� FTP 的�\作的( FTP 是一��非常�典的 NAT/Firewall �O定�例)。

首先�o我��要知道 FTP 的�B�模式有�煞N�s主�幽J�( active )和被�幽J�( passive )。要了解�@���模式的不同�o得要了解 FTP 的�B�是怎�咏�立的�s

在正常模式下�s

 

  1. FTP client �_�⒁���S�C�x�竦母哽� 1024 的 port 呼叫 FTP server 的 port 21�求�B�。���利完成 Three-Way Handshake 之後�o�B�就成功建立�o但�@�H是命令通道的建立。
  2. ���啥诵枰��魉唾Y料的�r候�oclient 透�^命令通道用一�� port 命令告�V server �o客�舳丝梢杂昧硪��高於 1024 的 port 做���通道�o�K��浜� socket �Y源。
  3. 然後 server 用 port 20 和��才 client 所告知的 socket 建立����B�。�注意�s�B�方向�@是�� server 到 client 的�oTCP 封包��有一�� SYN 旗�恕�
  4. 然後 client ��返回一���� ACK 旗�说拇_�J封包�o�K完成另一次的 Three-Way Handshake 手�m。�@�r候�o���通道才能成功建立。
  5. �_始����魉汀�

 

在 passive 模式下�s

 

  1. FTP client �_�⒁���S�C�x�竦母哽� 1024 的 port 呼叫 FTP server 的 port 21�求�B��o�K完成命令通道的建立。
  2. ���啥诵枰��魉唾Y料的�r候�oclient 透�^命令通道送一�� PASV 命令�o server�o要求�M入 passive �鬏�模式。
  3. 然後 server 像上述的正常模式之第 2 步�E那�萤o挑一��高於 1024 的 port �o�K用命令通道告�V client �P於 server 端用以做���通道的 socket。
  4. 然後 client 用另一��高於 1024 的 port 呼叫��才 server 告知的 scoekt �斫�立���通道。此�r封包�� SYN �嘶`。
  5. server �_�J後回��一�� ACK 封包。�K完成所有交握手�m�p成功建立���通道。
  6. �_始����魉汀�

 

我��都知道�s火��的保�o�ο笫�炔烤W路的 client 主�C。防火���榱�醯粢恍�碜酝饷娴奈kU�幼鳗o通常��限制那些�碜酝饷娴闹�舆B��o也就是�� SYN �嘶`的封包(��⒖� Three-Way Handshake 的�^程)。在�@�拥那�r下�oiptables 或�S有�@�拥囊���O定�s

iptables -I INPUT -i ppp0 -p TCP --syn -j DROP 
iptables -I FORWARD -i ppp0 -p TCP ! --syn -j ACCEPT

在第二行中的那�� " ! " 就是 NOT 的意思�o" ! --syn " 就是 NOT SYN 之意�o也就是只允�S非主�舆B�的 TCP 封包�耐獠拷缑孢M入�o�@和第一行的意思一�萤s不接受�碜酝饷嬷�咏�立的�B�。

 

Tips�s前面我��已��f�^我��可以��鞯� NAT 外部界面的�B��D到 DMZ �e面去。假如我��有�@�拥囊�求�o�s�^�m沿用前面那行�� " ! -y " 的��t的��o外面的客�糁�C就�o�慕�立�B��磉B接我��的服�罩�C了。但我��又不想取消它�o以免危害到其它非 DMZ 的�炔烤W路。

 

��得 iptables 的行�榱��T�岍s它��自上而下的�Ρ纫��t�o找到符合的就不再往下找了。根���@�拥奶匦冤o我��可以�� NAT 外部界面�M入的某些�B��o在那行 syn �^�V��t之前 ACCEPT �M�怼2贿^�o就要非常小心�e漏了必要的限制元素�o有可能的��o�M您想象把��t�O得�烂苡�烂馨伞�

 

假�O我���@�r候有一��在防火��之後的 FTP client 要��D�B接外面的 FTP server 。在正常模式下�o(第 3 步)�碜� server 的���通道之建立�求就��被�跸�愆o�@���е���通道�o�慕�立。�m然您可以 login �M�h端的 FTP 伺服器�o但如果�入 ls 後�o�s看不到�Y果的。FTP 的 login �c ls 是透�^命令通道�M行的�o因�槊�令通道的建立�K�]���}�o所以 server 可以收到命令。但 ls 的�Y果�_需要透�^���通道送回�愆o然而���通道�s不能建立建立。所以 server 在�魉褪�♂岍o再用命令通道告�V您�s “Can't build data connection: Connection refused.”

明白了�t是否解�了困�@您心目中以久的疑�F呢�t ^_^

好了�o如果用 Passive 模式又��如何呢�t�我��回去看看正常模式的第 3 步和 Passive 模式的第 4 步�o然後�z查它���M出防火��的方向�o以及防火��如何�理 SYN 封包就知道了。我不想直接把答案告�V您。自己要懂得思考�o才��有�M步�u不是�岍t

 

Tips�s不�^�o在 iptables 中有一�� RELATED 的 TCP �B���B�嘶`�o可以� ftp-data �B��利建立�s

 

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

 

但是�o我必�再指出�s上面�的是基於一�� routing 健全的情形下。如果用 NAT 的��o封包的位址���有所改�。�o�用正常模式或 Passive 模式�oserver 都看不到 client 的位址�oserver只看到 NAT 的位址而已。故此�o就算您取消了入站封包的 SYN 限制�o在正常模式下�碜� server 的���通道�B��o封包只��送到 NAT 主�C的外面界面那�e。但���}是 NAT �K�]有��B�的 NAT ���o也就不���⑿薷姆獍� socket �⒅�送回�e面的客�糁�C。除非�o您能��� client 端做 ftp-data 的 DNAT 。然而�o因�� client 所使用的 ftp-data socket 是�S�C挑�x的一��大於 1024 的 port �o您事先�]�k法在 NAT 上知道 ftp client 用哪�� socket 的。然而�o更重要的���}在於�sclient 在命令通道中所使用的 port 命令�o其 IP 是原有的�炔课恢珐p而 NAT 根本不���⒅�修改�^�愆u所以 server 在建立 ftp-data �B�的�r候�o根本就不可能路由到正�_的位址�u

那是否有�k法解�Q呢�t��然有的啦~~ 使用 passive 模式就可以了�u�槭颤N�t不知道您的�X筋是否能�D得�^�砟丞t 那是因�椹s在 passive 模式下面�o所有�B�的建立方向都是��炔康� client 送往外面的 server 的�r因�檫@���B�需要做 SNAT�o那�N�oNAT 的 table 中有�@�� socket �D�Q的��了�r然後�� server 所送回的回��封包�o理所��然也能�利完成 socket 的�原工作。

明白了�t或�S�o您又�����s那如果在 NAT 情�r下�o不使用 passive 模式呢�t是否�有�k法解�Q ftp ���通道的���}�t

搭配核心模�M

呵~~ 就算不用 passive 也可以啦�u只要能� NAT 抓到 ftp client 在命令通道中送出的 port 命令�o�K修改原本在封包 body 中的 socket �o那就可以‘�明的’在外部界面上建立 DNAT socket�o以等待 server 那�的���通道�B��求了。�@工作�o通常是由核心模�M�硗瓿傻末o在 2.4.x 核心上�o您只需�绦腥缦旅�令就可以了�s

modprobe ip_conntrack_ftp 
modprobe ip_nat_ftp

 

Tips�s在 2.2.x 核心中所使用的模�M名�Q�� ip_masq_ftp �o不�^�o它只能跟 ipchains 配合使用。就算您在 2.4.x 核心中能�蜉d入 ipchains 模�M�o但因�� 2.4.x 核心的 ip_nat_ftp �K不能�c ipchains 合作�o所以也就�]�k法了。假如您有�d趣知道 ip_masq_ftp �@��模�M��做些什�N�t��⒖季W友 常��I 兄的精解�s

 

 

常��I 

 

文章�m然是描述 ip_masq_ftp 模�M的�o但其中的原理和 ip_nat_ftp 是一�拥摹�

 

事��上�oFTP 服�盏脑O定�o在防火���c NAT �O�中非常具有代表性。如果要�y�自己�� NAT 的�O定是否及格�o用 FTP 服��砜甲约壕�α恕H绻�您有�d趣�o不妨做做下面�@����}哦�s

 

NAT 的 FTP �O定命�}

 

�a充�s在�^往的�y�中�o我曾�作�^如此猜�y�s

 

如果 server 和 client �啥硕几髯远阍� NAT 背後�o�o�用 ipchains 和
iptalbes 都�o法用 passive 模式�斫�立 data channel。

 

然而�o在最近的�y�中�o我�l�F netfilter 所��淼� ip_conntrack_ftp 以及 ip_nat_ftp 模�M 已�能�虺晒Φ倪M行 server 端�c client 端的�B��D�Q。

�Q而言之�o我之前所提到的�^�V�s“client �c server �p方都在 NAT 之後是否能�B��t”�F在已�不是���}了�u��在非常感�x netfilter 的工作者��。

p.s. 我所�y�的核心�� 2.4.16 以及 iptables-1.2.1a-1 。

 

如果您在�⒖即鸢钢�前能�蚋愣� FTP 服�盏脑��o那基本上您就及格了。否�t�o我�衲��是�e急著碰 NAT 的�O定。

除了 FTP 之外�o�有�S多其它服�粘淌僵o也有�似的‘多通道�B�’的特性�o例如 netmeeting �prealaudio�p�W路游�颟p等等。因�檫@些程式大都�]有所�^的 passive 模式�o所以�o只能靠相�P的模�M�兔α恕H绻�您有相�P���}�o不妨到下面�W站找找�s

 

http://www.tsmservices.com/masq/

 

�@���W站有�S多奇奇怪怪的 IP �窝b技巧�c模�M�o相信���有您感�d趣的�|西。

你可能感兴趣的:(vsftp,被动模式,主动模式)