使用 frp 实现内网穿透

简介

frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。本文主要介绍如何使用 frp 搭建 http 和 ssh 服务。

工作过程

用户 -> 外网服务器(frps) -> 内网服务器(frpc)

搭建

下载地址为: https://github.com/fatedier/frp/releases ,作者提供了不同平台的编译版本。

当前最新版本为 v0.16.1,本人环境为 Ubuntu 16.04,下载的版本为 frp_0.16.1_linux_amd64.tar.gz

目录结构如下:

.
├── frpc            # 内网服务器可执行程序
├── frpc.ini        # 内网服务器配置文件
├── frpc_full.ini   # 内网服务器完整配置文件
├── frps            # 外网服务器可执行程序
├── frps.ini        # 外网服务器配置文件
├── frps_full.ini   # 外网服务器完整配置文件
└── LICENSE

内网服务器

文件

内网服务器只需要如下三个文件:

.
├── frpc
├── frpc_full.ini
└── frpc.ini

配置 

frpc.ini 配置如下:

[common]
server_addr = x.x.x.x
server_port = 7000

# 第一个 web 服务,访问地址为: http://app1.example.com
[web01]
type = http
local_ip = 127.0.0.1
local_port = 3000
subdomain = app1

# 第二个 web 服务,访问地址为:http://app2.example.com
[web02]
type = http
local_ip = 127.0.0.1
local_port = 4000
subdomain = app2

# ssh 服务,访问方式为 ssh -oPort=6000 $USER@x.x.x.x
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

启动

./frpc -c ./frpc.ini

外网服务器

文件

外网服务器只需要如下三个文件:

.
├── frps
├── frps_full.ini
└── frps.ini

配置

frps.ini 配置如下:

[common]
bind_port =7000
vhost_http_port = 8000

subdomain_host = example.com

通过域名和端口号 http://example.com:8000 可以访问该服务。

启动

./frps -c ./frps.ini

使用 nginx 转发

客户端(浏览器) -> 外网服务器(nginx[80 端口] -> frps[8000 端口]) -> 内网服务器(frpc)

server {
    server_name app1.example.com;

    listen 80;
    listen [::]:80;

    root /var/www/html;
    index index.html;

    location / {
        proxy_set_header  Host $host:80;
        proxy_set_header  X-Real-IP $remote_addr;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_hide_header X-Powered-By;

        proxy_pass http://127.0.0.1:8000;
    }
}

效果

可用通过 http://app1.example.com 访问内网服务。

参考