用 frp 实现内网穿透

最近偶然留意到了 frp ,手头刚好有闲置的 Mac 设备,跟着官方 ReadMe 走下来,基本上跑的通。简单的写个教程,算做总结。

一、前期准备

  • 公网 IP

一定要。并且需要在公网 IP 这台机器上运行 frp 的 server 程序。

  • 客户端设备

局域网要做内网穿透的设备,部署 frp 的 client 程序。

二、frp 下载与部署

下载

github 开源地址:https://github.com/fatedier/frp 。直接去 Releases 选择最新的版本下载。操作系统和CPU位数等都注明了,对应的选择合适的下载即可。

安装、配置、启动

安装使用主要是看官方的使用教程:Example Usage 。frp 不需要特别的安装,下载解压后直接就能进行配置和启动程序了。

以我下载的适配 mac 的客户端为例,解压后如下:

  frp_0.51.2_darwin_amd64 tree
.
|____frpc
|____frps.ini
|____frps_full.ini
|____LICENSE
|____frpc.ini
|____frps
|____frpc_full.ini
Zsh

其中文件名 frp 后是 c 后缀的,就是客户端相关;s 后缀就是服务端相关。frpc 是客户端程序,frpc.ini 是客户端配置文件,frpc_full.ini 是客户端的全部配置字段,可以用作参考。frps 各文件同 frpc。

分别讲一下 server 和 client 配置和启动:

  • server 配置和启动

在公网 IP 机器上下载 frp 程序,或者将对应的 frp 程序上传到公网 IP 的机器,修改 frps.ini 配置。我使用的配置如下( x 均为马赛克):

/xxx/frp_0.51.2_linux_amd64 cat frps.ini
[common]
bind_port = 7000
vhost_http_port = 70xx

dashboard_port = 7500
# dashboard's username and password are both optional
dashboard_user = xxxx
dashboard_pwd = xxxx

token = xxxx
Bash

bind_port 是用于 server 和 client 的通讯端口,所以服务器防火墙要打开 bind_port 端口。vhost_http_port 是我配置的 http 代理端口,非必需。

dashboard_xx 对应的是 frp 管理后台的配置,直接在 dashboard 看配置的代理是否正常,比较方便。dashboard_port 端口也要打开。

token 是服务端和客户端校验比对使用的,必须一致。安全起见最好配一下 token。

配置好了之后要启动服务端程序,启动方法如下:

./frps -c ./frps.ini
Bash

程序启动后不可以退出。推荐这个方法启动:

nohup ./frps -c ./frps.ini &
Bash
  • client 的配置与启动

在 client 设备下载并解压 frp 程序,修改 frpc.ini 配置。我使用的配置如下:

/xxx/frp_0.51.2_darwin_amd64 cat frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
token = xxxx

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

[xxxx]
type = http
local_port = 80xx
custom_domains = xxxx.phoene.com
Zsh

server_addr 即公网 IP。

server_port 就是在 server 配置启动部分,配置的 bind_port。

token 同 server 的 token。

[ssh] 节点配置的是一个 tcp 类型的代理,用于 ssh 登录。其中公网 IP 机器要把 remote_port 也打开。

[xxxx] 节点是我配置的一个 http 节点,非必需。我在穿透后的局域网设备上,部署了一个 jenkins 服务,所以配置了这个节点,就可以在外网通过 xxxx.phoene.com 域名访问服务。

至此,客户端配置也比较简单,启动方法如下:

./frpc -c ./frpc.ini
Zsh

同 server 部分所述,你最好这样启动:

nohup ./frpc -c ./frpc.ini &
Zsh

三、frp 部署后验证和使用

一顿操作猛如虎,结果如何呢?可以这样验证:

  • dashboard

如果 frp server 部分有配置 dashboard 的话,可以直接通过这个链接访问 dashboard:

http://[公网 IP]:dashboard_port

假设你的公网 IP 是 133.134.135.136,dashboard_port 是 7500,则访问链接是:http://133.134.135.136:7500 。

如果可以正常打开,使用账号 dashboard_user 和密码 dashboard_pwd 登录进入后,在管理后台的 Proxies 菜单里可以看到客户端配置是否生效,比如 TCP 下会看到我们配置的 SSH 节点,并且会有  online  的状态标识。

  • ssh 登录穿透后的设备

登录命令是:

ssh [client 用户名]@[公网 IP] -p[remote_port]
Zsh

如果你部署 client 的设备,也即内网穿透的设备,假如用户名是 frp_root;假设你的公网 IP 是 133.134.135.136,client 的 [ssh] 节点部分配置的 remote_port 是 6000,那么你在外网使用 ssh 登录内网穿透的设备的命令是:

ssh frp_root@133.134.135.136 -p 6000
Zsh

不出意外的话,输入 frp_root 用户对应的密码,就可以在外网通过 ssh 访问内网设备了。如果出了意外,检查 frp 都没问题后,记得去看一下端口是否开放,局域网 client 设备的用户、密码和远程访问等是否开启。

四、frp 内网穿透有什么用?

自己做 NAS 挺不错的,稳定性的话就自己去保障了。

我做了内网穿透后,是想做为测试环境服务器使用。

client 我直接安装了 docker ,通过 docker 启动了 jenkins、mysql 等各种服务。还可以部署自己应用的测试环境。

可以通过域名从外网访问 client 上的服务,步骤大概是:先把域名解析到公网 IP,公网 IP 的机器通过 nginx 代理转发到 vhost_http_port 端口上,frp 会继续转发到 client 设备上,再通过 client 的配置代理到本机的对应端口上。

以上看出,ssh 登录 client 可以进行运维,通过 http 代理可以正常访问服务,做测试服务器再合适不过了。

至于 client 安装 docker、域名各种代理、解析之类,不在此次教程范围,就不赘述了。

进阶推荐:

《用 frp 实现内网穿透 – Docker 部署 frp》

1条评论

  1. md😠
    远程登录 frpc,一不留神儿把 frpc 进程给杀了,连接直接断开。💔
    回去就把 frpc 部署到 docker,部署完再更一篇。💪

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注