设为首页 收藏本站
查看: 748|回复: 0

[经验分享] ftp连接原理

[复制链接]

尚未签到

发表于 2016-6-8 05:25:21 | 显示全部楼层 |阅读模式
  
關於 FTP
事實上﹐僅知道如何操作 iptables 工具﹐還不足以設定好您的防火牆及 NAT ﹐您還要對各種 TCP/IP 服務都要有相當程度的了才行﹕您必須知道一個連線的建立過程是怎樣的﹐每一個封包動作是怎樣從一端送到另一端的。您除了要知道每一個封包的來源和目的位址﹐還要知道它們的來源埠口和目的埠口。而且﹐我們不要忘記了﹕所有連線都是雙向的﹐您除了要照顧從客戶端到伺服器端的請求﹐也要照顧從伺服器到客戶端的回應。下面﹐讓我們看一看火牆的設定如何影響 FTP 的運作的( FTP 是一個非常經典的 NAT/Firewall 設定範例)。
首先﹐我們要知道 FTP 的連線模式有兩種﹕主動模式( active )和被動模式( passive )。要了解這兩個模式的不同﹐得要了解 FTP 的連線是怎樣建立的﹕
在正常模式下﹕
 

  • FTP client 開啟一個隨機選擇的高於 1024 的 port 呼叫 FTP server 的 port 21請求連線。當順利完成 Three-Way Handshake 之後﹐連線就成功建立﹐但這僅是命令通道的建立。
  • 當兩端需要傳送資料的時候﹐client 透過命令通道用一個 port 命令告訴 server ﹐客戶端可以用另一個高於 1024 的 port 做數據通道﹐並準備好 socket 資源。
  • 然後 server 用 port 20 和剛才 client 所告知的 socket 建立數據連線。請注意﹕連線方向這是從 server 到 client 的﹐TCP 封包會有一個 SYN 旗標。
  • 然後 client 會返回一個帶 ACK 旗標的確認封包﹐並完成另一次的 Three-Way Handshake 手續。這時候﹐數據通道才能成功建立。
  • 開始數據傳送。
 
在 passive 模式下﹕
 

  • FTP client 開啟一個隨機選擇的高於 1024 的 port 呼叫 FTP server 的 port 21請求連線﹐並完成命令通道的建立。
  • 當兩端需要傳送資料的時候﹐client 透過命令通道送一個 PASV 命令給 server﹐要求進入 passive 傳輸模式。
  • 然後 server 像上述的正常模式之第 2 步驟那樣﹐挑一個高於 1024 的 port ﹐並用命令通道告訴 client 關於 server 端用以做數據通道的 socket。
  • 然後 client 用另一個高於 1024 的 port 呼叫剛才 server 告知的 scoekt 來建立數據通道。此時封包帶 SYN 標籤。
  • server 確認後回應一個 ACK 封包。並完成所有交握手續、成功建立數據通道。
  • 開始數據傳送。
 
我們都知道﹕火牆的保護對象是內部網路的 client 主機。防火牆為了擋掉一些來自外面的危險動作﹐通常會限制那些來自外面的主動連線﹐也就是帶 SYN 標籤的封包(請參考 Three-Way Handshake 的過程)。在這樣的情況下﹐iptables 或許有這樣的一個設定﹕

iptables -I INPUT -i ppp0 -p TCP --syn -j DROP 
iptables -I FORWARD -i ppp0 -p TCP ! --syn -j ACCEPT
在第二行中的那個 " ! " 就是 NOT 的意思﹐" ! --syn " 就是 NOT SYN 之意﹐也就是只允許非主動連線的 TCP 封包從外部界面進入﹐這和第一行的意思一樣﹕不接受來自外面主動建立的連線。
 
Tips﹕前面我們已經說過我們可以將傳到 NAT 外部界面的連線轉到 DMZ 裡面去。假如我們有這樣的要求﹐卻繼續沿用前面那行帶 " ! -y " 的規則的話﹐外面的客戶主機就無從建立連線來連接我們的服務主機了。但我們又不想取消它﹐以免危害到其它非 DMZ 的內部網路。  
  還記得 iptables 的行為習慣嗎﹕它會自上而下的對比規則﹐找到符合的就不再往下找了。根據這樣的特性﹐我們可以將 NAT 外部界面進入的某些連線﹐在那行 syn 過濾規則之前 ACCEPT 進來。不過﹐就要非常小心別漏了必要的限制元素﹐有可能的話﹐盡您想象把規則設得嚴密又嚴密吧。
 
假設我們這時候有一個在防火牆之後的 FTP client 要試圖連接外面的 FTP server 。在正常模式下﹐(第 3 步)來自 server 的數據通道之建立請求就會被擋下來﹐這會導致數據通道無從建立。雖然您可以 login 進遠端的 FTP 伺服器﹐但如果輸入 ls 後﹐卻看不到結果的。FTP 的 login 與 ls 是透過命令通道進行的﹐因為命令通道的建立並沒問題﹐所以 server 可以收到命令。但 ls 的結果確需要透過數據通道送回來﹐然而數據通道卻不能建立建立。所以 server 在傳送失敗後﹐再用命令通道告訴您﹕ “Can't build data connection: Connection refused.”
明白了﹖是否解釋了困繞您心目中以久的疑團呢﹖ ^_^
好了﹐如果用 Passive 模式又會如何呢﹖讓我們回去看看正常模式的第 3 步和 Passive 模式的第 4 步﹐然後檢查它們進出防火牆的方向﹐以及防火牆如何處理 SYN 封包就知道了。我不想直接把答案告訴您。自己要懂得思考﹐才會有進步﹗不是嗎﹖

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-227510-1-1.html 上篇帖子: java ftp实例 下篇帖子: FTP 操作(命令行)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表