前言
內網穿透的原理我就不多說了哈,既然會看到我這篇文章,想必都知道內網穿透是做什么的吧
frp分為服務端和客戶端,服務端一般是搭在公網服務器中,客戶端一般搭在本地或者局域網,需要提前在服務端搭好ftp server,然后客戶端搭建frp client,與服務端保持連接
遠程用戶一般是訪問不到本地內網的,所以需要訪問服務端,服務端通過frp轉發到內網中來
本教程是用docker搭建的frp,閱讀本文需要有一定的docker基礎,當然windows也可以操作,原理是一樣的
初次玩frp建議先把防火墻和安全組關了,以免遇到端口不能訪問的問題
搭建frp服務端
在公網服務器中新建配置文件
mkdir -p /data/frps
vim /data/frps/frps.toml
配置文件內容
[common]
# frp客戶端連接端口
bind_port = 7000
# 管理頁面的端口
dashboard_port = 7500
# 管理頁面的用戶名
dashboard_user = admin
# 管理頁面的密碼
dashboard_pwd = 123456
# 客戶端連接的令牌
token = 123456
拉取frp server鏡像
docker pull snowdreamtech/frps:0.62
?運行容器
docker run -d \--name=frps \--network=host \--restart=always \-v /data/frps:/etc/frp \snowdreamtech/frps:0.62
訪問http://你的公網ip:7500即可進入管理端頁面,賬號密碼就是配置文件中的賬號密碼
搭建frp客戶端,代理tcp
我們先啟動兩個內網服務,讓它可以正常訪問
在內網服務器中新建配置文件
mkdir -p /data/frpc
vim /data/frpc/frpc.toml
配置文件內容
[common]
server_addr = 你的公網ip
# 公網服務端的端口
server_port = 7000
# 公網服務器配置的token
token = 123456# 代理一個端口,通過公網服務器的8080端口訪問到內網的80端口
[web80]
# 代理類型
type = tcp
# 公網服務器的端口
remote_port = 8080
# 內網ip
local_ip = 192.168.200.100
# 內網端口
local_port = 80# 通過公網的8081端口訪問到內網的81端口
[web81]
type = tcp
remote_port = 8081
local_ip = 192.168.200.100
local_port = 81
拉取frp client鏡像
docker pull snowdreamtech/frpc:0.62
運行容器
docker run -d \--name=frpc \--network=host \--restart=always \-v /data/frpc:/etc/frp \snowdreamtech/frpc:0.62
如果本地是windows系統,可以下載windows客戶端
下載地址:https://github.com/fatedier/frp/releases
啟動方式也很簡單,直接frpc.exe -c frpc.toml即可
?我們到管理頁面就能看到客戶端代理信息了
這時候就可以通過你的公網ip去訪問你的內網了
代理http
使用前必讀,非常重要,可以讓你少走很多彎路:
所有http代理,在服務器中都是共用一個端口,通過域名來區分不同的http服務,所以代理http一定要有域名,沒有域名的話只能使用tcp的方式代理,tcp方式也能代理http
我們提前準備好域名,然后解析到你的公網服務器中
服務端frps.toml增加一句配置,定義http端口
vhost_http_port = 8088
注意:多個不同的http代理將會共用這個端口
完整配置:
[common]
bind_port = 7000
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = 123456
token = 123456
vhost_http_port = 8088
?客戶端frpc.toml配置:
[common]
server_addr = 118.31.42.134
# 公網服務端的端口
server_port = 7000
# 公網服務器配置的token
token = 123456[web80]
# 代理類型
type = http
# 代理類型為http時,remote_port字段無效,遠程端口默認是服務端配的vhost_http_port
# remote_port = 8080
# 內網ip
local_ip = 192.168.200.100
# 內網端口
local_port = 80
# 域名
custom_domains = test.linzhehao.cn
就可以通過域名訪問你的內網了
代理https
申請SSL證書并審核,阿里云、騰訊云等廠家都可以申請免費證書
選擇nginx證書進行下載,下載后解壓,會有一個.key和.pem文件
將證書文件上傳到內網服務器的/data/frpc/cert
服務端frps.toml增加一句配置,定義https端口,所有的https請求都會走這個端口
vhost_https_port = 443
完整配置:
[common]
bind_port = 7000
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = 123456
token = 123456
vhost_http_port = 8088
vhost_https_port = 443
客戶端frpc.toml配置:
[common]
server_addr = 你的公網ip
# 公網服務端的端口
server_port = 7000
# 公網服務器配置的token
token = 123456[web1]
type = https
# https中,local_ip和local_port字段無效
# local_ip = 192.168.200.100
# local_port = 80
custom_domains = test.linzhehao.cn
plugin = https2http
# 配置證書的路徑
plugin_crt_path = /etc/frp/cert/test.linzhehao.cn.pem
plugin_key_path = /etc/frp/cert/test.linzhehao.cn.key
plugin_host_header_rewrite = test.linzhehao.cn
# 代理的地址
plugin_local_addr = 192.168.200.100:80
?重啟一下frpc
docker restart frpc
就可以用https訪問了
子域名
簡介:
如果有多個子域名,比如test1.linzhehao.cn、test2.linzhehao.cn,如果不使用子域名的話,那么custom_domains每次都需要寫上完整的域名,使用子域名的話只需要在服務端配上linzhehao.cn,在客戶端配置test1、test2即可
frps.toml中添加:
subdomain_host = linzhehao.cn
完整配置:
[common]
bind_port = 7000
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = 123456
token = 123456
vhost_http_port = 8088
vhost_https_port = 443
subdomain_host = linzhehao.cn
客戶端frpc.toml配置:
[common]
server_addr = 你的公網ip
# 公網服務端的端口
server_port = 7000
# 公網服務器配置的token
token = 123456[web80]
# 代理類型
type = http
# 內網ip
local_ip = 192.168.200.100
# 內網端口
local_port = 80# 如果想使用子域名,需要去掉custom_domains
# custom_domains = test.linzhehao.cn# subdomain會自動拼上frps.toml中的subdomain_host
subdomain = test
成功訪問