一、物理服务器(硬件服务器)怎么样才能使用外网访问?
首先要了解公网IP和私网IP,像家用电脑或者服务器只有一个私网IP,没用公网IP。
如果路由器有公网IP可以间接连接我们的内部服务器,一般要运营商下放公网IP,如果运营商没用下放公网IP,像第三方有很多内网穿透的盒子,例如:内网穿透/旁路由sd-wan组网盒子蒲公英。
我们也可以借助一款强大的软件FRP达到可以让外网访问的效果。
二、什么是内网穿透?
内网穿透的原理很简单的说就是:
两台计算机A和B都处于不同的局域网中,A想要访问B, 就需要通过一台服务器做桥接的,桥接的方式有两种,一种是服务器相互转发流量 到A和B,另一种是告诉对方公网IP地址,自己充当一个介绍人的角色。
内网穿透的工具有很多:花生壳、蜻蜓映射、frp、nps、ngrok
我们重点介绍的是frp
三、什么是FRP?
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
四、为什么使用 frp?
通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:
- 客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。
- 采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间。
- 代理组间的负载均衡。
- 端口复用,多个服务通过同一个服务端端口暴露。
- 多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。
- 高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展。
- 服务端和客户端 UI 页面。
五、条件准备。
1.一台带有公网IP的云服务器(阿里云或者腾讯云的都可以,linux系统,必须是centos7以上版本,centos6不支持systemctl命令)。
2.备案过的域名。
3.物理服务器(内网)、家用电脑(内网)(家用电脑也可以作为服务器)
六、安装。
到frp中文文档上,下载最新版本
安装 | frphttps://gofrp.org/docs/setup/
下载完成后,我们用xftp上传的云服务器
我们用xshell分别连接物理服务器和云服务器。
在云服务器上输入解压
tar -zxvf frp_0.38.0_linux_amd64.tar.gz
云服务器端输入ls查看目录,cd frp 进入文件frp下
进入xftp,点击frps.ini右键进行编辑
在文件中写入并保存
[common]
bind_port = 7000
vhost_http_port = 8080
然后在云服务器命令界面开启服务器
./frps -c ./frps.ini
这样代表云服务器已经启动了
然后在物理服务也安装
然后解压,同样修改文件名称
然后进入物理服务器编辑frpc.ini文件
[common]
server_addr = 81.51.019.17 #云服务器公网IP地址
server_port = 7000
[web]
type = http
local_port = 8080
custom_domains = 81.51.019.17 #云服务器公网IP地址
然后保存,端口号是7000,要确保云服务器7000、8080端口开启
在物理服务器上输入启动客户端
./frpc -c ./frpc.ini
然后用在浏览器输入公网的IP:8080即可访问本地服务器内网IP:8080,访问需要在本地服务器搭建环境。可以用docker搭建,或者用宝塔。
下面介绍用本地服务器用宝塔搭建环境,云服务器也有装有宝塔,端口占用问题
本地搭建宝塔用内网访问登录,安装好web环境,用内网IP填入这样的192.168.0.25:8080
(本地绑定的固定IP)
安装好之后,frp服务器与客户端都跑起来,输入公网ip:8080访问就是本地内网ip:8080的页面
云服务器上装宝塔ngix会占用80端口,frps监听不到80端口,可以在/www/server/panel/vhost/nginx
这样修改之后,frps就能监听到80端口,建议还是不要修改80端口,可以监听8080,8081等端口。
宝塔本地服务器搭建的项目内网设置了80端口,再想添加一个会出现域名已经存在
这样我们可以这样填写
创建成功了,把新新起的删除就可以了
开启https访问
服务器端:
[common]
bind_port = 7000
token = 12345678
vhost_http_port = 8080
#开启https
vhost_https_port = 4430
客户端:
[common]
#公网ip
server_addr = 81.71.159.17
server_port = 7000
token = 12345678
[web]
type = http
local_port = 8080
#公网ip
custom_domains = 81.71.159.17
[test_htts2http]
type = https
custom_domains = xy.ixxxy.com
local_port = 4430
plugin = https2http
#本地服务器IP
plugin_local_addr = 192.168.0.25:80
#证书
plugin_crt_path = ./server.crt
plugin_key_path = ./server.key
#本地服务器IP
plugin_host_header_rewrite = 192.168.0.25
plugin_header_X-From-Where = frp
http访问这是绑定的是公网IP。
例如:外网访问端口:81.71.159.17:8080 内网web设置访问端口:192.168.025
192.168.025 是我的固定IP,相当于本地服务器的127.0.0.1
证书怎么获取呢?
可以宝塔申请一个免费的,然后进入宝塔官网下载。
下载后是这个样子
frp要求的格式是.crt和.key
plugin_crt_path = ./server.crt
plugin_key_path = ./server.key
打开nginx是这样的格式
出现了.pem后缀的,并没有.crt
这时候,把.pem后缀改成.crt后缀的,然后上传到服务器/root/frp目录,然后关闭进程,重启。
我这边把名字的改成server.crt和server.key了
进入域名:4430就可以通过外网访问到
设置开机自动开启服务
云服务器ctrl + c 终止服务器
设置这样的代码,配置这个服务
vi /lib/systemd/system/frps.service
[Unit]
Description=fraps service
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
ExecStart=/root/frp/frps -c /root/frp/frps.ini
[Install]
WantedBy=multi-user.target
保存,设置开机,和开机自动开启
#启动服务
systemctl start frps
#设置开机自启
systemctl enable frps
#停止服务
systemctl stop frps
#关闭开机自启
systemctl disable frps
reboot重启可以查看进程
ps auxw
客户端配置开机自起
vi /lib/systemd/system/frpc.service
[Unit]
Description=frapc service
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
ExecStart=/root/frp/frpc -c /root/frp/frpc.ini
[Install]
WantedBy=multi-user.target
#启动服务
systemctl start frpc
#设置开机自启
systemctl enable frpc
#关闭开机自启
systemctl disable frpc
#停止服务
systemctl stop frpc
#服务状态
systemctl status frpc
#刷新服务列表:
systemctl daemon-reload
在后台运行frp服务命令
#启动服务端
./frps -c ./frps.ini
#启动客户端
./frpc -c ./frpc.ini
#后台进程启动服务端
nohup ./frps -c frps.ini >/dev/null 2>&1 &
#后台进程启动客户端
nohup ./frpc -c frpc.ini >/dev/null 2>&1 &