前因-内网穿透的意义
最近弄到服务器用来搭建网盘,单独一个站点我觉得有点浪费,所以搭建frp来借用他的IP地址
从公网中访问私有设备
比如自己的台式机、NAS等设备,它们处于路由器后,运营商IP地址短缺不给你分配公网IP
如果我们想直接访问这些设备,那就用frp内网穿透就搞定啦
准备工作
服务器一台(例:腾讯云,建议准备宝塔面板)
访问目标设备(例:软路由)自已或别人的脑子
1、服务端配置(腾讯云)
通过宝塔终端运行命令查看处理器架构,根据架构下载不同版本的frp
arch
如图“X86_64“在下方链接中选择”amd64”的相应版本进行下载。
https://github.com/fatedier/frp/releases
将下载的压缩包上传至宝塔目录,解压后删除frpc的相关文件,因为我们现在搭建服务端只用到frps
修改frps.ini文件,替换为以下代码
[common]
bind_port = 7000
dashboard_port = 7500
vhost_http_port = 8080 //访问网站的HTTP端口
vhost_https_port = 8090 //访问网站的HTTPS端口
token = Aa123456
dashboard_user = admin
dashboard_pwd = Aa123456
端口均可使用默认值,但token、user、password请自行输入
前往腾讯云服务器安全组放行端口 7000、7500、8080、8090、8070,宝塔安全里也要同步放行哦
frp目录下运行命令查看有无报错,报错一般是端口未放行,成功后快捷键 Ctrl+C
结束运行
./frps -c frps.ini
此时访问服务器ip地址:7500并使用自己设置的用户名密码登录,可看到仪表界面
2、服务端后台运行
现在,我们使用nohup命令将其运行在后台,frp目录下运行,运行后终端中按下回车键
nohup ./frps -c frps.ini &
可以使用jobs
命令查看后台运行的程序
3、配置systemctl来控制frps
在/lib/systemd/system/目录下手动创建文件 frps.service
粘贴如下代码
[Unit]
Description=frps service
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
ExecStart=/www/wwwroot/frp/frps -c /www/wwwroot/frp/frps.ini //此处frps的实际目录(注意有两处)
[Install]
WantedBy=multi-user.target
此时可以用systemctl命令来控制frps啦
sudo systemctl start frps //启动frps
sudo systemctl enable frps //服务器开机自动启动frps
sudo systemctl restart frps //重启frps
sudo systemctl stop frps //停止frps
sudo systemctl status frps //查看日志
4、客户端设置
frp的客户端就是真正进行访问的那台设备,这里使用乌班图桌面系统的软路由为例
同样的根据软路由的架构选择相应的frp进行下载和上传,但版本号需要和服务端相同
可以删除其中的frps的相关文件
下载地址:
https://github.com/fatedier/frp/releases
用文本编辑器打开frpc.ini,替换为以下代码
[common]
server_addr = 182.211.86.199 //腾讯云IP地址
server_port = 7000
token = Aa123456 //之前设置的token
[tcp]
type = tcp
local_ip = 127.0.0.1
local_port = 22 //需要联通的TCP地址
remote_port = 8070 //转发22端口为外网访问的8070端口
[web1]
type = http
local_ip = 127.0.0.1
local_port = 80
custom_domains = abc.com
[web2]
type = https
local_ip = 127.0.0.1
local_port = 443
custom_domains = abc.com
原理简述
1、[tcp]中local_port为22端口,remote_port为8070端口
外网访问182.211.86.199:8070,进的是软路由的127.0.0.1:22
2、[web1]中local_port为80端口,vhost_http_port为8080端口(frps.ini的设置)
外网访问abc.com:8080,进的是软路由的abc.com:80
此时域名需带上8080端口,先别急,往下看
配置完成frpc.ini后,就可以使用下列命令运行frpc啦
./frpc -c frpc.ini
不要关闭命令行窗口,此时可以在局域网外访问 abc.com:8080
就可访问到相应服务
5、客户端后台运行,systemctl控制
参照服务端的方式,使用nohup命令将其运行在后台
nohup ./frpc -c frpc.ini &
在/lib/systemd/system/目录下手动创建文件 frpc.service
并粘贴如下代码
[Unit]
Description=frpc service
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
ExecStart=/www/wwwroot/frp/frpc -c /www/wwwroot/frp/frpc.ini //此处frpc的实际目录(注意有两处)
[Install]
WantedBy=multi-user.target
此时可以用systemctl命令来控制frpc啦
sudo systemctl start frpc //启动frpc
sudo systemctl enable frpc //服务器开机自动启动frpc
sudo systemctl restart frpc //重启frpc
sudo systemctl stop frpc //停止frpc
sudo systemctl status frpc //查看日志
6、访问网址时去除端口号
其实,正常情况下输入网址是带有端口的,之所以看不到是因为默认隐藏了80端口
之前我们设置过外网访问abc.com:8080时进软路由的abc.com:80
为何不能直接设置80口进80口呢?
我们的腾讯云服务器还有其他站点,假如可以设置外网80进软路由80,地址就一个,那么是要进腾讯云还是软路由?是不是就矛盾了,所以这里使用腾讯云暂时不用的8080口进行转发
现在我们实现去除端口,网址直接访问软路由
http的80端口
利用宝塔站点的反向代理,将外网的80替换为8080,这样我们访问abc.com时会“隐藏的”带上8080口,实现直接用域名访问
这里需要动动脑,嘿嘿
https的443端口
首先服务器两边都需要部署ssl证书,frps这边的反向代理目标URL需要填写真实域名,保存后修改配置文件
约14行添加代码 proxy_ssl_server_name on;
至此,全部配置完成,之后根据需要在frpc.ini
里追加规则即可。