解決Linux iptables防火墻和vsftpd的問題
最近在研究Linux下Firewall的配置,發現配置好防火墻以后ftp就有問題了,一直都不能夠用Filezilla 和 CuteFTP登錄,在列出目錄的時候一直會失敗。但是在命令行下面如果先執行passive off,一切正常。
答案在CU上找到的,主要是要使用 ip_conntrack_ftp
linux.chinaunix.net/bbs/viewthread.php?tid=812400">http://linux.chinaunix.net/bbs/viewthread.php?tid=812400
原文:
使用 -P INPUT DROP 引起的網路存取正常,但是 ftp 連入卻失敗?
依據前面介紹方式,只有開放 ftp port 21 服務,其他都禁止的話,一般會配置使用:
iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
這樣的配置,確認 ftp 用戶端是可以連到 ftp 主機并且看到歡迎登入畫面,不過后續要瀏覽檔案目錄清單與檔案抓取時卻會發生錯誤...
ftp 協定本身于 data channnel 還可以區分使用 active mode 與 passive mode 這兩種傳輸模式,而就以 passive mode 來說,***是協議讓 ftp client 連結到 ftp server 本身指定于大于 1024 port 的連接埠傳輸資料。
這樣配置在 ftp 傳輸使用 active 可能正常,但是使用 passive mode 卻發生錯誤,其中原因就是因為該主機firewall 規則配置不允許讓 ftp client 連結到 ftp server 指定的連結埠才引發這個問題。
要解決該問題方式,于 iptables 內個名稱為 ip_conntrack_ftp 的 helper,可以針對連入與連外目的 port 為 21 的 ftp 協定命令溝通進行攔截,提供給 iptables 設定 firwewall 規則的配置使用。開放做法為:
modprobe ip_conntrack_ftp
iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
modprobe ip_conntrack_ftp
iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
其中 -m state 部分另外多了 RELATED 的項目,該項目也就是狀態為主動建立的封包,不過是因為與現有 ftp 這類連線架構會引發另外才產生的主動建立的項目。
不過若是主機 ftp 服務不在 port 21 的話,請使用下列方式進行調整:
CODE:
modprobe ip_conntrack_ftp ports=21,30000
iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 30000 -j ACCEPT
modprobe ip_conntrack_ftp ports=21,30000
iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 30000 -j ACCEPT
也就是主機本身提供 ftp 服務分別在 port 21 與 30000 上,讓 ip_conntrack_ftp 這個 ftp helper 能夠正常提供 ftp 用戶端使用 passive mode 存取而不會產生問題。
【編輯推薦】