内网穿透介绍
互联网上两个不同的主机进行通信首先需要知道对方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,本人所知还有如下内网穿透/远控工具:
- ngrok:ngrok 也是很知名的内网穿透工具,自从2.x版本不再开源,名气在下降。ngrok官网也提供免费穿透隧道,但国内连接速度较慢。NATAPP、Sunny-Ngrok等工具基于ngrok二次开发而来;
- ZeroTier:号称零配置的内网穿透工具,提供与企业 SDN 交换机同等的高级网络虚拟化和管理功能,可以跨本地和广域网连接任何设备和程序。然而由于ZeroTier的服务器在国外,国内连接速度经常很感人,需要自行搭建Moon来解决;
- 花生壳/向日葵:相信大部分折腾过路由器的人都听说过花生壳DDNS,可能也知道向日葵远控软件。花生壳和向日葵是贝锐科技旗下的产品,注册账户后可免费体验内网穿透功能;
- TeamViewer:TeamViewer是国内外知名的远程控制、远程会议软件,额外提供文件上传下载等实用功能,比QQ远程协助好用一万遍。虽然个人版免费,但是现在TeamViewer商业化道路一去不复往,用起来越来越恶心,本人现在已经很少用;
- SAKURA FRP:基于frp的免费内网穿透工具,也有收费服务。对于这家的行为,网民褒贬不一。如果你没有自己的服务器,可以尝试一下这家。
个人认为,如果有外网服务器(包括NAT VPS),frp是最好的选择。如果只想远程控制一下电脑,TeamViewer就可以。
下面介绍frp内网穿透教程。
frp内网穿透教程
frp分服务端和客户端,本节分别做介绍。
部署frp服务端
服务端建议部署在国内VPS、国内NAT VPS、国外CN2 GIA VPS上,以提供良好的访问体验。
1. 打开 frp下载页面,下载最新版的 frp_0.33.0_linux_amd64.tar.gz
,然后上传到服务器(windows上传请参考:Bitvise连接Linux服务器教程,mac系统上传请参考:Mac电脑连接Linux教程),也可以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:后台管理端口” ,输入用户名和密码可以查看连接状态:
如果用的NAT VPS,端口应改成映射后的公网端口
服务端配置好后,接下来介绍客户端配置。
配置frp客户端
1. 首先还是打开 frp下载页面,下载最新版的客户端。根据客户端平台不同,请按照下面对应关系下载:
- windows系统:32位系统下载frp_0.33.0_windows_386.zip,64位系统下载 frp_0.33.0_windows_amd64.zip,如果不知道系统多少位,下载32位的总没错;
- mac系统:下载 frp_0.33.0_darwin_amd64.tar.gz;
- linux系统:32位系统下载 frp_0.33.0_linux_386.tar.gz,64位系统下载 frp_0.33.0_linux_amd64.tar.gz,不知道请下载32位的;
- 树莓派/路由器等:32位系统下载 frp_0.33.0_linux_arm.tar.gz,64位系统下载 frp_0.33.0_linux_arm64.tar.gz,如果不知道系统多少位,直接下载32位的。
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.hijk.pw 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是一款非常棒的开源、免费的内网穿透工具,对于有vps的网友,建议使用frp部署内网穿透服务,从而远程访问内网的设备和数据。