# 使用frp做内网穿透

# 简述

之前用过ngrok,将内网的某个http服务暴露到公网。今天试试frp,将内网的服务器的ssh端口暴露到公网,实现外网直接访问内网服务器。 过程和ngrok一样: frp.png

  1. 内网服务器(192.168.5.211)可以上网
  2. 外网有一台服务器,固定ip是1.2.3.4
  3. 通过frp将这两台服务器连接起来,1.2.3.4这台服务器会暴露出一个端口8090,用户通过这个端口,即可连接到内网服务器192.168.5.211的22端口

# 配置过程

服务器需要安装好go

本次使用的go版本是:go1.6.2

frp版本是:frp_0.21.0_linux_amd64

frp的地址是https://github.com/fatedier/frp,在上面下载好对应的版本,解压后的文件如下:

frpc           frpc_full.ini  frpc.ini       frps           frps_full.ini  frps.ini

各个文件的作用如下:

文件名 用途
frpc 客户端
frpc_full 客户端的详细配置
frpc.ini 客户端的简洁配置
frps 服务端
frps_full.ini 服务端的详细配置
frps.ini 服务端的简洁配置

# 服务端配置

进入frp_0.21.0_linux_amd64目录,修改frps.ini内容如下:

[common]
bind_addr = 0.0.0.0
bind_port = 9090 #客户端连接的端口
log_file = ./frps.log
log_level = info
log_max_days = 3
token = 123456 #token验证
allow_ports = 2000-3000,3001,3003,4000-50000,8090 #用于暴露到公网的端口
max_pool_count = 5
max_ports_per_client = 0
authentication_timeout = 900
tcp_mux = true

启动服务

./frps -c ./frps.ini

如果看到类似如下信息,则是启动成功

2018/10/11 18:17:54 [I] [service.go:130] frps tcp listen on 0.0.0.0:9090
2018/10/11 18:17:54 [I] [root.go:207] Start frps success

可用nohup来启动,这样即使终端断开了,服务也会继续运行

nohup ./frps -c ./frps.ini &

# 客户端配置

进入frp_0.21.0_linux_amd64目录,修改frpc.ini内容如下:

[common]
server_addr = 1.2.3.4 
server_port = 9090
token = 123456 #和服务端设置的token一致

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 8090 #暴露在公网的端口

启动客户端

./frpc -c ./frpc.ini

如果看到类似如下信息,则是启动成功

2018/10/11 06:31:23 [I] [proxy_manager.go:300] proxy removed: []
2018/10/11 06:31:23 [I] [proxy_manager.go:310] proxy added: [ssh]
2018/10/11 06:31:23 [I] [proxy_manager.go:333] visitor removed: []
2018/10/11 06:31:23 [I] [proxy_manager.go:342] visitor added: []
2018/10/11 06:31:23 [I] [control.go:246] [0a66cb717f83f5dd] login to server success, get run id [0a66cb717f83f5dd], server udp port [0]
2018/10/11 06:31:23 [I] [control.go:169] [0a66cb717f83f5dd] [ssh] start proxy success

在另一台外网机器上连接1.2.3.4的8090端口,如果能正常连接,并且访问的是192.168.5.211,则是配置成功了。 同样,也可用nohup来启动,保证服务正常运行。

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

如果要映射多个端口,需要启动多个frp服务,一个服务对应一组端口

# 参考

https://www.hi-linux.com/posts/25686.html