iptables下開放ftp連接
這兩天在給客戶安裝服務器時也順便給他們使用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、加載模塊。
modpobe ip_nat_ftp
modpobe ip_conntrack
modpobe ip_conntrack_ftp
把原有規則:iptables -A input -p tcp –sport 1024: –dport 1024: -j ACCEPT
改爲:iptables -A input -p tcp –sport 1024: –dport 1024: -m state –state ESTABLISHED,RELATED -j ACCEPT
允許連接保持的被動訪問。
問題終於解決了。
/sbin/iptables -P OUTPUT ACCEPT
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_conntrack
/sbin/modprobe ip_conntrack_ftp
/sbin/iptables -A INPUT -p tcp --sport 21 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 21 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT
# /sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A OUTPUT -p icmp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A INPUT -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
/sbin/iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT