Skip to main content

frp docker compose

4 min read

选择镜像

在 docker hub 上搜索 frp ,没有官方镜像,目前下载量最高的是 snowdreamtech/frpc 这个,所以选用这个,查了一下没有现成的 docker-compose.yml 参考。

写配置文件

# 公网服务器
mkdir frps
touch frps/frps.toml
touch frps/docker-compose.yml

mkdir nginx
mkdir nginx/conf.d
touch nginx/conf.d/service_1.my_domain.conf
touch nginx/conf.d/tmp.my_domain.conf # 测试用 Nginx 配置

# 内网服务器
mkdir frpc
touch frpc/frpc.toml
touch frpc/docker-compose.yml

frps.toml

  • Server 端配置文件
    • 有公网 ip 或者域名指向
    • 用户访问 ip 所在的服务器
# vim frps/frps.toml
bindPort = 7000 #{必选} 客户端与该端口建立连接
log.to = "console" #{可选} 日志配置, 通过打印的方式输出日志
vhostHTTPPort = 7100 #{可选} http 代理需要,当访问该端口时跳到对应本地 frpc 代理
vhostHTTPSPort = 7200 #{可选} https 代理需要,当访问该端口时跳到对应本地 frpc 代理
transport.tcpMux = true #tcp 流多路复用(优化传输,需一致)

#身份验证
auth.method = "token" #{可选}身份验证方式
auth.token = "password" #token 设置密码,用于通过身份验证创建连接

#frp 服务仪表板配置

webServer.port = 7500 #{也可自行修改端口}
webServer.addr = "0.0.0.0" #公网 ip 或者域名
webServer.user = "admin" #登录用户名{可自行修改}
webServer.password = "admin" #登录密码{可自行修改}

frpc.toml

# vim frpc/frpc.toml
serverAddr = "服务器 IP 或域名"
serverPort = 7000
log.to = "console"
auth.token = "密钥"

#frpc 服务仪表板配置 可以不要
webServer.addr = "0.0.0.0"
webServer.port = 7400
webServer.user = "admin"
webServer.password = "admin"

[[proxies]]
name = "rdp"
type = "tcp"
localIP = "10.128.39.41"
localPort = 3389
remotePort = 3389

报错

访问 Nginx 域名间接性无响应

  • 写了个简单的配置测试,测试后依然没有返回结果,无日志。
# vim tmp.my_domain.conf
server {
listen 80;
listen 443 ssl;

server_name tmp.my_domain.com; #请求域名

include /etc/nginx/conf.d/base.conf;

location / {
default_type application/json;
return 200 '{"status":"success","result":"nginx json"}';
}
}

  • 本地机器上 curl tmp.my_domain.com 依然无结果。
  • 感觉是官方 nginx 被反复硬重启,导致的无响应。
  • sudo docker compose stop && sudo docker compose rm -f && sudo docker compose up -d
  • 重启后 curl tmp.my_domain.com 反应正常。

my_domain.com 端口可以访问 二级域名映射后走 Nginx 不能访问

 *1 connect() failed (111: Connection refused) while connecting to upstream, client: 223.73.6.219, server: ttrss.my_domain.com, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:10181/", host: "ttrss.my_domain.com"

被访问端 Server A

  • 声明所用的网络
# vim frps/docker-compose.yml
version: '3'
services:
frps:
restart: unless-stopped
image: snowdreamtech/frps
container_name: frps
volumes:
- ./frps.toml:/etc/frp/frps.toml
ports:
- 7000:7000
networks:
- default # 默认为 service_name + network_name = frps_default

networks:
default:
driver: bridge

访问端 Nginx

  • 注明需要访问的网络
# vim nginx/docker-compose.yml
version: '3'
services:
nginx:
restart: unless-stopped
container_name: nginx
image: nginx
# network_mode: "host"
ports:
- 80:80
- 443:443
environment:
- NGINX_PORT=80
- TZ=Asia/Shanghai
privileged: true
volumes:
# # 有可能会出现不能挂载,这个时候用手动拷贝配置文件就行
# - /usr/local/nginx/nginx.conf/:/etc/nginx/nginx.conf
# - /usr/local/nginx/html:/usr/share/nginx/html
# - /usr/local/nginx/www:/var/www
# - /usr/local/nginx/etc/cert:/etc/nginx/cert
- /var/log/nginx:/var/log/nginx
- ./conf.d:/etc/nginx/conf.d
- /etc/letsencrypt:/etc/letsencrypt
- /etc/letsencrypt/live/my_domain.com:/usr/local/nginx/ssl/any
networks:
- frps_default # 默认为 service_name + network_name = frps_default

networks:
frps_default:
external: true
  • 这时候,Nginx 配置文件里的 ip 地址就可以直接用 frps 配置里的服务名 frps
# vim ./conf.d/service_a.my_domain.conf
upstream docker-frps {
server frps:3389;
}

server {
listen 80;
listen 443 ssl;

server_name service_a.my_domain.com; #请求域名

include /etc/nginx/conf.d/base.conf;

location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Ssl on;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

proxy_pass http://docker-frps;

}

# set site favicon
location /favicon.ico {
return 204 ;
}
}

Nginx and favicon.ico - "GET /favicon.ico HTTP/1.1" FAILED

location = /favicon.ico {
return 204;
access_log off;
log_not_found off;
}

最后 frpc 的 docker-compose.yml

# vim frpc/docker-compose.yml
version: '3'
services:
frpc:
restart: unless-stopped
image: snowdreamtech/frpc
container_name: frpc
volumes:
- ./frpc.toml:/etc/frp/frpc.toml
# ports:
# - 7400:7400

因为是由 frpc 访问内网服务,所以它不用写端口,不过有个管理页面,需要的打开。


Loading Comments...