本篇文章將會介紹如何使用frp穿透內網以及如何在centos8環境下安裝和使用vsftpd,最后在公網通過frp穿透內網使用ftp。
一、內網穿透神器frp
frp 是一個專注於內網穿透的高性能的反向代理應用,支持 TCP、UDP、HTTP、HTTPS 等多種協議。可以將內網服務以安全、便捷的方式通過具有公網 IP 節點的中轉暴露到公網。
frp是一個go語言編寫的、開源的項目,github地址:https://github.com/fatedier/frp
中文文檔完整地址:https://gofrp.org/docs/
原理
frp 主要由 客戶端(frpc) 和 服務端(frps) 組成,服務端通常部署在具有公網 IP 的機器上,客戶端通常部署在需要穿透的內網服務所在的機器上。
內網服務由於沒有公網 IP,不能被非局域網內的其他用戶訪問。
用戶通過訪問服務端的 frps,由 frp 負責根據請求的端口或其他信息將請求路由到對應的內網機器,從而實現通信。
安裝
frp安裝包,直接到github上下載二進制文件即可:https://github.com/fatedier/frp/releases
啟動服務端:./frps -c ./frps.ini
啟動客戶端:./frpc -c ./frpc.ini
配合nohup工具使用效果更佳。
配置
解壓安裝文件之后,目錄層次如下:
├── frpc frp客戶端可執行文件
├── frpc_full.ini 完整的frp客戶單配置文件,僅作為參考
├── frpc.ini 真實使用的frp客戶端配置文件,通過frpc -c frpc.ini使用
├── frps frp服務端可執行文件
├── frps_full.ini 完整的frp服務端配置文件,僅作為參考
├── frps.ini 真實使用的frp服務端配置文件,通過frps -c frps.int使用
├── LICENSE
└── systemd 寫入系統服務的一些腳本,在centos8中並不好用,我用nohup工具進行了替代
├── frpc.service
├── frpc@.service
├── frps.service
└── frps@.service
關於具體的配置使用方法,可參考官方中文文檔,已經足夠詳細,不再贅述。但是要注意frp客戶端千萬不要死掉,死掉就連不上了。
二、安裝vsftpd
vsftpd是linux平台的ftp服務端軟件,這里只介紹vsftpd的簡單使用方法,不用虛擬用戶名的配置方式,全部使用linux實際用戶並且每個用戶只能看到自己的用戶文件夾。
安裝
使用命令yum install vsftpd
安裝vsftpd體積很小,不到1MB。
寫入服務
安裝完成之后,執行下面命令寫入服務
sudo systemctl start vsftpd
sudo systemctl enable vsftpd
防火牆准入
sudo firewall-cmd --zone=public --permanent --add-port=21/tcp
sudo firewall-cmd --zone=public --permanent --add-service=ftp
sudo firewall-cmd --reload
三、配置vsftpd
vsftpd的配置文件都在 /etc/vsftpd文件夾中,最核心的配置文件是 /etc/vsftpd/vsftpd.conf ,所以基本上所有的配置都是圍繞 /etc/vsftpd/vsftpd.conf 文件進行的。
在配置該文件之前,需要注意一點,那就是 /etc/vsftpd/vsftpd.conf 配置文件中的配置並不全,很多配置是必須的,但是里面並沒有給出,必須到網上自己查。 這點非常不友好,甚至可以說是非常白痴,畢竟像是frp,怕你不知道怎么寫配置,還給了一個非常全面的frpc_full.ini之類的模板文件。
1.配置vsftpd.conf
禁用ipv6,啟用ipv4
listen_ipv6=NO
listen=YES
禁用匿名登錄
anonymous_enable=NO
允許已登錄用戶上傳
write_enable=YES
只允許登錄的用戶 訪問自己的文件夾
chroot_local_user=YES
allow_writeable_chroot=YES
設置user_list配置文件模式以及配置准入用戶
userlist_enable=YES
userlist_file=/etc/vsftpd/user_list
userlist_deny=NO
注:userlist_deny為NO表示/etc/vsftpd/user_list配置文件中的用戶都是允許登錄ftp的用戶;userlist_deny為YES表示/etc/vsftpd/user_list配置文件中的用戶都是不允許登錄ftp的用戶
關閉主動模式登錄
connect_from_port_20=NO
配置被動模式登錄(重要)
pasv_address=外網ip地址
pasv_enable=Yes
pasv_min_port=50000
pasv_max_port=50002
pasv_promiscuous=YES
2.創建ftp用戶
創建用戶
sudo adduser testuser
sudo passwd testuser
將用戶添加到user_list文件
echo “testuser” | sudo tee –a /etc/vsftpd/user_list
3.重啟ftp服務
使用命令sudo systemctl restart vsftpd
或者service vsftpd restart
重啟ftp。
四、frp內網穿透並使用ftp服務
1.防火牆准入
在安裝vsftp的時候已經做了一次防火牆准入,那是開啟21端口號准入,這里則是進行數據端口號防火牆准入。
在上面的vsftpd配置中,使用了被動模式數據傳輸,在這種模式下,需要服務端開啟若干個端口號進行數據傳輸,由於使用了frp內網穿透,所以需要公網主機和客戶端主機同時開啟端口號進行一一映射,這時候不適宜進行過多的端口號開放,根據配置文件vsftpd.conf中的配置
pasv_min_port=50000
pasv_max_port=50002
開放端口號50000到50002
firewall-cmd --permanent --zone=public --add-port=50000-50002/tcp
firewall-cmd --reload
2.frpc配置
服務端不動,只需要配置客戶端並重啟即可
[ftp]
type = tcp
local_ip = 127.0.0.1
local_port = 21
remote_port = 21
[ftp1]
type = tcp
local_ip = 127.0.0.1
local_port = 50000
remote_port = 50000
[ftp2]
type = tcp
local_ip = 127.0.0.1
local_port = 50001
remote_port = 50001
[ftp3]
type = tcp
local_ip = 127.0.0.1
local_port = 50002
remote_port = 50002
ftp負責接入,ftp1、ftp2、ftp3負責數據傳輸,配置完成之后重啟frp客戶端即可。
3.測試
在windows環境下使用filezillia ftp客戶端進行測試,ip地址填寫公網frp服務端地址,端口號填寫21,被動模式,填寫完賬號密碼后登陸即可查看下效果。
五、遇到的一些問題
1.vsftpd 425 Security: Bad IP connecting.
FTP客戶端軟件連接VSftpd服務報此錯誤,大概原因是在連接中變換了IP地址。
解決方案是修改/etc/vsftpd/vsftpd.conf,添加或者修改pasv_promiscuous=YES配置項
2.ftp客戶端顯示“返回了不可路由的服務器地址”
解決方案是修改/etc/vsftpd/vsftpd.conf配置文件,配置配置項pasv_address=xxxx,這個配置項需要綁定公網ip地址,和vsftpd所在的機器ip可能不同,實際上就是暴露ftp服務的公網ip,在我這里實際上就是frps地址。
3.移動端連接不上或者無內容
出現過手機端鏈接不上或者連上了但是看不到內容的情況,分別用ES文件瀏覽器、FE文件管理器、FTPManager軟件進行了測試,沒有一個正常的,但是在windows端使用filezillia客戶端確是好的
經過嘗試,原來是忘了配置一行pasv_enable=Yes ,感覺像是個廢話實際上不是啊。。。
六、參考文檔
https://phoenixnap.com/kb/how-to-setup-ftp-server-install-vsftpd-centos-7
https://blog.csdn.net/cy104204/article/details/24490729
https://serverfault.com/questions/421161/how-to-configure-vsftpd-to-work-with-passive-mode/421169
https://blog.csdn.net/default7/article/details/97898056