利用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穿透,在处于使用了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 访问处于公司内网环境内的主机。
原理是在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
第三步:
将 frps 及 frps.ini 放到具有公网 IP 的机器上。
将 frpc 及 frpc.ini 放到处于内网环境的机器上。
- 修改 frps.ini 文件,这里使用了最简化的配置:
# frps.ini
[common]
bind_port = 7000
- 启动 frps:
./frps -c ./frps.ini
- 修改 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
你好
嘿嘿