为什么需要内网穿透功能?
从公网中访问自己的私有设备向来都是一件难事。自己的台式机、NAS等等设备,它们可能处于路由器后,或者运营商因为IP地址短缺不给你分配公网IP地址。果我们想直接访问这些设备(远程桌面、远程文件、SSH等等),一般来说要通过一些转发或者P2P组网软件的帮助。如果我有一台计算机位于一个很复杂的局域网中,我想要实现远程桌面和文件访问,目前来看其所处的网络环境很难通过简单的端口映射将其暴露在公网之中,有以下几种方法:
- 远程桌面使用TeamViewer。可用,但需要访问端也拥有TeamViewer软件,不是很方便,希望能使用Windows自带的远程桌面。且TeamViewer不易实现远程文件访问。
- 使用蒲公英VPN软件进行组网,可用,但免费版本网络速度极慢,体验不佳,几乎无法正常使用。
- 使用花生壳软件进行DDNS解析,可用,但同第二点所述,免费版本有带宽限制,无法实际使用。
- 搭建frp服务器进行内网穿透,可用且推荐,可以达到不错的速度,且理论上可以开放任何想要的端口,可以实现的功能远不止远程桌面或者文件共享。
frp是什么
- frp是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务, 支持tcp, udp, http,https等协议类型,并且web服务支持根据域名进行路由转发。
- frp内网穿透主要用于没有公网IP的用户,实现远程桌面、远程控制路由器、
- 搭建的WEB、FTP、SMB服务器被外网访问、远程查看摄像头、调试一些远程的API(比如微信公众号,企业号的开发)等。
- 为什么要选择frp?市面上提供内网穿透服务的公司对免费的用户是有限制的,
- 本站免费提供无限流量、无限域名绑定、不限制网速、不限制连接数的内网穿透服务。
准备工作
搭建一个完整的frp服务链,我们需要:
- VPS一台(也可以是具有公网IP的实体机)
- 访问目标设备(就是你最终要访问的设备)
- 简单的Linux基础(会用cp等几个简单命令即可)
VPS相关
因为frp的原理是利用服务端(所准备的VPS)进行转发,因而VPS的速度直接决定了之后连接的质量,请根据自己的需要选择相应主机配置。
我这里测试使用的是腾讯云2核4G的轻量应用服务器,采用的宝塔Linux面板 7.9.3,内网系统采用的是kalilinux。
开始搭建
因为这里我的服务端是centos8,客户端是kalilinux,所以我就下载了linux的64位版本,有需求可自行下载。
下载好解压后只需要这五个文件就行了,systemd、frps、frps.ini用于服务端,frpc、frpc.ini用于客户端,其它两个是深度配置,这里就不需要了。
当然也可以使用以下命令进行下载解压:
wget https://github.com/fatedier/frp/releases/download/v0.42.0/frp_0.42.0_linux_amd64.tar.gzwget https://github.com/fatedier/frp/releases/download/v0.42.0/frp_0.42.0_linux_amd64.tar.gzwget https://github.com/fatedier/frp/releases/download/v0.42.0/frp_0.42.0_linux_amd64.tar.gz
tar -zxvf frp_0.42.0_linux_amd64.tar.gztar -zxvf frp_0.42.0_linux_amd64.tar.gztar -zxvf frp_0.42.0_linux_amd64.tar.gz
服务端配置
将下载好的systemd、frps、frps.ini放入服务端里,这里是/home/lighthouse/frps
编辑配置文件frps.ini,如果想弄得简单一点,只需留一个frpbind_port就行了
[common] # frp服务端口 bind_port = 7000 #后台管理(仪表盘)端口 dashboard_port = 7500 # 账户(自行设置) dashboard_user = XXX # 密码(自行设置) dashboard_pwd = XXX max_pool_count = 10 # 日志文件位置及名字 log_file = ./frps.log # 日志级别 log_level = info # 日志最多记录天数 log_max_days = 3 # token 客户端token需要与此一致,最好设置难度高的密码 token = 12345[common] # frp服务端口 bind_port = 7000 #后台管理(仪表盘)端口 dashboard_port = 7500 # 账户(自行设置) dashboard_user = XXX # 密码(自行设置) dashboard_pwd = XXX max_pool_count = 10 # 日志文件位置及名字 log_file = ./frps.log # 日志级别 log_level = info # 日志最多记录天数 log_max_days = 3 # token 客户端token需要与此一致,最好设置难度高的密码 token = 12345[common] # frp服务端口 bind_port = 7000 #后台管理(仪表盘)端口 dashboard_port = 7500 # 账户(自行设置) dashboard_user = XXX # 密码(自行设置) dashboard_pwd = XXX max_pool_count = 10 # 日志文件位置及名字 log_file = ./frps.log # 日志级别 log_level = info # 日志最多记录天数 log_max_days = 3 # token 客户端token需要与此一致,最好设置难度高的密码 token = 12345
这样服务端就简单配置好了,在此目录下使用命令就成功启动了
./frps -c frps.ini./frps -c frps.ini./frps -c frps.ini
如果要验证的话,可先在配置文件中设置好后台管理的端口、用户名和密码,启动后输入服务端ip:端口,这里是默认7500,此时会有一个弹框,输入用户名及密码后即可进入后台管理页面,这里就不放图片了。
因为运行后,不能使用Ctrl+c来结束命令,否则会断开,可以使用nohup命令将其运行在后台,接着就可以Ctrl+c关闭,输入jobs命令查看frp服务在后台运行,如下:
nohup ./frps -c frps.ini &nohup ./frps -c frps.ini &nohup ./frps -c frps.ini &
jobsjobsjobs
当然,除了上面这个命令,我更推荐配置systemctl来控制frps,也就是下载文件中的systemd,进入该文件夹后只需要frps.service文件,编辑frps.service,基本上其他的都不需要修改,只需修改ExscStart,修改成配置文件所在的路径。
该文件对应的存放地址为:
但是这里需要注意一点重要的点,就是刚才如果运行了nohup命令,在使用systemctl启动frp之前先将刚才启动的frp服务给kill掉,不然systemctl会出错,使用以下两个命令kill掉frp服务:
ps -aux|grep frp| grep -v grepps -aux|grep frp| grep -v grepps -aux|grep frp| grep -v grep
kill -9 (上一步查询的进程id)kill -9 (上一步查询的进程id)kill -9 (上一步查询的进程id)
接下来就可以放心大胆的使用systemctl来控制frp服务了:
启动frps
sudo systemctl start frpssudo systemctl start frpssudo systemctl start frps
开机自启
sudo systemctl enable frpssudo systemctl enable frpssudo systemctl enable frps
重启
sudo systemctl restart frpssudo systemctl restart frpssudo systemctl restart frps
查看状态
sudo systemctl status frpssudo systemctl status frpssudo systemctl status frps
关闭服务
sudo systemctl stop frpssudo systemctl stop frpssudo systemctl stop frps
最后通过命令查看以下frps状态,服务端的配置也就告一段落了。
客户端配置
将frpc、frpc.ini文件复制到kalilinux里,编辑frpc.ini配置文件:
[common] server_addr = 服务端ip server_port = 与之前设置的bind_prot相同 token = 与之前设置的token值相同 #所需代理服务 [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 #所需代理服务端口 remote_port = 6000 #代理端口[common] server_addr = 服务端ip server_port = 与之前设置的bind_prot相同 token = 与之前设置的token值相同 #所需代理服务 [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 #所需代理服务端口 remote_port = 6000 #代理端口[common] server_addr = 服务端ip server_port = 与之前设置的bind_prot相同 token = 与之前设置的token值相同 #所需代理服务 [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 #所需代理服务端口 remote_port = 6000 #代理端口
使用命令连接:
./frpc -c frpc.ini./frpc -c frpc.ini./frpc -c frpc.ini
代理成功:
如果没有连接成功,那就是bind_port设置的端口没有通过防火墙,需要放行,如果使用了宝塔,宝塔里也需要放行,如果还是连不了就检查端口是否被占用,以及token值是否一致。
原文链接:https://blog.csdn.net/qq_57235775/article/details/129834129