frp介绍

frp是一个实现内网穿透的程序,通过客户端(内网)与服务端(外网)建立的持续信道,实现内网程序映射到外网。其原理大致为:服务端坚挺固定的几个端口;流量到达服务端端口;流量交给客户端处理,客户端转发流量到指定服务。

示例

  1. 服务端

/etc/systemd/system/frps.service

[Unit]
Description=Frp Server Service
After=network.target

[Service]
Type=simple
User=root
Restart=on-failure
RestartSec=600s
ExecStart=/usr/local/bin/frps -c /etc/frp/frps.ini

[Install]
WantedBy=multi-user.target

/etc/frp/frps.ini

[common]
bind_port = 37000
vhost_http_port = 8080
vhost_https_port = 8443
dashboard_addr = 0.0.0.0
dashboard_port = 37500
dashboard_user = ***
dashboard_pwd = ***

bind_port表示frp服务端与客户端建立通信使用的端口;vhost_http_port表示使用http服务的时候使用的端口;dashboard_port是面板的端口。

以上配置完成后,frp会占用,37000,8080,8443,37500端口

  1. 客户端

/etc/systemd/system/frpc.service

[Unit]
Description=Frp Client Service
After=network.target

[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=10s
ExecStart=/usr/local/bin/frpc -c /etc/frp/frpc.ini
ExecReload=/usr/local/bin/frpc reload -c /etc/frp/frpc.ini

[Install]
WantedBy=multi-user.target

/etc/frp/frpc.ini

[common]
server_addr = 149.28.60.76
server_port = 37000

[harbor80]
type = http
local_ip = 10.254.194.208
local_port = 80
custom_domains = harbor.amrom.tk

[gitlab80]
type = http
local_ip = 10.254.128.141
local_port = 80
custom_domains = gitlab.amrom.tk

[minio80]
type = http
local_ip = 10.254.223.170
local_port = 9000
custom_domains = minio.amrom.tk

[k8s80]
type = http
local_ip = 10.254.48.82
local_port = 80
custom_domains = ui.amrom.tk

[tour80]
type = http
local_ip = 10.254.37.240
local_port = 3999
custom_domains = tour.amrom.tk

客户端不会占用任何端口,以上配置表示客户端通过37000与服务端建立连接,同时监听了内网的gitlab80,minio80,k8s80,tour80服务,服务之间通过域名区分。

  1. nginx

一般来说,不建议直接暴露frp服务出来,使用nginx反代处理效果更好。

minio.conf

server {
  listen 80;
  listen 443 ssl http2;
  server_name minio.amrom.tk;
  ssl_certificate    /etc/nginx/conf.d/ssl/1_harbor.amrom.tk_bundle.crt;
  ssl_certificate_key    /etc/nginx/conf.d/ssl/2_harbor.amrom.tk.key;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
  ssl_prefer_server_ciphers on;
  ssl_session_cache shared:SSL:10m;
  ssl_session_timeout 10m;
  error_page 497  https://$host$request_uri;

  location / {
       proxy_pass  http://127.0.0.1:8080;
       proxy_ssl_server_name on;
       proxy_redirect off;
       proxy_ssl_verify off;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header Host $http_host;
       proxy_set_header X-NginX-Proxy true;
  }
}

nginx的配置根据不同的server_name生成,location注意要转发host到请求头中,frp服务端根据该请求头决定交给哪个客户端服务处理。

经过以上配置后,frp服务隐藏在nginx后,可以嵌套cdn进一步隐藏真实ip。