frp穿透内网使用vsftpd服务
本篇文章将会介绍如何使用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