内网穿透介绍

互联网上两个不同的主机进行通信首先需要知道对方IP。根据IP协议,只有分配了公网IP的设备才能在互联网上通信和传输数据。而中国人口/设备众多,分配到的IPv4资源又少,因此绝大部分情况是通过路由器/交换机转换公网IP后才上网。

位于路由器/交换机后的设备一般是内网设备,分配的IP地址以192.168/172.16/10.0开头,属于内网IP。要让内网设备对外提供服务,就需要进行内网穿透。

注意:内网穿透和内网渗透仅有一字之差,但两者是完全不同的概念。内网渗透属于安全领域,指的是通过技术手段攻入(企业)内网,进而控制内网设备。

frp介绍

frp 是一个开源、简洁易用、高性能的内网穿透和反向代理软件,支持 tcp, udp, http, https等协议。

frp 项目官网是 https://github.com/fatedier/frp,中文官方文档地址:https://github.com/fatedier/frp/blob/master/README_zh.md。除了安装过程,中文文档对使用过程已经介绍的非常详细,如遇到问题,建议先查看官方文档。

frp工作原理为:

  1. 服务端运行,监听一个主端口,等待客户端的连接;
  2. 客户端连接到服务端的主端口,同时告诉服务端要监听的端口和转发类型;
  3. 服务端fork新的进程监听客户端指定的端口;
  4. 外网用户连接到客户端指定的端口,服务端通过和客户端的连接将数据转发到客户端;
  5. 客户端进程再将数据转发到本地服务,从而实现内网对外暴露服务的能力。

其他内网穿透工具

除了开源的frp,本人所知还有如下内网穿透/远控工具:

  • ngrok:ngrok 也是很知名的内网穿透工具,自从2.x版本不再开源,名气在下降。ngrok官网也提供免费穿透隧道,但国内连接速度较慢。NATAPP、Sunny-Ngrok等工具基于ngrok二次开发而来;
  • ZeroTier:号称零配置的内网穿透工具,提供与企业 SDN 交换机同等的高级网络虚拟化和管理功能,可以跨本地和广域网连接任何设备和程序。然而由于ZeroTier的服务器在国外,国内连接速度经常很感人,需要自行搭建Moon来解决;
  • V2ray:V2ray是一个功能强大的网络平台,提供代理、反向代理、内网穿透等功能。本站之前已有V2ray相关资源: V2ray教程V2ray高级教程:流量伪装V2ray客户端下载
  • 花生壳/向日葵:相信大部分折腾过路由器的人都听说过花生壳DDNS,可能也知道向日葵远控软件。花生壳和向日葵是贝锐科技旗下的产品,注册账户后可免费体验内网穿透功能;
  • TeamViewer:TeamViewer是国内外知名的远程控制、远程会议软件,额外提供文件上传下载等实用功能,比QQ远程协助好用一万遍。虽然个人版免费,但是现在TeamViewer商业化道路一去不复往,用起来越来越恶心,本人现在已经很少用;
  • SAKURA FRP:基于frp的免费内网穿透工具,也有收费服务。对于这家的行为,网民褒贬不一。如果你没有自己的服务器,可以尝试一下这家。

个人认为,如果有外网服务器(建议使用性价比高的国内NAT VPS),frp是最好的选择。如果只想远程控制一下电脑,TeamViewer就可以TeamViewer现在强制用户注册才能远程连接,本人已经放弃这个软件。

下面介绍frp内网穿透教程。

frp内网穿透教程

frp分服务端和客户端,本节分别做介绍。

部署frp服务端

服务端建议部署在国内VPS、国内NAT VPS国外CN2 GIA VPS上,以提供良好的访问体验。

1. 打开 frp下载页面,下载最新版的 frp_0.33.0_linux_amd64.tar.gz,然后上传到服务器(,也可以ssh连接到服务器后用wget下载:

wget https://github.com/fatedier/frp/releases/download/v0.33.0/frp_0.33.0_linux_amd64.tar.gz

绝大部分服务器系统都是64位,因此本教程直接让你下载amd64的压缩包。如果你用的树莓派等特殊服务器,请换成相应架构的安装包。

2. 服务器上解压安装包:tar -zxvf frp_0.33.0_linux_amd64.tar.gz

3. 进入解压后的目录:cd frp_0.33.0_linux_amd64,然后用vim/nano等编辑器编辑frps.ini文件(可以下载到本地,编辑好后再上传上去),填入下面的内容:

[common]
# frp监听的端口,默认是7000,可以改成其他的
bind_port = 7000
# 授权码,请改成更复杂的
token = 12345678

# frp管理后台端口,请按自己需求更改
dashboard_port = 7500
# frp管理后台用户名和密码,请改成自己的
dashboard_user = admin
dashboard_pwd = admin
enable_prometheus = true

# frp日志配置
log_file = /var/log/frps.log
log_level = info
log_max_days = 3

4. 设置和启动frp服务:

mkdir -p /etc/frp
cp frps.ini /etc/frp
cp frps /usr/bin
cp systemd/frps.service /usr/lib/systemd/system/
systemctl enable frps
systemctl start frps

注意:这些命令执行成功的前提是进入了解压后的frp目录下(黑窗口执行过cd frp_0.33.0_linux_amd64命令)

5. 防火墙放行端口:

# 添加监听端口
firewall-cmd --permanent --add-port=7000/tcp
# 添加管理后台端口
firewall-cmd --permanent --add-port=7500/tcp
firewall-cmd --reload

注意:

1. 如果是ubuntu或者centos 6,请使用ufw/iptables工具放行端口;

2. 7000和7500两个端口记得改成和frps.ini配置的一样

6. 浏览器打开“http://服务器IP:后台管理端口” ,输入用户名和密码可以查看连接状态:

frp管理后台
frp管理后台

如果用的NAT VPS,端口应改成映射后的公网端口

服务端配置好后,接下来介绍客户端配置。

配置frp客户端

1. 还是打开 frp下载页面,下载最新版的客户端。根据客户端平台不同,请按照下面对应关系下载:

2. 解压缩下载的压缩包,进入文件夹内;

3. 编辑frpc.ini,按照自己的需求设置转发。下面是一个示例:

# 服务端配置
[common]
server_addr = 服务器ip
# 请换成设置的服务器端口
server_port = 7000
token = 12345678

# 配置ssh服务
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 自定义的远程服务器端口,例如2222

# 配置http服务,可用于小程序开发、远程调试等
[web]
type = http
local_ip = 127.0.0.1
local_port = 8080
subdomain = test.abc.com
remote_port = 自定义的远程服务器端口,例如8080

注意:

1. 一个服务端可以同时给多个客户端使用

2. [ssh]这样的名称必须全局唯一,即就算有多个客户端,也只能使用一次,其他的可以用[ssh2]、[ssh3]等;

3. 除了type为http/https,端口只能被一个服务使用

4. 如果用的nat vps,remote_port请改成映射后的端口

4. 登录服务器,防火墙放行监听的端口:

firewall-cmd --permanent --add-port=2222/tcp
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload

nat vps放行的端口应该是系统内部端口

5. 接下来以windows为例,介绍运行方法:按“win键 + r”(win键是ctrl和alt中间有windows图标的那个按键)-》输入cmd、回车 -》使用cd命令进入解压文件夹,例如 cd Desktop\frp_0.33.0_windows_amd64(切换到其他分区,例如D盘,请使用 cd /d d: 的形式) -》 ./frpc.exe -c frpc.ini

内网的linux机器,可参考服务端的方式部署成服务并设置开机启动

6. 登录frp管理后台,应该可以看到客户端已经连上来了:

frp查看客户端连接
frp查看客户端连接

总结

frp是一款非常棒的开源、免费的内网穿透工具,对于有vps的网友,建议使用frp部署内网穿透服务,从而远程访问内网的设备和数据。

参考

  1. 使用frp转发内网端口
  2. ssh端口转发的三种方式
  3. ssh端口转发实现内网穿透