基于Docker部署FRP来实现内网穿透是一个非常流行且高效的方案。下面我将为您提供一份详细的、从零开始的部署操作步骤,涵盖服务端(公网服务器) 和客户端(内网机器) 的配置。
官网:https://gofrp.org/zh-cn/
一,架构原理简介
- FRP 服务端 (frps):部署在拥有公网IP的服务器上,监听一个端口(如
7000
),等待客户端连接。它负责将外部网络的请求转发到已连接的内网客户端。 - FRP 客户端 (frpc):部署在内网的机器上,它会主动与公网服务器上的
frps
建立连接。客户端配置需要暴露的内网服务(如SSH、Web网站等)。
一,部署 FRP 服务端
笔者就拿腾讯云上的Lighthouse主机来举例
步骤 1:准备配置文件
首先在服务器上创建一个目录,用于存放FRP的配置文件和持久化数据。
mkdir -p /root/
cd /root
创建服务端配置文件 frps.ini
。这里使用一个最基础的配置:
vim frps.ini
将以下内容写入 frps.ini
。您可以根据需要修改 token
(认证密码)和 bind_port
(服务端监听端口)。
# frps.ini
[common]
# 服务端监听的端口,客户端通过这个端口连接服务端
bind_port = 7000
# 认证令牌,客户端需要提供相同的token才能连接,建议设置一个复杂的密码
token = your_secure_token_123
# 可选项:FRP仪表板端口,用于查看连接状态
dashboard_port = 7500
# 可选项:仪表板的用户名和密码
dashboard_user = admin
dashboard_pwd = admin_pwd_456
# 设置http及https协议下代理端口(非重要)
vhost_http_port = 7080
vhost_https_port = 7081
# 可选项:日志配置
# log_file = ./frps.log
# log_level = info
# log_max_days = 3
步骤 2:使用 Docker 运行 FRPS
我们使用 Docker 来运行服务端容器。这里使用官方镜像 snowdreamtech/frps
。
docker run -d \ --name frps \ --restart=always \ -p 7000:7000 \ -p 7500:7500 \ -v /opt/frp/frps.ini:/etc/frp/frps.ini \ snowdreamtech/frps
- 实例阿里云部署:
sudo docker pull registry.cn-shenzhen.aliyuncs.com/mogublog_business/frps #拉取镜像
sudo docker pull registry.cn-shenzhen.aliyuncs.com/mogublog_business/frps
参数解释:
-d
:后台运行容器。--name frps
:为容器指定一个名字。--restart=always
:Docker服务重启时,容器自动重启。-p 7000:7000
:将宿主机的7000端口映射到容器的7000端口(对应bind_port
)。-p 7500:7500
:将宿主机的7500端口映射到容器的7500端口(对应dashboard_port
)。-v /opt/frp/frps.ini:/etc/frp/frps.ini
:将宿主机的配置文件挂载到容器内。
步骤 3:验证服务端
- 检查容器状态:bashdocker ps你应该能看到
frps
容器正在运行。 - 访问仪表板(可选):
打开浏览器,访问http://x.x.x.x:7500
,使用配置文件中设置的用户名(admin
)和密码(admin_pwd_456
)登录。如果能看到仪表板,说明frps
部署成功。 - 检查防火墙:
确保你的云服务器安全组/防火墙已经放行了7000
和7500
端口。
二,部署 FRP 客户端
假设你有一台内网机器(IP为 192.168.9.100
),你想通过公网访问这台机器的SSH服务(22端口)。
步骤 1:准备客户端配置文件
在内网机器上同样创建一个目录。
mkdir -p /root/
cd /root
创建客户端配置文件 frpc.ini
:
vim frpc.ini
将以下内容写入 frpc.ini
。请务必将 server_addr
和 token
修改为与服务端匹配的值。
[common]
# server_addr为FRPS服务器IP地址
server_addr = 1.13.81.214
# server_port为服务端监听端口,bind_port
server_port = 7000
# 身份验证
token = Zxb@=1234+qwer.
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 2222
# [ssh] 为服务名称,下方此处设置为,访问frp服务段的2288端口时,等同于通过中转服务器访问127.0.0.1的22端口。
# type 为连接的类型,此处为tcp
# local_ip 为中转客户端实际访问的IP
# local_port 为目标端口
# remote_port 为远程端口
[BMC浪潮]
type = tcp
local_ip = 192.168.7.100
local_port = 443
remote_port = 18080
[BMC浪潮Esxi8.0]
type = tcp
local_ip = 192.168.7.98
local_port = 443
remote_port = 18081
[运维中心视频监控]
type = tcp
local_ip = 192.168.3.100
local_port = 80
remote_port = 18082
[RDP 张工PC1]
type = tcp
local_ip = 192.168.9.103
local_port = 3389
remote_port = 13389
[RDP 周工PC1]
type = tcp
local_ip = 192.168.6.100
local_port = 3389
remote_port = 23389
步骤 2:使用 Docker 运行 FRPC
使用官方镜像 snowdreamtech/frpc
来运行客户端容器。
docker run -d \ --name frpc \ --restart=always \ -v /opt/frp/frpc.ini:/etc/frp/frpc.ini \ snowdreamtech/frpc
实例阿里云部署:
sudo docker pull registry.cn-shenzhen.aliyuncs.com/mogublog_business/frps #拉取镜像
docker run --restart=always --network host -d -v /root/frpc.ini:/etc/frp/frpc.ini --name frpc registry.cn-shenzhen.aliyuncs.com/mogublog_business/frpc:latest
参数解释:
- 大部分参数与服务端类似。
- 这里不需要
-p
参数,因为客户端是主动向外建立连接,不需要在宿主机上监听端口。只有当需要穿透的服务在客户端机器的其他Docker容器中时,才可能需要使用--network host
或自定义Docker网络。
步骤 3:验证客户端
- 检查容器状态和日志:bashdocker ps docker logs frpc查看日志,如果显示
"login to server success"
之类的信息,说明客户端已成功连接至服务端。 - 测试内网穿透:
现在,你可以在任何能访问公网服务器的机器上,通过以下命令SSH连接到内网的机器:bashssh -o Port=6000 username@x.x.x.xusername
是内网机器上的实际用户名。x.x.x.x
是公网服务器的IP。6000
是你在客户端配置[ssh]
中设置的remote_port
。
三,访问测试
- 笔者这里通过反向代理用域名访问,可以正常的访问,提示输入口令密码


总结与注意事项
- 安全第一:务必设置强壮的
token
,不要使用示例中的简单密码。 - 防火墙:确保服务端的安全组和系统防火墙已正确放行相关端口(
7000
,7500
, 以及你在客户端配置的remote_port
,如6000
,8080
等)。 - 客户端配置:
local_ip
如果是要暴露本机物理机的服务,通常是127.0.0.1
。如果要暴露与frpc
在同一台机器上其他Docker容器的服务,情况会复杂一些,可能需要使用host
网络或配置自定义Docker网络。 - 更多功能:FRP功能非常强大,还支持UDP、HTTP/HTTPS代理、负载均衡等。请参考其官方文档:https://gofrp.org/docs/ 以获取更高级的配置。
通过以上步骤,您应该已经成功使用Docker部署了一套可用的FRP内网穿透服务。
华三DHCP+Nat内网用户通过防火墙访问外网:https://www.hao0564.com/5342.html