写在前面
适用条件:无公网IPV4、IPV6的网络环境;有公网但域名后想隐藏端口的强迫症
个人建议:腾讯阿里最近新出 200M 轻量服务器,地区选择离自己近的。或采用境外VPS(带宽较大,HK优先,延迟低)
FRP(Fast Reverse Proxy)是一款用于内网穿透的开源工具。内网穿透的基本理念是通过在公网服务器和内网设备之间建立连接,使得外界可以访问内网中的设备或服务。FRP通过反向代理技术,实现了这一目标,使得内网环境中的服务(如web服务、数据库、远程桌面等)能够被外网访问。
具体来说,FRP的内网穿透过程包含以下几个步骤:
1. 在公网服务器上部署FRP服务端(frps):
这个服务端程序会监听来自客户端的连接。公网服务器的IP地址和端口需要是可被外网访问的。
2. 在内网设备上部署FRP客户端(frpc):
FRP客户端会与FRP服务端建立长期连接,之后所有的内网请求都会通过这个连接进行转发。
3. 配置转发规则:
在FRP客户端的配置文件中,指定需要暴露到外部的内网服务的相关信息,比如本地IP、端口和需要映射到公网服务器的端口。
当外部设备通过访问公网服务器的指定端口时,这些请求会通过FRP服务端转发至内网设备,从而实现对内网服务的访问。
举个实际的例子,假设内网中的一台设备上运行着一个web服务,监听端口为8080。通过配置FRP,外部用户可以通过访问公网服务器的某个端口(如7000)来访问这个Web服务。
### 配置示例
#### FRP 服务端配置(frps.ini)
```ini
[common]
bind_port = 7000
```
#### FRP 客户端配置(frpc.ini)
```ini
[common]
server_addr = 公网服务器IP
server_port = 7000
[http]
type = http
local_ip = 127.0.0.1
local_port = 8080
remote_port = 7001
```
在这个例子中,FRP客户端会将内网127.0.0.1:8080的服务映射到公网服务器的7001端口。因此外部用户访问公网服务器的IP地址和7001端口时,相当于访问了客户端内网的127.0.0.1:8080。
### 优势:
1. 安全性: 通过加密和认证机制,FRP保证了传输数据的安全性。
2. 易用性: 配置简单,支持多种协议和应用场景。
3. 跨平台: 支持Windows、Linux和MacOS等多种操作系统。
### 应用场景:
1. 远程办公: 通过FRP实现对公司内网的远程访问。
2. IoT设备接入: 远程维护和管理物联网设备。
3. 开发调试: 方便开发人员将本地服务暴露给外部进行测试和调试。
由此可见,通过FRP,内网穿透变得简单高效,从而使得内网服务可以安全、便捷地被外界访问。
正文开始
开始必看:此方式繁琐之处为每一次新增或删除端口都要修改 frpc.toml并重新上传至 ./frp/frpc.toml(frpc 配置文件目录)后重启容器,若嫌麻烦则后文无需观看。
常见问题
1.多数问题会发生于配置文件(toml),仔细核对是否填写正确,关于内容关键处我已做出注释,更详细的注释需要前往项目地址查看。
2.如果你使用的镜像不一样,他的配置文件格式、容器内映射路径或有所变化,不要直接复制文中yaml,要与你使用的镜像做好核对。
e.g.1
unmarshal ProxyConfig error: json: unknown field "remotePort'
检查frpc.toml 文件中type类型是否正确
e.g.2
[E][client/service.go:280] token in login doesn't match token from configuratior
[w] [client/service.go:298] connect to server error: token in login doesn't match token fram configuration
检查frpc.toml/frps.toml中的token是否一致,如果你确定一致,检查frpc/frps 容器映射的volueme配置文件的目录是否正确
e.g.3
while decoding JSON: json: cannot unmarshal string into Go value of type
大多数为配置文件缺少“”,仔细检查格式,除port=xxxx外,其他数值是否缺少“”,如果确认正确,则检查frpc/frps 容器映射volueme的配置文件目录是否正确
e.g.4
打开网页报错502,检查frpc.toml中[[proxies]] name = 后的名称是否冲突,端口号等是否填写正确。如果没有任何报错,那么检查你使用的vps是否有防火墙。
具体步骤
第一步:VPS搭建frps、Nginx Proxy Manager
第二步:家庭服务搭建frpc
第三步:域名托管A类型指向VPS IPV4地址
第四步:Nginx Proxy Manager配置反代
第一步:搭建frps
重要提示:如果你的VPS有防火墙,记得放行后文frps.toml 中填写的remotePort端口。
使用镜像:stilleshan/frps
1)一键脚本,详见项目地址。本文使用docker搭建,不作阐述。
2)docker
为避免因 frps.toml 文件的挂载,格式或者配置的错误导致容器无法正常运行并循环重启.请确保先配置好 frps.toml 后在执行启动。
先 git clone 仓库,并正确配置 frps.toml 文件。(此步也可本地创建 frps.toml 上传至VPS)
git clone https://github.com/stilleshan/frps
# git clone 本仓库
git clone https://github.ioiox.com/stilleshan/frps
# 国内镜像
vi /root/frps/frps.toml
# 配置 frps.toml 文件
frps.toml 文件格式
bindAddr = "0.0.0.0"
bindPort = 7000
#kcpBindPort = 7000
quicBindPort = 7000
vhostHTTPPort = 80
vhostHTTPSPort = 443
transport.maxPoolCount = 2000
transport.tcpMux = true
transport.tcpMuxKeepaliveInterval = 60
transport.tcpKeepalive = 7200
transport.tls.force = false
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin" #需替换,可自定内容
webServer.password = "admin" #需替换,可自定内容
webServer.pprofEnable = false
log.to = "./frps.log"
log.level = "info"
log.maxDays = 3
log.disablePrintColor = false
auth.method = "token"
auth.token = "12345678" #需替换,可自定内容
allowPorts = [
{ start = 10001, end = 50000 } #frps放行端口段10001-50000
]
maxPortsPerClient = 8 #允许放行frpc端口数量,可修改
udpPacketSize = 1500
natholeAnalysisDataReserveHours = 168
① docker-compose
version: "3.5"
services:
frp:
image: stilleshan/frps
ports:
- "7000:7000"
networks:
- nginx
volumes:
- /home/frps/frps.toml:/frp/frps.toml
restart: always
container_name: frp
networks:
nginx:
external: true
② docker-cli
docker run -d --name=frps --restart=always \
--network host \
-v /root/frps/frps.toml:/frp/frps.toml \ #/root/frps/frps.toml可自定修改路径
stilleshan/frps
第二步:搭建 npm
docker-compose
version: "3.5"
services:
nginx:
image: 'jc21/nginx-proxy-manager:latest'
container_name: nginx
ports:
- "443:443"
- "80:80"
- "81:81"
- "10222:10222"
restart: always
volumes:
- /home/nginx/data:/data
- /home/nginx/letsencrypt:/etc/letsencrypt
environment:
- TZ=Asia/Shanghai
networks:
- nginx
networks:
nginx:
name: nginx
部署后访问vps的ipv4 ip:81( 例:1.2.3.4:81)即可。
第三步:搭建frpc
1)有多种方式搭建,可参考镜像项目地址,本文使用docker搭建,不做阐述。
同frps,为避免因 frpc.toml 文件的挂载,格式或者配置的错误导致容器无法正常运行并循环重启.请确保先配置好 frps.toml 后在执行启动。
先 git clone 本仓库,并正确配置 frpc.toml 文件。(此步也可本地创建 frpc.toml上传至VPS)
frpc.toml 文件格式
serverAddr = "xx.xx.xx.xx" #你的VPS地址
serverPort = 7000
auth.method = "token"
auth.token = "freefrp.net" #同frpc.toml中auth.token
[[proxies]]
name = "tcp_xxxxx" #自定义服务名称,可复制多个,但后续name、localPort必须不同
type = "tcp" #协议类型,常见为tcp,但也可为http等,详见项目地址
localIP = "192.168.1.2" #你的本地IP,若搭建在nas,则为nas的IP
localPort = 5000 #你的本地服务web端口
remotePort = 12306 #你想反代出去的端口,可自定义,Nginx Proxy Manager中填写此端口
#数值范围为frps.toml中allowPorts放行端口段(本文10001-50000)
[[proxies]]
name = "web2_xxxxx"
type = "https" #仅为示例,type按需修改
localIP = "192.168.1.2"
localPort = 5001
remotePort = 12306
[[proxies]]
name = "tcp1_xxxxx"
type = "tcp"
localIP = "192.168.1.3"
localPort = 22
remotePort = 22222
① docker-compose
services: # 服务定义
frpc: # 服务名称
image: stilleshan/frpc # 镜像来源
container_name: frpc # 容器名称
restart: always # 容器重启策略
privileged: true # 允许容器获得特权
network_mode: host # 宿主机网络模式
volumes: # 挂载卷
- /volume1/docker/AppData/frp/frpc.toml:/frp/frpc.toml # 映射配置文件存储路径
② docker-cli
docker run -d --name=frpc --restart=always -v /root/frpc/frpc.toml:/frp/frpc.toml stilleshan/frpc
#以上命令 -v 挂载的目录是以 git clone 本仓库为例,也可以在任意位置手动创建 frpc.toml 文件,并修改命令中的挂载路径.
第四步:将二级域名DNS A类型解析至VPS的IP
如图所示,我是将域名托管至cloudflare
鉴别是否解析成功,可以用 windows cmd 指令
ping 你所创建的二级域名
若结果如下,IP正确,则解析成功
第五步 配置Nginx Proxy Manager
输入vps ipv4地址:81
默认账号:[email protected]
默认密码:changeme
打开后修改账号密码 进入web服务
域名反代步骤如下所示
若保存后显示以下内容,地址栏输入你的二级域名正常访问,则为成功
非web服务端口反代提醒:
如需要反代ssh(22)等非web端口,frps.toml无需变动,frpc.toml修改同上,Nginx Proxy Manager配置如下所示
若应用环境为ssh,则为以下示例:
因ssh有暴漏风险,不用时记得选择Enable
拓展
进阶教程【Nas】无公网v4/v6, 一键回到家庭局域网(作者cane)
链接:https://hicane.com/archives/nas-wu-gong-wang-v4-v6-yi-jian-hui-dao-jia-ting-ju-yu-wang