内网穿透工具-frp
2018年08月09日

概述

frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。
类似于反向代理工具ngrok,frp也同样采用服务端进行流量转发,所以需要服务端有较高的上下行带宽。

安装

下载

frp项目一直都很活跃,可以在github上找到frp的release版本。针对不同平台,下载对应的压缩包。
下载地址

配置与部署

相比ngrok,frp不需要重新编译项目加载证书,服务端和客户端的文件结构相同(1个主程序和1个配置文件)。

先来配置服务端吧。
以Linux为例,服务端由frps文件(服务端主程序,frp server),及配置文件frps.ini组成。
打开服务端的配置文件,修改配置

vim frps.ini
[common]
bind_port = 7777
vhost_http_port = 8080
字段名 含义
[common] 公共配置部分,不可或缺的部分
bind_port frp 服务端与客户端之间交互所使用的端口
vhost_http_port 如果需要代理frp客户端上的web服务所使用的端口

这里只列出一些基本配置,更详细的配置,可以参考frps_full.ini文件,里边有更详细的介绍

./frps -c frps.ini &

直接运行服务端程序,&保证服务端后台运行。服务端就算配置完成了。

再来配置客户端
同样以Linux为例,客户端由frpc文件(服务端主程序,frp client),及配置文件frpc.ini组成。
打开客户端的配置文件,修改配置

[common]
server_addr = xxx.xxx.xxx.xxx
server_port = 7777

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

[web]
type = http
local_port = 1099
custom_domains = web1.hostname.com
use_encryption = false
use_compression = true
字段名 含义
[common] 公共配置部分,不可或缺的部分
server_addr 服务端的公网IP地址
server_port frp 服务端与客户端之间交互所使用的端口
[ssh] [web] frp客户端上配置的一个代理区块,自定义名称,但是不能重复
type 协议类型 tcp/http/https/udp
local_ip 本机IP
local_port 该区块服务使用的端口
remote_port 外网访问本机ssh服务使,所使用的端口
custom_domains 自定义子域名,配置http代理,需要公网服务器绑定域名

这里只列出一些基本配置,更详细的配置,可以参考frpc_full.ini文件,里边有更详细的介绍

./frpc -c frpc.ini &

直接运行客户端程序,&保证客户端后台运行。客户端就算配置完成了。

测试运行

ssh 连接

ssh -l username -p 1022 hostname.com

就可以通过服务器代理内网的客户端主机了。

web 服务
浏览器直接打开web1.hostname.com:8080,就可以访问客户端主机上部署在1099端口上的web服务了。

其他问题

群晖配置

群晖直接上面的配置就可以正确连接ssh和web服务了,端口需要修改成群晖使用的端口
但是由于web station和photo station使用的是80端口,所以需要单独配置个80或者443端口的代理

vim frpc.ini
[common]
server_addr = xxx.xxx.xxx.xxx
server_port = 7777

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

[nas]
type = http
local_port = 5000
custom_domains = nas.hostname.com
use_encryption = false
use_compression = true

[web]
type = http
local_port = 80
custom_domains = photo.hostname.com
use_encryption = false
use_compression = true

剩下的操作就大同小异了,手机APP打开其他群晖服务使用nas.hostname.com:8080,使用photo.hostname.com:8080打开DS photo.
如果使用web访问群晖服务端,直接打开photo station,会显示无法链接,可以看到url默认使用的nas.hostname.com,改成photo.hostname.com即可访问。打开photo station,在设置-路由器端口里边,配置主机名称,改为photo.hostname.com即可。

gentoo自地动服务

  1. 编写脚本
vim /etc/init.d/frpc
#!/sbin/openrc-run
# Copyright 1999-2018 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

name="frpc daemon"
description=""
pidfile="/var/run/frpc.pid"
logfile="/var/log/frpc"
configfile="/etc/frpc.ini"

depend() {
    need net
}

start(){
    ebegin "start frp client daemon"
        start-stop-daemon --start   \
        --make-pidfile              \
        --background                \
        --pidfile ${pidfile}        \
        --stdout ${logfile}         \
        --stderr ${logfile}         \
        --exec "/usr/bin/frpc"      \
        -- -c ${configfile}
    eend $?
}

stop(){
    ebegin 'stop frp client daemon'
        start-stop-daemon --stop --pidfile ${pidfile}
    eend 0
}
  1. 添加到启动服务中
rc-update add frpc default
  1. 测试
/etc/init.d/frpc start
/etc/init.d/frpc status

创建frpc systemd服务文件

创建frpc.service文件

vim /lib/systemd/system/frpc.service

内容如下:

[Unit]
Description=frpc - frp client daemon
Wants=network.target
After=dhcpcd.service

[Service]
Type=simple
ExecStart=/usr/local/bin/frp/frpc -c /usr/local/bin/frp/frpc.ini
Restart=always
ExecStop=/usr/bin/killall frpc

[Install]
WantedBy=multi-user.target

确保ExecStart/ExecStop使用的是绝对路径

systemct enable frpc
systemct start frpc

总结

frp作为一个反向代理工具,配置简单,链接稳定,相比ngrok来说,部署更为方便省心。