這兩天在給客戶安裝服務器時也順便給他們使用iptables,不用不知道,一用才發現iptables還有很多東西可以學的,比如開放ftp。
iptables
的filter表的INPUT鏈的默認策略設為了DROP,其余的鏈均為ACCEPT。
該服務器即要作ftp服務器,也要連上別的ftp服務器。即是說要把源端口和目的端口都開放21才行:
iptables -A INPUT -p tcp
–sport 21 -j ACCEPT
iptables -A INPUT -p tcp –dport 21 -j
ACCEPT
開了21端口就行了嗎?不是的。先說說ftp協議。ftp協議是一個簡單、保密性差(明碼)的tcp協議,它的工作原理是客戶端先連服務器端
的21端口,然后經過3步的握手以后建立了一條連接。要注意的是,這條連接只可以用來傳輸ftp的命令,只有這條連接的話是什么都傳不了的,就算是用
“ls”命令來查看文件也不行。
建立了命令的連接以后,服務器端就要建立一條數據的連接。數據的連接又分為主動模式(port)和被動模式(passive)。ftp默認是被動
模式,主動和被動之間使用”pass”命令切換。主動模式通過20端口與客戶端相連,而被動模式卻使用1024以后的端口與客戶端相連。由于1024以后
的端口是隨機分配的,所以在被動模式下我們是不知道服務端是使用什么端口與客戶端連接的。也就是說,我們是不知道iptables要開放什么端口。
開始我使用的是
iptables
-A input -p tcp –sport 1024: –dport 1024: -j
ACCEPT
來讓ftp建立被動連接的。但覺得如果這樣的話,那就等于把所以p2p的連接都開放了,不安全。
于是在CU上問人,終于找到了解決的方法:
1、加載模塊。
modprobe ip_nat_ftp
modprobe ip_conntrack
modprobe
ip_conntrack_ftp
2,加上一條規則:
處于server
iptables -A INPUT -m state –state ESTABLISHED,RELATED
-j ACCEPT處于clientiptables -A OUTPUT -m state –state ESTABLISHED,RELATED -j
ACCEPT
允許連接保持的被動訪問。
其實這樣在重啟iptables的時候所需的模塊又不見了,通過不懈的努力終于找到了最終的解決方法,編輯/etc/sysconfig/iptables-config:
IPTABLES_MODULES="ip_conntrack_ftp"
IPTABLES_MODULES="ip_nat_ftp"
把需要加載的模塊加入,無論重啟系統還是iptables但ftp模塊始終還是加載的。
搞定就這樣哈哈哈,希望能在以后幫助大家來解決ftp上的問題。
本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u1/51714/showart_423414.html