Docker搭建FRP内网穿透服务(花生壳、Ngrok平替)

frp+scrcpy

内网穿透, 让局域网的服务在异地互联网状态依旧在线可用

frp,一个高性能的反向代理, 可以通过互联网(外网)访问内网(本地局域网)设备

灵活,TCP/IP底层逻辑应用广泛

2024.01 更新内容:如何家宽模式下使用(frp p2p模式 )
使用感受:P2P模式对于这种家宽自建的frp服务太实用

有什么用

映射出局域网,‘打洞‘,平替花生壳之类的功能

举例:远程scrcpy连接安卓设备的adb操作屏幕,说人话:远程控制机顶盒或电视等

1
2
3
4
5
# 操作步骤
## 开启frpc p2p模式
1. frpc -c frpc.ini
## 通过ssh连接本机特定端口,来连接远程NAS的SSH(TCP 22端口)
2. ssh 127.0.0.1 -p 22223

[概念]什么是FRP 内网穿透服务

https://github.com/fatedier/frp/blob/master/README_zh.md

1
2
3
为什么使用 frp ?
开发状态
完整文档已经迁移至 https://gofrp.org

实现方法

先自建一个frps服务器端(运行frps用的)
然后自控端A,被控端B;内网穿透服务器
https://zsxwz.com/2023/10/09/远程投屏控制安卓手机,不用-usb-不用-wifi-不用root/
https://zsxwz.com/2023/10/03/frp-使用-p2p-模式,点对点穿透,节约服务器带宽/
开启手机adb,然后用scrcpy

[done]TODO 自建docker的frps服务
https://github.com/fatedier/frp
方案就是开放特定的内网服务到外网直接访问(域名+端口),这个特定的内网服务是有控制功能的,比如路由的web页面,可ssh的端口,可以远程桌面的mstc等。
这样打洞以后,在洞上面架设的是可以远程操作协助的APP(比如远程桌面,ssh等)
从而实现远程协助的功能。

感觉frps,frpc才是王道,但愿受控端的操作会少一些,简单一下,步骤简易一些,通俗易懂一些。

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
version: '3.3'
services:
frps:
image: snowdreamtech/frps:latest
#ports:
# - "7000:7000" #
# - "9527:7500" #web management
# - "10022:10022" #used for ssh
# - "7500:80" #http
# - "10443:443" #https
network_mode: host #改成host模式,省出一些事来
volumes:
- ./frps.ini:/etc/frp/frps.toml #很奇葩为的最新版frps就是要这么对应
#- ./frps.toml:/etc/frp/frps.toml
container_name: frps
restart: unless-stopped

FRP服务器配置文件 frps.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[common]                                                                                                                       
#frps listen on 7000
bind_port= 7000
kcp_bind_port = 7000

#vhost_http_port = 80
#vhost_https_port = 443

authentication_method = token
token = @@@@@@@@@@

# If subDomainHost is not empty, you can set subdomain when type is http or https in frpc's configure file
# When subdomain is est, the host used by routing is test.frps.com
custom_domains = "carlzeng.com"
log_level = trace


#dashboard
dashboard_addr = 0.0.0.0
dashboard_port= 9527
dashboard_user= @@@@@@
dashboard_pwd= @@@@@@

7000映射到外网了,在主路由上已配置。
测试frpc 来链接。。。。

2023/12/01 08:35:34 [1;34m[I] [service.go:312] Dashboard listen on 0.0.0.0:9527[0m
无法正常连接, 原来是 配置文件dashboard_port= 7500,然后docker映射出来9527即可。

docker重启日志中:
2023/12/01 08:57:30 [1;34m[I] [service.go:533] [67b3d0c8dd4be924] client login info: ip [120.244.216.197:37895] version [0.52.3] hostname [] os [linux] arch [mipsle][0m

new proxy [web] type [http] error: subdomain is not supported because this feature is not enabled in server
https://github.com/fatedier/frp

FRPS 服务端如何反代?

修改了上面的配置:

network_mode: host

开启防火墙6002

太赞了,https://@@@@.carlzeng.com:@@@@/Advanced_Extensions_script.asp

比Zerotier强太多了!!!

​ K2P UI中的文本框编辑在Zerotier中无法使用,在frpc后反代以后都正常了!

https://@@@@.carlzeng.com:@@@@/ 反代到debian的6002端口,协议选择http

客户端frpc配置

frpc可以运行与各个平台,比如:Windows电脑、苹果电脑、Linux、Unix等系统的电脑,安卓手机端,苹果手机端等等…

设置应用2

FRP客户端配置文件 frpc.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[common] 
server_addr = frp.@@@. #对应上面frps服务器的IP或者域名
server_port = 7000

[webFloor#2]
type = tcp
local_port = 80
remote_port = 6003

[webFloor#1]
type = tcp
local_ip = 192.168.10.1
local_port = 8080
remote_port = 6004

设置到K2P里面去

[done]TODO:

开启debian防火墙的6003-6004,

NPM反代6003

设置应用3

去应用的docker中(比如独角数卡)加入frpc,然后反代出来

wget https://mirror.ghproxy.com/https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_amd64.tar.gz

tar -xf frp_0.52.3_linux_amd64.tar.gz -C /usr/local/bin

1
./frpc -c frpc.ini

客户端 frpc.ini

1
2
3
4
5
6
7
8
9
10
[common]                                                                                                                     
server_addr = 192.168.6.116
server_port = 7000
token = @@@@@

[dujiaoshuka]
remote_port = 4445
type = tcp
local_port = 4444
subdomain = buy

发现仍然无法解决,页面的操作携带端口的需求

设置应用4

远程控制adb,安卓设备远程控制

在路由器上,给192.168.123.189这个设备的5555端口映射出来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
....#省略连接服务器部分的配置 [common] 都一样指定远程服务端的信息

[zl_n1_adb5555]
remote_port = 6006
type = tcp
local_ip = 192.168.1.243
local_port = 5555
subdomain = ssh_zl
[zl_web_80]
remote_port = 6008
type = tcp
local_ip = 192.168.1.12
local_port = 80
subdomain = ssh_zl

如何家宽模式下使用(frp p2p模式 )

使用frp的p2p模式,点对点穿透,绝大多数数据无需经过服务端,加速了穿透访问

第三方接入FRP服务器,映射出特定的端口到本地:

服务器frps的配置,和上面一样无需做任何修改,只要是配置被控端和主控端的两个frpc配置文件:

2、被控端B配置文件 frpc.ini

1
2
3
4
5
6
7
8
9
[common]
server_addr = 服务端ip地址
server_port = 7000
token = 123456xxx
[p2p_sj_adb] #比如安卓手机termux穿透adb 5555端口,这个名称要对应主控端A的server_name名称
type = stcp
sk = password
local_ip = 127.0.0.1 ##这也可以是本地局域网的特定主机IP
local_port = 5555

3、主控端A 配置文件 frpc.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
[common]
server_addr = 服务端ip地址
server_port = 7000
token = 123456xxx
[p2p_sj_adb_visitor]
type = stcp #使用stcp协议
role = visitor #身份访客
server_name = p2p_sj_adb #和被控端的节点名称一样,这个名称要对应被控端B的名称
sk = password #必须是:和被控端一样的密码
bind_addr = 127.0.0.1
bind_port = 15550 #使用到的本机端口;
#这样连接本机的15550端口就直接穿透到被控端B的5555端口

免费的FRP服务资源

如果暂时没有自建的条件,可以直接使用网络上开放免费的FRP服务,比如:

  1. https://frp.104300.xyz/
  2. https://freefrp.net/
    1. 说明文档很赞; https://freefrp.net/docs

优点:所见即所得,马上就用

缺点:速度慢,适合用来学习测试

设置和应用太灵活了,以至于很难理解和变通到家宽部署的情况。

关键词:docker frps 反向代理

群晖中安装 frpc 脚本

1
2
3
4
wget https://raw.githubusercontent.com/stilleshan/frpc/master/frpc_synology_install.sh && chmod +x frpc_synology_install.sh && ./frpc_synology_install.sh

# 以下为国内镜像
wget https://github.ioiox.com/stilleshan/frpc/raw/branch/master/frpc_synology_install.sh && chmod +x frpc_synology_install.sh && ./frpc_synology_install.sh

image-20240801010110138

frpc toml stcp 格式: https://github.com/fatedier/frp/blob/dev/conf/frpc_full_example.toml

1
nohup /usr/local/frp/frpc -c /usr/local/frp/frpc.ini >/dev/null 2>&1 &

脚本再群晖中,自动安装 frpc

错误以及排除解决

custom listener for [] doesn’t exist

1
2024/08/18 17:53:42 [W] [visitor.go:149] [fa45c4fd20893d9b] [CTR_hby_k2p_web80] start new visitor connection error: custom listener for [hby_k2p_web80] doesn't exist 

ping frp.carlzeng.com 服务器的IP是正确的, 由于服务器的IP刚变, 现在不清楚是:

  1. 服务器docker的故障?
    1. 实时证明, 服务端非常稳定
  2. NAS中运行的frpc的故障?
    1. 由于没有frpc, 导致无法直接连接到NAS的ssh
    2. 通过开放的debian代理, 直接远程来访问k2p的局域网地址: http://192.168.6.243/Advanced_WOL_Content.asp
    3. 果然问题出现在这个层面了, 详见下方
  3. 本地的frpc故障?
    1. 重启一下MAC

image-20240818205804453

原来在NAS中, ping frp.carlzeng.com 居然还是得到旧的IP地址(错误的), 难怪远程无法正常P2P连接过去.

优化(20240818):

  1. 把NAS中运行的frpc所连接的服务地址, 修改为局域网中的本地地址(192.168.*.*); 这样的好处就是, 不管外网IP怎么变(域名所解析带来的延迟效果, 错误解析等等) 都不会影响到, 本地局域网的frpc客户端上线.
  2. 检查了NAS的计划任务, 每次开机启动NAS, 会自动运行frpc

至此, 解决了NAS中的frpc 运行故障(DNS解析得到错误的IP地址)

进一步优化:

把这个命令添加到进程守护中去, 这样不管发生什么进程消失/退出了; 会自动重启起来.

灵感来源/感谢列表

家里没有公网IP?FRP+NPM+VPS = 随时随地用域名访问家里的任何设备!内网穿透,从未如此简单!

Docker 部署 Nginx、frp 实现内网穿透

使用docker-compose来构筑NGINX、frp的HTTP内网穿透

用FPC实现HTTPS内网穿透

Frp内网穿透——frpc客户端使用(2)

个性化需求沟通 扫客服加V加群: