如何使用 frp 实现内网穿透

背景

做为一名程序员,家里多多少少会有一些落了灰的电脑,若是把闲置的电脑变成服务器,不只有良好的配置,还能用来作各类测试,那就再好不过了。可是局域网的设备怎么被外网访问呢?这就靠内网穿透来实现了。linux

内网穿透又叫 NAT 穿透,经常使用的工具备不少,好比 ngrok、花生壳、frp等,由于我使用的是 frp,这也是本篇文章的主题。git

NAT 是在 IP 数据包经过路由器或防火墙的时候重写 IP 地址的技术。由于如今的公网 IP 数量有限,国家不能给每一个设备分配一个公网 IP,因此只能多台计算机共用一个公网 IP 对外通信,这样就须要进行网络转换,而 NAT 的目的正是如此。程序员

基本实现原理

frp 分为服务端与客户端,前者运行在有公网 IP 的服务器上,后者运行在局域网内的设备上,服务端默认会先开放 7000 端口,而后客户端与其相连。github

同时客户端能够开启用于 ssh 的端口,与服务端的某个端口作映射,这样咱们在终端访问服务端的端口时,会自动转发到客户端去。web

除了 ssh 端口以外,frp 还支持 web 端口来接收 http 访问。shell

安装使用

目前须要公网服务器、内网服务器各一台,个人内网服务器重装了 linux 系统,方便试验各种工具。服务器

服务端安装配置

wget https://github.com/fatedier/frp/releases/download/v0.33.0/frp_0.33.0_linux_amd64.tar.gz
tar zxvf frp_0.33.0_linux_amd64.tar.gz
cd frp_0.33.0_linux_amd64/
复制代码

服务端的配置文件是 frps.ini,默认绑定 7000 端口,若是购置了云服务器,注意打开 7000 端口。markdown

[common]
bind_port = 7000
复制代码

经过 fprs 二进制文件启动 frp 服务。网络

./frps -c ./frps.ini
复制代码

以下提示便是安装成功。ssh

2020/05/15 22:16:29 [I] [service.go:178] frps tcp listen on 0.0.0.0:7000
2020/05/15 22:16:29 [I] [root.go:209] start frps success
2020/05/15 22:16:38 [I] [service.go:432] [e3c5096bd4291972] client login info: ip [14.114.230.168:44422] version [0.24.1] hostname [] os [linux] arch [amd64]
2020/05/15 22:16:38 [I] [tcp.go:63] [e3c5096bd4291972] [ssh] tcp proxy listen port [7001]
2020/05/15 22:16:38 [I] [control.go:445] [e3c5096bd4291972] new proxy [ssh] success
复制代码

客户端安装配置

把本身的破电脑拿出来,以一样的方式下载 frp。

wget https://github.com/fatedier/frp/releases/download/v0.33.0/frp_0.33.0_linux_amd64.tar.gz
tar zxvf frp_0.33.0_linux_amd64.tar.gz
cd frp_0.33.0_linux_amd64/
复制代码

客户端的配置文件是 frpc.ini。

[common]
server_addr = 127.0.0.1
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
复制代码

common 为通用配置

  • server_addr 为公网服务器 IP 地址
  • server_port 为公网服务器配置的 7000 端口

ssh 用于终端命令行访问

  • type 链接类型,默认为 tcp
  • local_ip 本地 IP
  • local_port 用于 ssh 的端口号,默认 22
  • remote_port 映射的服务端端口,访问该端口时默认转发到客户端的 22 端口

启动客户端进程

./frpc -c ./frpc.ini
复制代码

若有如下提示则表明与服务端链接成功

2020/05/15 22:34:49 [I] [service.go:282] [9bc650122a538aab] login to server success, get run id [9bc650122a538aab], server udp port [0]
2020/05/15 22:34:49 [I] [proxy_manager.go:144] [9bc650122a538aab] proxy added: [ssh]
2020/05/15 22:34:49 [I] [control.go:179] [9bc650122a538aab] [ssh] start proxy success
复制代码

测试

启动完成后就能够经过 ssh 链接到内网服务器了。

ssh -p 6000 enoch@xxx.xx.xxx.xxx
复制代码

原文首发连接:pingyeaa.com/2020/05/13/…


我是平也,这有一个专一Gopher技术成长的开源项目「go home」


感谢你们的观看,若是以为文章对你有所帮助,欢迎关注公众号「平也」,聚焦Go语言与技术原理。

关注我