CentOS6下iptables與FTP共存方法

爲了服務器安全着想,iptables防火牆是肯定啓用了的。我的iptables只允許了Web、SSH、FTP三個協議,並且爲了避免大範圍端口掃描,都是非標準端口。

許久不用FTP,今天登錄FTP的時候發現沒辦法和服務器通信,具體表現在無法連接數據端口上。由於我使用的是PASV被動模式,服務器端口是隨機的,思索一下即發現連接被iptables中斷。使用service iptables stop停止iptables後,一切正常,遂斷定爲iptables阻止了FTP的連入。

但我又不想把1024~65535範圍內所有的端口打開,那樣當然不安全。Google之後瞭解到ip_nat_ftp這個模塊可以達到我的需求。於是modprobe ip_nat_ftp然後service iptables restart重啓防火牆測試,問題依舊。使用lsmod查詢後發現,ip_nat_ftp模塊竟然沒有加載,而是nf_nat_ftp模塊被加載了。

於是又Google,在Shorewall防火牆的一篇說明文章中發現如下說明:

Note: If you are running kernel 3.6.20 or later, then the module names are nf_nat_ftp and nf_conntrack_ftp...

可是這個對於我的問題沒有幫助,因爲很顯然ip_nat_ftp也是nf_nat_ftp的別名,畢竟模塊已經加載上了。於是我又去查詢nf_nat_ftp的原理,瞭解到它是通過監聽21端口的PASV指令來打開對應端口的防火牆的。這麼一來問題就找到了:我使用的FTP端口根本就不是21,模塊也就沒法監聽了。

找到問題後就好解決了。需要注意的是,CentOS6中/etc/modprobe.conf文件已經不存在了(但仍然可以使用,只是系統不再生成了,via)。我們需要再另外在/etc/modprobe.d/下建立一個文件。

解決方案如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
rmmod nf_nat_ftp
rmmod nf_conntract_ftp #這一行和上一行是卸載已經載入的模塊,執行時可能會報錯,無視即可。
vim /etc/sysconfig/iptables-config
# 找到IPTABLES_MODULES="",修改爲IPTABLES_MODULES="nf_nat_ftp nf_conntrack_ftp"
vim /etc/modprobe.d/ftp.conf #如果爲CentOS6以下版本,可以嘗試vim /etc/modprobe.conf
# 在這個文件中寫上下面兩行
options nf_conntrack_ftp ports=你的FTP端口號
options nf_nat_ftp ports=你的FTP端口號
# 保存退出
services iptables restart #重啓防火牆,請注意先備份防火牆規則
iptables -nL
# 檢查你的防火牆中是否有如下規則
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:你的FTP端口號
# 如果沒有則將下面的兩條規則添加到防火牆規則文件
-A INPUT -p tcp -m state --state NEW -m tcp --dport 你的FTP端口號 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

經過上面的操作後,再啓動FTP客戶端測試連接,此時應該可以順利的連接上你的服務器了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章