从公网中访问自己的私有设备向来是一件难事儿。
自己的主力台式机、NAS等等设备,它们可能处于路由器后,或者运营商因为IP地址短缺不给你分配公网IP地址。如果我们想直接访问到这些设备(远程桌面,远程文件,SSH等等),一般来说要通过一些转发或者P2P组网软件的帮助。
我有一台计算机位于一个很复杂的局域网中,我想要实现远程桌面和文件访问,目前来看其所处的网络环境很难通过简单的端口映射将其暴露在公网之中,我试过这么几种方法:
nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还支持内网http代理、内网socks5代理、p2p等,并带有功能强大的web管理端。
一台有公网IP的服务器(VPS)运行服务端(NPS)
官网:https://github.com/ehang-io/nps/releases
EW 是一套便携式的网络穿透工具,具有 SOCKS v5服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透。但是,现在工具已经不更新了。。。
- 轻量级,C语言编写
- 可以设置多级代理
- 跨平台
- 但是只支持Socks5代理
官网:http://rootkiter.com/EarthWorm/
ngrok 是一个反向代理,通过在公共端点和本地运行的 Web 服务器之间建立一个安全的通道,实现内网主机的服务可以暴露给外网。ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放,所以ngrok可以很方便地协助服务端程序测试。
- 官方维护,一般较为稳定
- 跨平台,闭源
- 有流量记录和重发功能
官网:https://ngrok.com/
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
- 客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。
- 端口复用,多个服务通过同一个服务端端口暴露。
- 跨平台,但是支持的比nps少一点
- 多种插件,提供很多功能,并且完全开源
这也是本文介绍的重点!
https://github.com/fatedier/frp/releases
服务端解压:
这里用到了宝塔管理面板,更傻瓜的操作linux。这步也可用命令操作。
[common]
bind_port = 7000 # (frp服务端的端口,记得要开放此端口)
token = xxxxxxx # (你自己设置的token密钥)
dashboard_user = admin # (可选。frp管理控制台的账号)
dashboard_pwd = xxxxxx # (可选。frp管理控制台账号的密码)
dashboard_port = 7500 # (可选。frp管理控制台的端口)
直接启动
(在解压文件目录下)
# 启动(终端关闭就会结束)
./frps -c ./frps.ini
# 后台启动
nohup ./frps -c frps.ini &
使用systemctl来控制frp的启动
vi /lib/systemd/system/frps.service
[Unit]
Description=frps service
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
ExecStart=/root/frp/frps/frps -c /root/frp/frps/frps.ini
[Install]
WantedBy=multi-user.target
systemctl enable frps #设置开机自动启动
systemctl disable frps #取消开机自动启动
systemctl start frps #开启frps服务
systemctl stop frps #关闭frps服务
systemctl restart frps #重启frps服务
用做临时给前端测试(8088是本地springboot跑起来的端口)
[common]
server_addr = xxx.xxx.xx.xx # (你的服务器外网ip)
server_port = 7000 # (frp服务端的端口,记得要开放此端口)
token = 949526365a # (你自己设置的token密钥,与服务端设置的一样)
[pro16]
type = tcp
local_ip = 127.0.0.1
local_port = 8088
remote_port = 6001
# 接口访问 xxx.xxx.xx.xx:6001/...
用作远程连接配置(3389是windows远程连接的端口)
[common]
server_addr = 8.129.130.21
server_port = 7000
token = 949526365a
[jia]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 6000
frpc.exe -c .\frpc.ini
start.bat
@echo off
if "%1" == "h" goto begin
mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit
:begin
REM
frpc.exe -c .\frpc.ini
把上述start.bat
文件复制到
C:\Users\Administrator(用户名)\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
所有线程:ps aux
查看frp应用:ps -aux | grep frps
杀死端口:kill -9 端口号
某端口信息:lsof -i:8080