linux

frp - 内网穿透神器 - A fast reverse proxy

使用 frp 有很长一段时间了,但是一直没有写这方面的文章,每次重新配置都需要读官方的文档,略显吃力。从很长一段的文档里提取最核心的内容,显得并不那么容易。本文将讲述我是如何使用 frp 实现内网穿透,即在家里 ssh 公司的电脑以及 公司电脑上的 web 服务公开给大家使用。

frp 是我所见过 的 内网穿透解决方案里 我最喜欢的一个,功能足够强大,可以 穿透 ssh 和 web,并支持 kcp 协议。github 地址是 https://github.com/fatedier/frp ,拥有将近 30K star,足见其实力吧。下面回归主题,使用 frp 穿透 ssh 和 web 服务。

frpc.ini 配置

[common]
server_addr = xxx.xxx.xxx.xxx
server_port = 7000
protocol = kcp

如上,是 frp 客户端的基础配置,如果要配置 ssh 或者 web 服务,你继续追加即可。

frp 实现 ssh 穿透

frpc.ini 配置如下:

[common]
server_addr = xxx.xxx.xxx.xxx
server_port = 7000
protocol = kcp

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

这里的 ssh 可以换作别的名称,不影响使用,但是不能重复哦,重复注册不成功。

frps.ini 配置如下:

[common]
kcp_bind_port = 7000
vhost_http_port = 8080
subdomain_host = kpromise.top

这里,subdomain_host 指你的主域名,7000 是 frp 主程序的监听地址,需要跟上文中 server_port 对应。8080 是 http 的监听端口。

frp 穿透内网 web 服务

frpc.ini 配置如下:

[common]
server_addr = xxx.xxx.xxx.xxx
server_port = 7000
protocol = kcp

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

[customerdev]
type = http
local_port = 8182
subdomain = customerdev

frps.ini 配置如上,这里不再赘述。之后你可以 frps -c frps.ini 以及  frpc -c frpc.ini 来启动客户端和服务端,启动后,你就可以通过 customerdev.kpromise.top:8080 来 访问内网服务了。如果你不想要 域名后面的 8080,那就只能通过 nginx 转发了,即 你请求 customerdev.kpromise.top 时,nginx 将流量转发到 本地的 8080 端口,配置如下:

server {
  listen 80;
  server_name customerdev.kpromise.top;
  server_tokens off;
  return 301 https://$host$request_uri;
}

server {
  listen 443 ssl;
  server_name customerdev.kpromise.top;
  charset uft-8;

  location / {
    proxy_pass http://localhost:8080;
    gzip off;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
  ssl_certificate /etc/letsencrypt/live/kpromise.top/fullchain.pem; # managed by Certbot
  ssl_certificate_key /etc/letsencrypt/live/kpromise.top/privkey.pem; # managed by Certbot
}

这样子,你还直接给 加了 https 呢,何乐而不为!记住一点 [customerdev]  这里 customerdev 是服务名称,你随便写,但是不能重复。而 common 部分你就不要改了,反正我没改!可以多个 client 连接 同一个 server,除了 common 外,其余 服务名称不得重复。另外,还支持 流量压缩与加密,以及客户端服务端鉴权。鉴权呢,服务端和客户端的 common 配置中的 token 参数一致则身份验证通过。压缩与加密需要在 client 端指定,且只能在服务配置下,比如:

frpc.ini
[ssh]
type = tcp
local_port = 22
remote_port = 6000
use_encryption = true
use_compression = true

压缩后可有效加快传输速度。

full-stack-trip

Share
Published by
full-stack-trip

Recent Posts

Android 自定义 View 入门

说来惭愧,工作数年,连基本的自…

4 年 ago

retrofit 同时支持 xml 和 json

retrofit 解析 jso…

4 年 ago

mysql - 存储过程 从入门到放弃

最近有个报表的需求,于是乎用了…

4 年 ago

奶嘴战略 - 你不得不知道的扎心真相(一)

一句:英雄枯骨无人问,戏子家事…

4 年 ago

acme.sh 的简单使用

acme.sh 是纯 shel…

4 年 ago

wrk -更现代化的http压测工具

wrk 是一款更现代化的 ht…

4 年 ago