使用 Docker 部署 frp 实现内网穿透

frp(Fast Reverse Proxy)是一个高性能的反向代理应用,可帮助你将处于内网或防火墙后的设备(如个人电脑、树莓派等)暴露给公网。

提示: 大学生可以通过认证免费领取或以优惠价格购买阿里云、腾讯云等云服务商的轻量应用服务器或 ECS 服务器,非常适合作为本教程中的 frps 服务器端。请留意相关云服务商的校园计划。

核心原理

frp 依赖于一台拥有公网 IP 的服务器(frps 服务器)作为中转站。内网设备(frpc 客户端)通过隧道连接到这台服务器,frps 接收到公网请求后,通过隧道将其转发给 frpc,从而实现内网服务的暴露。

一、部署 frps 服务器端 (公网服务器)

frps 需要部署在您的公网服务器上(例如阿里云、腾讯云等)。

1. 创建配置文件 frps.ini

在您的服务器上创建一个目录(例如 /opt/frp),并在其中创建 frps.ini 配置文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# frps.ini
[common]
# frp 服务器与客户端通信的端口,这是 frpc 客户端需要连接的端口
bind_addr = 0.0.0.0
bind_port = 7000

# 客户端连接 frps 时需提供的密钥,请自行设置复杂密码
token = YOUR_SECURE_TOKEN_HERE

# 对外提供服务的 HTTP/HTTPS 端口(可选,但推荐用于 Web 服务)
vhost_http_port = 80
vhost_https_port = 443

# 仪表盘端口(可选,用于监控 frp 状态,请确保防火墙仅对内网开放)
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = YOUR_DASHBOARD_PASSWORD

重要: 确保您的公网服务器防火墙(包括云服务商的安全组和 Linux 系统的 firewalld/ufw)开放了 bind_port (7000) 以及您希望暴露给公网的服务端口(如 80, 443, 7500)。

2. 使用 Docker 部署 frps

使用 snowdreamtech/frps 镜像部署 frps(大陆网络环境下),并挂载配置文件和开放端口。

Bash

1
2
3
4
5
6
7
8
9
docker run -d \
--name frps \
--restart always \
-v /opt/frp/frps.ini:/etc/frp/frps.ini \
-p 7000:7000 \
-p 80:80 \
-p 443:443 \
-p 7500:7500 \
snowdreamtech/frps

3. 检查 frps 运行状态

执行以下命令确认 frps 是否正常运行。如果开启了仪表盘,您可以通过 http://您的公网IP:7500 访问。

Bash

1
docker logs frps

二、部署 frpc 客户端 (内网设备)

frpc 需要部署在您希望进行内网穿透的设备上(例如本地电脑、开发机等)。

1. 创建配置文件 frpc.ini

在内网设备上创建目录(例如 /opt/frpc),并在其中创建 frpc.ini 配置文件。

Ini

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# frpc.ini
[common]
# 您的 frps 服务器公网 IP 或域名
server_addr = YOUR_SERVER_IP
# frps 监听的 bind_port
server_port = 7000
# frps 配置的 token 密钥
token = YOUR_SECURE_TOKEN_HERE

# [ssh] 示例:将内网设备的 22 端口映射到公网服务器的 6000 端口
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

# [web] 示例:将内网运行的 Web 服务 (本地 8080) 映射到公网 80 端口
[web]
type = http
local_ip = 127.0.0.1
local_port = 8080
# 公网访问的域名或公网 IP
subdomain = web # 如果 frps 使用了 vhost_http_port,则使用 subdomain
# 或者直接使用 custom_domains = YourDomain.com

2. 使用 Docker 部署 frpc

使用 snowdreamtech/frpc 镜像部署 frpc,并挂载配置文件。

Bash

1
2
3
4
5
6
docker run -d \
--name frpc \
--network host \
--restart always \
-v /opt/frp/frpc.ini:/etc/frp/frpc.ini \
snowdreamtech/frpc

注意 --network host 客户端容器通常使用 --network host 模式,以便 frpc 能够直接访问内网主机的服务端口(如 228080),从而实现准确的端口转发。

3. 检查 frpc 运行状态

执行以下命令确认 frpc 是否成功连接到 frps 服务器。

Bash

1
docker logs frpc

三、验证穿透效果

  1. SSH 服务验证: 尝试通过公网访问内网设备的 SSH 服务。
    Bash

    1
    ssh user@YOUR_SERVER_IP -p 6000
  2. Web 服务验证: 如果您配置了 [web] 代理,在浏览器中访问您绑定的域名或公网 IP,即可访问内网设备上 8080 端口运行的 Web 服务。