利用frp进行内网穿透

利用frp进行内网穿透

前言

文章同步更新至:http://www.riba2534.cn/?p=427

首先,我们有时候会遇到这么一个需求,假设学校(公司)有一台不关机的服务器,但是仅仅在校园网(公司内网)可以访问,但是放暑假,你可能回家,但是你又需要在学校的服务器上进行一些操作,那么现在的需求就是:如何在家里通过SSH连接到学校(公司)的电脑?

基础知识

因为有这个问题,于是我们现在需要进行的就是内网穿透,根据维基百科的定义:

计算机科学中,NAT穿越(NAT traversal)涉及TCP/IP网络中的一个常见问题,即在处于使用了NAT设备的私有TCP/IP网络中的主机之间建立连接的问题。

会遇到这个问题的通常是那些客户端网络交互应用程序的开发人员,尤其是在对等网络VoIP领域中。IPsec VPN客户普遍使用NAT-T来达到使ESP包通过NAT的目的。

尽管有许多穿越NAT的技术,但没有一项是完美的,这是因为NAT的行为是非标准化的。这些技术中的大多数都要求有一个公共服务器,而且这个服务器使用的是一个众所周知的、从全球任何地方都能访问得到的IP地址。一些方法仅在建立连接时需要使用这个服务器,而其它的方法则通过这个服务器中继所有的数据——这就引入了带宽开销的问题。

两种常用的NAT穿越技术是:UDP路由验证STUN。除此之外,还有TURNICEALG,以及SBC

简单的来说内网穿透就是NAT穿透,在处于使用了NAT设备私有TCP/IP网络中的主机之间建立连接的问题。通过映射端口,让外网的电脑找到处于内网的电脑。

frp介绍

那么具体应该怎么做呢,因为有两台处于局域网内的主机需要连接,那么肯定无法直接连接,我们需要一个具有公网ip的VPS,通过VPS来进行隧道的搭建,现在可以搭建内网穿透的服务有很多,比如ngrok,但是就我们需要的这个服务而言,有一个神器,就是frp,通过几步简单的配置就可以实现我们所需要的功能.
项目github地址:https://github.com/fatedier/frp
首先看一看frp的官方介绍:

frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。

作用:

  • 利用处于内网或防火墙后的机器,对外网环境提供 http 或 https 服务。
  • 对于 http, https 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口。
  • 利用处于内网或防火墙后的机器,对外网环境提供 tcp 和 udp 服务,例如在家里通过 ssh 访问处于公司内网环境内的主机。

《利用frp进行内网穿透》

原理是在vps上面开启一个服务端,在学校主机上面开启一个客户端,服务端上开启一个端口一直保持监听,客户端一直连接服务端的这个端口,这样C和B之间就有了一个隧道,可以互相传递信息,我们只需要在A上通过ssh连接到C的特定端口就可以找到主机B,这样就实现了内网穿透.

操作及步骤

测试环境:

  • ubuntu18.04 LTS

第一步:

因为frp是用go语言开发的,我们首先需要进行安装go语言支持:

sudo apt update
sudo apt install golang -y

虽然安装的go语言版本不是很高,但足够内网穿透使用,使用源码安装的方式相对麻烦一点。

第二步:

获取frp的相关文件,我们可以从github上面的项目releases上面获得:

首先,自己找一个目录,然后执行以下命令:

wget https://github.com/fatedier/frp/releases/download/v0.20.0/frp_0.20.0_linux_amd64.tar.gz
tar -zxvf frp_0.20.0_linux_amd64.tar.gz
cd frp_0.20.0_linux_amd64

这时,你会看到以下文件:

.
├── frpc          #客户端
├── frpc_full.ini 
├── frpc.ini      #客户端配置文件
├── frps          #服务端
├── frps_full.ini
├── frps.ini      #服务端配置文件
└── LICENSE

第三步:

frpsfrps.ini 放到具有公网 IP 的机器上。

frpcfrpc.ini 放到处于内网环境的机器上。

  1. 修改 frps.ini 文件,这里使用了最简化的配置:
# frps.ini
[common]
bind_port = 7000
  1. 启动 frps:
./frps -c ./frps.ini
  1. 修改 frpc.ini 文件,假设 frps 所在服务器的公网 IP 为 x.x.x.x;
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000

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

启动 frpc:

./frpc -c ./frpc.ini

通过 ssh 访问内网机器,假设用户名为 test:

ssh -oPort=6000 test@x.x.x.x
点赞

发表评论

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