frp内网穿透的搭建与使用
什么是内网穿透
内网穿透,又称为NAT穿透。
NAT穿透技术是让NAT背后的设备,先访问指定的外网服务器,由指定的外网服务器搭建桥梁,打通内、外网设备的访问通道,实现外网设备访问到内网设备。
总之就是内网可以连公网,公网可以连公网和内网,但内网和内网无法连,但在中间加一个公网的中转服就能实现穿透!
目前内网穿透技术有很多,比如收费的花生壳、向日葵、神卓互联、ngrok等等。
当然如果你不想数据掌握在别人手中,且有自己的服务器,那么可以通过开源技术自己搭建一个,比如frp
frp服务器
下载软件包
下载服务器端程序,选择合适的版本即可,
frp_0.57.0_darwin_amd64.tar.gz —— 适用于Mac OS 64位系统
frp_0.57.0_darwin_arm64.tar.gz —— 适用于Mac OS 64位嵌入式系统
frp_0.57.0_freebsd_386.tar.gz —— 适用于FreeBSD 32位系统
frp_0.57.0_freebsd_amd64.tar.gz —— 适用于FreeBSD 64位系统
frp_0.57.0_linux_386.tar.gz —— 适用于Linux 32位系统
frp_0.57.0_linux_amd64.tar.gz —— 适用于Linux 64位系统
frp_0.57.0_linux_arm.tar.gz —— 适用于Linux 32位嵌入式系统
frp_0.57.0_linux_arm64.tar.gz —— 适用于Linux 64位嵌入式系统
frp_0.57.0_linux_mips.tar.gz
frp_0.57.0_linux_mips64.tar.gz
下载到服务器之后,解压。
tar -xzvf frp_0.57.0_linux_amd64.tar.gz
可以看到有很多文件,因为frp根据平台来区分不同版本,但是把客户端和服务端都压缩到一个文件包中了。
其中frps就是frp server端的部分;frpc 是frp client端的部分。这里我们只需要关心Server端。
可以直接删掉frpc、frpc.toml两个文件,节省硬盘空间。
find . -name 'frpc*' -exec rm {} \;
移动至 /usr/local(非必须 但是个好习惯)
在/usr/local/下创建一个frp文件夹。 /usr/local目录类似于windows系统的C:/Progrem Files/。用户自己编译的软件默认会安装到这个目录下。
mkdir /usr/local/frp
将frp_0.57.0_linux_amd64移动到 /usr/local/frp 里面
mv ./frp_0.57.0_linux_amd64/* /usr/local/frp/
配置软件
服务端配置文件:frps.toml
[common]
bindPort = 7000
vhostHTTPPort = 7003
【bindPort 】:frp server 启动时候绑定的端口
【vhostHTTPPort 】:可选,当我们访问公网服务器 7003 端口时, 转发到 frpc(即frp客户端) 的 type = "http" 的配置对应的服务。
启动
./frps -c frps.toml
测试访问:ip+vhostHTTPPort值
frp客户端
我是在windows上使用(将我window本机上的服务上传到frp服务端上,以便于其他人能访问)所以我下载对应的就行,
当然有的人服务端可能在安卓上、ios上或者linux上都有可能
下载软件包
下载window客户端 frp_0.57.0_windows_amd64.zip
配置软件
客户端配置文件:frpc.toml
serverAddr = "xx.xx.xx.xx" #frp服务端所在的ip
serverPort = 7000 #frp服务端所在的端口
[[proxies]]
name = "web页面" #自定义代理名称
type = "http" #自定义代理类型
localIP = "127.0.0.1" #被代理的(本机)目标地址
localPort = 8888 #被代理的(本机)目标端口
customDomains = ["xx.xx.xx.xx"] # 代理到域名或服务器的公网ip (一般和serverAddr 字段一样)
启动
进入软件包中,使用命令行工具打开(比如cmd或powershell)
.\frpc.exe -c .\frpc.toml
成果
启动一个端口为8888的http服务
然后使用公网访问试试
仪表盘
如果想看当前frp服务的使用情况,请在服务端配置文件开启此功能 frps.toml
bindPort = 7000
# 后台管理服务配置
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "admin"
其它
过时配置
早期的frp配置文件都是init,不过现在已经被抛弃了
WARNING: ini format is deprecated and the support will be removed in the future, please use yaml/json/toml format instead!
多个http服务
如果要起多个web服务,比如我有两个本地web服务,一个是端口8888,一个是端口9999
方式1
因为frp服务端的虚拟http服务vhostHTTPPort只能有一个。
所以需要配置nginx对frp服务端的http服务做代理,并配合frp二级域名来配置多个,比如
serverAddr = "xxx.xxx.xxx.xxx"
serverPort = 7000
[[proxies]]
name = "web页面1"
type = "http"
localIP = "127.0.0.1"
localPort = 8888
customDomains = ["a.dingshaohua.com"]
[[proxies]]
name = "web页面2"
type = "http"
localIP = "127.0.0.1"
localPort = 9999
customDomains = ["b.dingshaohua.com"]
最终 访问a.dingshaohua.com、b.dingshaohua.com即可
方式2
web服务本身就是http协议,http又是tcp的“子集”关系。
所以多起几个tcp代理即可(其实代理单个的web 也可以这么用,官方就是这么做的)
如果用这个的话 服务端的vhostHTTPPort 配置字段就可以不用了
serverAddr = "xx.xx.xx.xx"
serverPort = 7000
[[proxies]]
name = "web页面1"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8888
remotePort = 7005 #代理到服务端所在服务器的哪个端口上(随意,别人访问的时候记得就行)
[[proxies]]
name = "web页面2"
type = "tcp"
localIP = "127.0.0.1"
localPort = 9999
remotePort = 7006
最终 访问xx.xx.xx.xx:7005、xx.xx.xx.xx:7006即可
以服务管理
传统的启动方式是直接敲命令:./frps -c ./frps.toml &
这么写,比较麻烦,而且如果要停止进程也比较麻烦,建议采用构建成服务的方式。
安装systemd:yum install systemd
,通常情况下系统都带得有。
创建frps.service服务 vim /etc/systemd/system/frps.service
,写入内容
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动命令,改为实际存放frps的路径
ExecStart = /path/to/frps -c /path/to/frps.toml
[Install]
WantedBy = multi-user.target
之后,就以服务的方式管理frps
# 启动frp
sudo systemctl start frps
# 停止frp
sudo systemctl stop frps
# 重启frp
sudo systemctl restart frps
# 查看frp状态
sudo systemctl status frps
# 设置为开机自启
sudo systemctl enable frps
nginx代理
# frp.dingshaohua.com
server {
listen 80;
server_name frp.dingshaohua.com;
rewrite ^(.*) https://$server_name$1 permanent;
}
server {
listen 443 ssl;
server_name frp.dingshaohua.com;
ssl_certificate /etc/letsencrypt/live/dingshaohua.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/dingshaohua.com/privkey.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Range $http_range;
proxy_set_header If-Range $http_if_range;
proxy_redirect off;
proxy_pass http://0.0.0.0:7500;
client_max_body_size 20000m;
}
}
参考
https://zhuanlan.zhihu.com/p/632560790
https://blog.csdn.net/weixin_43906500/article/details/116403724
https://zhuanlan.zhihu.com/p/612377399?utm_id=0
https://www.jianshu.com/p/65f19e1c20d9
https://blog.csdn.net/xuzhongyi103/article/details/134363523