写在前面

适用条件:无公网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