Musixal/Backhaul
GitHub: Musixal/Backhaul
Backhaul是一款高性能的反向隧道解决方案,用于NAT和防火墙限制下的NAT穿透。
Stars: 834 | Forks: 148
# 回程
欢迎来到 **`Backhaul`** 项目!本项目提供了一种高性能的反向隧道解决方案,针对通过NAT和防火墙处理大量并发连接进行了优化。本README将指导您设置和配置服务器和客户端组件,包括不同传输协议的详细信息。
## 目录
1. [简介](#introduction)
2. [功能](#features)
3. [安装](#installation)
4. [使用](#usage)
- [配置选项](#configuration-options)
- [详细配置](#detailed-configuration)
- [TCP配置](#tcp-configuration)
- [TCP多路复用配置](#tcp-multiplexing-configuration)
- [UDP配置](#udp-configuration)
- [WebSocket配置](#websocket-configuration)
- [安全WebSocket配置](#secure-websocket-configuration)
- [WS多路复用配置](#ws-multiplexing-configuration)
- [WSS多路复用配置](#wss-multiplexing-configuration)
5. [使用OpenSSL生成自签名TLS证书](#generating-a-self-signed-tls-certificate-with-openssl)
6. [以服务形式运行backhaul](#running-backhaul-as-a-service)
7. [常见问题解答](#faq)
8. [基准测试](#benchmark)
9. [许可](#license)
10. [捐赠](#donation)
## 简介
本项目提供了一种强大的反向隧道解决方案,以克服NAT和防火墙限制,支持各种传输协议。它旨在实现高效率和并发性。
## 功能
* **高性能**:针对处理大量并发连接进行了优化。
* **协议灵活性**:支持TCP、WebSocket(WS)和安全WebSocket(WSS)传输。
* **UDP over TCP**:在TCP连接上实现UDP流量封装和转发,以实现可靠的交付并内置拥塞控制。
* **多路复用**:通过SMUX在单个传输上启用多个连接。
* **NAT & 防火墙绕过**:通过反向隧道克服限制。
* **流量嗅探**:可选的网络流量监控,支持日志记录。
* **可配置的保活**:可调整保活和心跳间隔以保持稳定连接。
* **TLS加密**:通过WSS提供安全连接,支持自定义TLS证书。
* **Web界面**:通过轻量级Web界面进行实时监控。
* **热重载配置**:支持动态配置重载,无需重启服务器。
## 安装
1. **从GitHub发行版页面**下载最新版本。
2. **解压缩存档**(如果需要,调整`filename`):
tar -xzf backhaul_linux_amd64.tar.gz
3. **运行可执行文件**:
./backhaul
4. 如果您更喜欢从源代码构建,请执行以下操作:
git clone https://github.com/musixal/backhaul.git
cd backhaul
go build
./backhaul
## 使用
本项目的主要可执行文件是`backhaul`。它需要TOML配置文件来配置服务器和客户端组件。
### 配置选项
要开始使用此解决方案,您需要配置服务器和客户端组件。以下是设置基本配置的方法:
* **服务器配置**
创建一个名为`config.toml`的配置文件:
[server]# 本地,伊朗
bind_addr = "0.0.0.0:3080" # 服务器监听的地址和端口(必需)。
transport = "tcp" # 要使用的协议("tcp"、"tcpmux"、"ws"、"wss"、"wsmux"、"wssmux"。必需)。
accept_udp = false # 启用通过TCP传输传输UDP连接。(可选,默认:false)
token = "your_token" # 用于安全通信的认证令牌(可选)。
keepalive_period = 75 # 发送保活数据包的间隔(秒)(可选,默认:75s)
nodelay = false # 启用TCP_NODELAY(可选,默认:false)。
channel_size = 2048 # 隧道和本地通道大小。超出连接将被丢弃。(可选,默认:2048)。
heartbeat = 40 # 以秒为单位。隧道稳定性的ping间隔。最小:1s。(可选,默认:40s)
mux_con = 8 # Mux并发。可以复用到单个流中的连接数(可选,默认:8)。
mux_version = 1 # SMUX协议版本(1或2)。版本2可能具有额外功能。(可选)
mux_framesize = 32768 # 32 KB。可以发送到连接的帧的最大大小。(可选)
mux_recievebuffer = 4194304 # 4 MB。每个连接的传入数据的最大缓冲区大小。(可选)
mux_streambuffer = 65536 # 256 KB。连接中单个流的最大缓冲区大小。(可选)
sniffer = false # 启用或禁用网络嗅探以监控数据。(可选,默认 false)
web_port = 2060 # Web界面或监控界面的端口号(可选,设置为0以禁用)。
sniffer_log ="/root/log.json" # 用于存储网络流量和使用数据日志的文件名(可选,默认 backhaul.json)
tls_cert = "/root/server.crt" # wss/wssmux的TLS证书文件路径(必需)。
tls_key = "/root/server.key" # wss/wssmux的TLS私钥文件路径(必需)。
log_level = "info" # 日志级别("panic"、"fatal"、"error"、"warn"、"info"、"debug"、"trace",可选,默认:"info")。
skip_optz = true # 跳过Backhaul执行的优化(默认:false)
mss = 1360 # TCP/TCPMux:最大段大小(字节);控制TCP有效负载大小以避免分段。(默认:系统定义)
so_rcvbuf = 4194304 # TCP/TCPMux:套接字接收缓冲区大小(字节);更大的缓冲区允许在接收端更高的吞吐量。(默认:系统定义)
so_sndbuf = 1048576 # TCP/TCPMux:套接字发送缓冲区大小(字节);控制发送队列大小以管理外出数据流。(默认:系统定义)
ports = [
"443-600", # 监听443到600范围内的所有端口
"443-600:5201", # 监听443到600范围内的所有端口并将流量转发到5201
"443-600=1.1.1.1:5201", # 监听443到600范围内的所有端口并将流量转发到1.1.1.1:5201
"443", # 监听本地端口443并转发到远程端口443(默认转发)。
"4000=5000", # 监听本地端口4000(绑定到所有本地IP)并转发到远程端口5000。
"127.0.0.2:443=5201", # 绑定到特定本地IP(127.0.0.2),监听端口443,并转发到远程端口5201。
"443=1.1.1.1:5201", # 监听本地端口443并转发到特定远程IP(1.1.1.1)的端口5201。
"127.0.0.2:443=1.1.1.1:5201", # 绑定到特定本地IP(127.0.0.2),监听端口443,并转发到远程IP(1.1.1.1)的端口5201。
]
要启动`server`:
./backhaul -c config.toml
* **客户端配置**
为客户端创建一个名为`config.toml`的配置文件:
[client] # 位于NAT后面,被防火墙阻止
remote_addr = "0.0.0.0:3080" # 服务器地址和端口(必需)。
edge_ip = "188.114.96.0" # 用于CDN连接的边缘IP,特别是用于基于WebSocket的传输。(可选,默认 none)
transport = "tcp" # 要使用的协议("tcp"、"tcpmux"、"ws"、"wss"、"wsmux"、"wssmux"。必需)。
token = "your_token" # 用于安全通信的认证令牌(可选)。
connection_pool = 8 # 预建立连接的数量。(可选,默认:8)。
aggressive_pool = false # 启用积极的连接池管理。(可选,默认:false)。
keepalive_period = 75 # 发送保活数据包的间隔(秒)。(可选,默认:75s)
nodelay = false # 使用TCP_NODELAY(可选,默认:false)。
retry_interval = 3 # 重试间隔(秒)(可选,默认:3s)。
dial_timeout = 10 # 设置建立网络连接的最大等待时间。(可选,默认:10s)
mux_version = 1 # SMUX协议版本(1或2)。版本2可能具有额外功能。(可选)
mux_framesize = 32768 # 32 KB。可以发送到连接的帧的最大大小。(可选)
mux_recievebuffer = 4194304 # 4 MB。每个连接的传入数据的最大缓冲区大小。(可选)
mux_streambuffer = 65536 # 256 KB。连接中单个流的最大缓冲区大小。(可选)
sniffer = false # 启用或禁用网络嗅探以监控数据。(可选,默认 false)
web_port = 2060 # Web界面或监控界面的端口号(可选,设置为0以禁用)。
sniffer_log ="/root/log.json" # 用于存储网络流量和使用数据日志的文件名(可选,默认 backhaul.json)
log_level = "info" # 日志级别("panic"、"fatal"、"error"、"warn"、"info"、"debug"、"trace",可选,默认:"info")。
skip_optz = true # 跳过Backhaul执行的优化(默认:false)
mss = 1360 # TCP/TCPMux:最大段大小(字节);控制TCP有效负载大小以避免分段。(默认:系统定义)
so_rcvbuf = 1048576 # TCP/TCPMux:套接字接收缓冲区大小(字节);更大的缓冲区允许在接收端更高的吞吐量。(默认:系统定义)
so_sndbuf = 4194304 # TCP/TCPMux:套接字发送缓冲区大小(字节);控制发送队列大小以管理外出数据流。(默认:系统定义)
要启动`client`:
./backhaul -c config.toml
### 详细配置
#### TCP配置
* **服务器**:
[server]
bind_addr = "0.0.0.0:3080"
transport = "tcp"
accept_udp = false
token = "your_token"
keepalive_period = 75
nodelay = true
heartbeat = 40
channel_size = 2048
sniffer = false
web_port = 2060
sniffer_log = "/root/backhaul.json"
log_level = "info"
ports = []
* **客户端**:
[client]
remote_addr = "0.0.0.0:3080"
transport = "tcp"
token = "your_token"
connection_pool = 8
aggressive_pool = false
keepalive_period = 75
dial_timeout = 10
nodelay = true
retry_interval = 3
sniffer = false
web_port = 2060
sniffer_log = "/root/backhaul.json"
log_level = "info"
* **详细信息**:
`remote_addr`:客户端连接到的服务器的IPv4、IPv6或域名地址。
`token`:用于在隧道内安全验证和认证客户端和服务器之间连接的认证令牌。
`channel_size`:从服务器到客户端转发数据包的队列大小。如果超出限制,则丢弃数据包。
`connection_pool`:设置预建立连接的数量,以获得更好的延迟。
`nodelay`:指TCP套接字选项(TCP_NODELAY),它提高了延迟但降低了带宽
#### TCP多路复用配置
* **服务器**:
[server]
bind_addr = "0.0.0.0:3080"
transport = "tcpmux"
token = "your_token"
keepalive_period = 75
nodelay = true
heartbeat = 40
channel_size = 2048
mux_con = 8
mux_version = 1
mux_framesize = 32768
mux_recievebuffer = 4194304
mux_streambuffer = 65536
sniffer = false
web_port = 2060
sniffer_log = "/root/backhaul.json"
log_level = "info"
ports = []
* **客户端**:
[client]
remote_addr = "0.0.0.0:3080"
transport = "tcpmux"
token = "your_token"
connection_pool = 8
aggressive_pool = false
keepalive_period = 75
dial_timeout = 10
retry_interval = 3
nodelay = true
mux_version = 1
mux_framesize = 32768
mux_recievebuffer = 4194304
mux_streambuffer = 65536
sniffer = false
web_port = 2060
sniffer_log = "/root/backhaul.json"
log_level = "info"
* **详细信息**:
`mux_session`:多路复用会话的数量。如果需要处理单个连接上的更多并发会话,请增加此值。
* 参考TCP配置以获取更多信息。
#### UDP配置
* **服务器**:
[server]
bind_addr = "0.0.0.0:3080"
transport = "udp"
token = "your_token"
heartbeat = 20
channel_size = 2048
sniffer = false
web_port = 2060
sniffer_log = "//backhaul.json"
log_level = "info"
ports = []
* **客户端**:
[client]
remote_addr = "0.0.0.0:3080"
transport = "udp"
token = "your_token"
connection_pool = 8
aggressive_pool = false
retry_interval = 3
sniffer = false
web_port = 2060
sniffer_log = "/root/backhaul.json"
log_level = "info"
#### WebSocket配置
* **服务器**:
[server]
bind_addr = "0.0.0.0:8080"
transport = "ws"
token = "your_token"
channel_size = 2048
keepalive_period = 75
heartbeat = 40
nodelay = true
sniffer = false
web_port = 2060
sniffer_log = "/root/backhaul.json"
log_level = "info"
ports = []
* **客户端**:
[client]
remote_addr = "0.0.0.0:8080"
edge_ip = ""
transport = "ws"
token = "your_token"
connection_pool = 8
aggressive_pool = false
keepalive_period = 75
dial_timeout = 10
retry_interval = 3
nodelay = true
sniffer = false
web_port = 2060
sniffer_log = "/root/backhaul.json"
log_level = "info"
* **详细信息**:
* 参考TCP配置以获取更多信息。
#### 安全WebSocket配置
* **服务器**:
[server]
bind_addr = "0.0.0.0:8443"
transport = "wss"
token = "your_token"
channel_size = 2048
keepalive_period = 75
nodelay = true
tls_cert = "/root/server.crt"
tls_key = "/root/server.key"
sniffer = false
web_port = 2060
sniffer_log = "/root/backhaul.json"
log_level = "info"
ports = []
* **客户端**:
[client]
remote_addr = "0.0.0.0:8443"
edge_ip = ""
transport = "wss"
token = "your_token"
connection_pool = 8
aggressive_pool = false
keepalive_period = 75
dial_timeout = 10
retry_interval = 3
nodelay = true
sniffer = false
web_port = 2060
sniffer_log = "/root/backhaul.json"
log_level = "info"
* **详细信息**:
* 参考下一节以获取生成`tls_cert`和`tls_key`的说明。
#### WS多路复用配置
* **服务器**:
[server]
bind_addr = "0.0.0.0:3080"
transport = "wsmux"
token = "your_token"
keepalive_period = 75
nodelay = true
heartbeat = 40
channel_size = 2048
mux_con = 8
mux_version = 1
mux_framesize = 32768
mux_recievebuffer = 4194304
mux_streambuffer = 65536
sniffer = false
web_port = 2060
sniffer_log = "/root/backhaul.json"
log_level = "info"
ports = []
* **客户端**:
[client]
remote_addr = "0.0.0.0:3080"
edge_ip = ""
transport = "wsmux"
token = "your_token"
connection_pool = 8
aggressive_pool = false
keepalive_period = 75
dial_timeout = 10
nodelay = true
retry_interval = 3
mux_version = 1
mux_framesize = 32768
mux_recievebuffer = 4194304
mux_streambuffer = 65536
sniffer = false
web_port = 2060
sniffer_log = "/root/backhaul.json"
log_level = "info"
#### WSS多路复用配置
* **服务器**:
[server]
bind_addr = "0.0.0.0:443"
transport = "wssmux"
token = "your_token"
keepalive_period = 75
nodelay = true
heartbeat = 40
channel_size = 2048
mux_con = 8
mux_version = 1
mux_framesize = 32768
标签:DNS解析, EVTX分析, NAT穿透, SMUX, TCPMUX, TCP协议, UDP协议, WebSocket, WSS, 依赖分析, 内核驱动, 反向隧道, 安全隧道, 底层编程, 开源项目, 性能优化, 日志审计, 检测绕过, 系统架构, 网络优化, 网络传输, 网络协议, 网络安全, 网络工具, 网络性能, 网络编程, 网络解决方案, 网络设计, 网络连接, 网络通信, 网络配置, 网络隧道, 软件开发, 防火墙绕过, 隐私保护, 高并发连接