爲了服務器安全着想,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客戶端測試連接,此時應該可以順利的連接上你的服務器了。