Linux系統安裝FTP服務端引發FTP客戶端遠距離下載較大文件超時相關問題的解決方案

已經好久沒有更新博客了呢......

最近也是遇到了一些奇葩問題,就把這些問題的解決方法寫到博客上來,希望幫助到一些朋友,避免再花費大量時間來研究這個東西,用更多的時間去做創造性的東西吧

問題場景:

我在Linux系統按照網上教程安裝了FTP服務端,然後我在另一個Linux客戶端定期執行一個利用FTP命令下載文件的腳本,結果發現在下載大文件時(28M),卡在那裏了,一直不執行下載了,就是FTP中的mget命令,這個命令是下載多個文件的命令,即下載指定格式的文件,我就用xftp試了下,發現這種商業級別的FTP工具也卡住了,我就懵逼了,一直在找原因,最終找到原因了,即這篇博文。如果你也遇到同樣問題,那麼請按照我說的方法可以保你解決問題!

1、安裝FTP服務端——vsftpd

shell> yum install -y vsftpd

2、修改配置文件爲我下圖展示的內容(其中一些並不是絕對有影響的,但是避免腳本運行過程中出現其他問題,建議按照以下配置來修改

# 配置文件目錄爲/etc/vsftpd/vsftpd.conf

shell> vim /etc/vsftpd/vsftpd.conf

anonymous_enable=NO
local_enable=YES
write_enable=YES
connect_from_port_20=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
allow_writeable_chroot=YES
listen=NO
listen_ipv6=YES

3、添加ftp賬戶

# 添加用戶 ftpxxxx
# -d:指定用戶主目錄 
# -s:指定用戶所用的shell,此處爲/sbin/nologin,表示不登錄

shell> useradd ftpxxxx -d /home/ftp -s /sbin/nologin

shell> passwd ftpuser

這個時候如果想要使用FTP客戶端連接FTP服務端的話,一定要將重新啓動一次,或者將vsftpd服務暫停,然後再啓動,這樣纔會重新加載修改後的配置文件,否則你的配置文件就不會生效。

# 重新啓動 vsftpd 服務
shell > service vsftpd restart
# 查看 vsftpd 服務的運行狀態是否重新啓動運行了
shell > service vsftpd status

# 或者 先暫停 再啓動
shell > service vsftpd stop
# 查看 vsftpd 服務是否暫停了
shell > service vsftpd status
# 啓動 vsftpd 服務
shell > service vsftpd start
# 查看 vsftpd 服務是否啓動了
shell > service vsftpd status

4、倘若FTP客戶端無法連接,請檢查服務端vsftpd服務是否運行,因爲我測試的時候發現重啓後,vsftpd服務並不是開機啓動的,這時候需要我們手動運行服務

# 查看 vsftpd 服務狀態
shell > service vsftpd status
# 手動運行 vsftpd 服務
shell > service vsftpd start

服務啓動後還連接不上就有可能出在配置文件中的問題,如果開啓了以下兩個選項,請在相應目錄下創建一個chroot_list文件後,再嘗試連接,執行以下命令

# /etc/vsftpd/vsftpd.conf配置文件中的兩個選項
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list


shell> touch /etc/vsftpd/chroot_list

5、檢查shells文件中是否有添加賬戶的nologin

shell> cat /etc/shells
# 如果沒有 /sbin/nologin,則添加
shell> vim /etc/shells
# 添加一行 /sbin/nologin

6、查看防火牆的狀態信息

# 查看防火牆狀態信息
shell> firewall-cmd --state

# 如果是運行的狀態可以先關閉,驗證關閉防火牆之後ftp是否可以登錄成功,如果ftp登錄成功,請
# 在防火牆中配置允許ftp服務端口運行即可解決該問題,命令如下,否則就不是防火牆的問題,請繼續
# 排查其他原因

# 允許 ftp 服務
shell> firewall-cmd --permanent --zone=public --add-service=ftp
# 重新載入配置
shell> firewall-cmd --reload
shell> service firewalld stop (暫停之後等10s左右再去啓動防火牆)
shell> service firewalld start

7、查看Selinux的狀態信息

shell> sestatus
# 如果是運行的狀態,可以先嚐試關閉,然後驗證ftp是否可以登錄,登錄成功即是selinux的問題,否
則就不是selinux問題,請繼續排查其他原因
shell> setenforce 0
# 說明:
# setenforce 0 設置SELinux 成爲permissive模式 (關閉SELinux)
# setenforce 1 設置SELinux 成爲enforcing模式 (開啓SELinux)

#如果關閉之後可以登錄,請做如下selinux配置:
# 查看當前配置
shell> getsebool -a |grep ftp
# 設置 ftp 可以訪問 home 目錄
shell> setsebool -P ftp_home_dir=1
# 設置 ftp 用戶可以有所有權限
shell> setsebool -P allow_ftpd_full_access=1

8、根治ftp連接遠距離下載較大文件超時問題

原因分析
因爲ftp傳輸文件是通過兩個端口完成傳輸的,控制命令端口(21)和數據傳輸端口(視主動或被動模式
而定),修改了linux系統中vsftp默認的超時時間後,還是會下載文件中斷,不下載,是因爲下載大文件超時
導致系統將控制命令端口關閉,倘若ftp客戶端帶超時自動重新登錄功能(如lftp),可自動重新登錄並下載
系統默認的ftp客戶端則不支持超時自動重新登錄功能,也就導致不能自動重新登錄,下載大文件後繼續下載
其他小文件失敗。

根據原因推斷:是操作系統將控制命令端口(21端口)超時關閉了,所以我們只需要修改Linux系統的配置文件後即可解決問題。(真的萬萬沒想到是操作系統的原因,我自己修改了Linux系統FTP服務端的vsftpd的配置文件嘗試了無數次)

解決辦法

# 修改系統默認配置文件
shell> vim /etc/sysctl.conf
# 添加如下配置
net.ipv4.tcp_keepalive_time = 30	每30s發送一次keepalive數據包
net.ipv4.tcp_keepalive_intvl = 10	確定keepalive探針在第一次保持活動探測後每10s發送一次
net.ipv4.tcp_keepalive_probes = 6	超時前的探測次數
net.ipv4.tcp_fin_timeout = 300		系統默認的超時時間
# 重新加載系統配置
shell> sysctl -p

# 重啓一次centos系統
shell> reboot

 

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