Thanks to visit codestin.com
Credit goes to github.com

Skip to content

jason-hue/NAT_Traversal

Repository files navigation

NAT 穿透工具

基于 Rust 开发的高性能、跨平台 NAT 穿透解决方案。本项目通过客户端-服务器架构,实现本地服务通过 NAT 防火墙的安全隧道连接。

功能特性

  • 跨平台支持: 支持 Windows 和 Linux 系统
  • 安全加密: 使用 TLS 1.3 加密通信和基于令牌的身份验证
  • 用户友好: 提供基于 egui 的图形界面和命令行支持
  • 高性能: 基于 tokio 的异步架构
  • 服务集成: 原生支持 Windows 服务和 Linux systemd
  • 灵活配置: 支持 TCP 隧道协议

系统架构

系统由四个主要组件构成:

  1. 服务器端 (server/): 运行在公网服务器上,管理客户端连接和端口转发
  2. 客户端 (client/): 运行在 NAT 后的本地机器,提供图形界面和命令行接口
  3. 通用库 (common/): 共享的协议、配置和加密功能
  4. 平台集成 (platform/): 跨平台服务和系统集成功能

快速开始

系统要求

  • Rust 1.70+
  • Linux: GTK3 开发库 (仅 GUI 版本需要)
  • Windows: 无额外依赖
  • 服务器端需要 TLS 证书(测试环境可使用自签名证书)

安装方法

  1. 克隆代码仓库
git clone https://github.com/yourusername/nat-traversal.git
cd nat-traversal
  1. 安装编译依赖

Linux (Ubuntu/Debian)

# 安装 Rust (如果未安装)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source ~/.bashrc

# 安装 GUI 依赖(可选,仅 GUI 版本需要)
sudo apt update
sudo apt install -y libgtk-3-dev libatk1.0-dev libcairo-gobject2 \
  libcairo2-dev libgdk-pixbuf2.0-dev libgio2.0-cil-dev \
  libglib2.0-dev libpango1.0-dev pkg-config

# 安装 Windows 交叉编译工具(可选)
sudo apt install gcc-mingw-w64-x86-64
rustup target add x86_64-pc-windows-gnu

Windows

# 安装 Rust (如果未安装)
# 从 https://rustup.rs/ 下载并运行安装程序

# 无需额外系统依赖,所有功能使用纯 Rust 实现
  1. 编译项目
# Linux 本地编译(包含 GUI)
cargo build --release

# Linux 编译无 GUI 版本
cargo build -p nat-traversal-client --no-default-features --release

# Windows 交叉编译(在 Linux 下)
cargo build --target x86_64-pc-windows-gnu --release

# Windows 本地编译(在 Windows 下)
cargo build --release

详细使用步骤

第一步:服务器端部署

1.1 生成配置文件

# Linux
./target/release/nat-server --generate-config

# Windows
./target/x86_64-pc-windows-gnu/release/nat-server.exe --generate-config
# 或者在 Windows 本地编译后
./target/release/nat-server.exe --generate-config

配置文件位置

  • Linux: ~/.config/nat-traversal/server.toml
  • Windows: %APPDATA%\nat-traversal\nat-traversal\server.toml

1.2 生成 TLS 证书

自签名证书(开发/测试环境)

# 方法1: 简单自签名证书
openssl genrsa -out server.key 2048
openssl req -new -x509 -key server.key -out server.crt -days 365 \
  -subj "/C=CN/ST=State/L=City/O=NAT-Traversal/CN=localhost"

# 方法2: 包含多域名/IP的证书(推荐)
cat > server.conf << EOF
[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no

[req_distinguished_name]
C = CN
ST = State  
L = City
O = NAT-Traversal
CN = localhost

[v3_req]
basicConstraints = CA:FALSE
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost
DNS.2 = your-server.com
IP.1 = 127.0.0.1
IP.2 = YOUR_SERVER_IP  # 替换为实际IP
EOF

openssl genrsa -out server.key 2048
openssl req -new -x509 -key server.key -out server.crt -days 365 -config server.conf

生产环境证书

  • 使用 Let's Encrypt:certbot certonly --standalone -d your-domain.com
  • 或购买 SSL 证书,将证书文件放到配置目录

证书验证

# 验证证书有效性
openssl x509 -in server.crt -text -noout

# 测试 TLS 连接
openssl s_client -connect localhost:7000

1.3 编辑服务器配置文件

编辑 server.toml

[network]
bind_addr = "0.0.0.0"          # 监听所有网络接口
port = 7000                    # 服务端口
max_connections = 1000         # 最大连接数

[tls]
# Linux 路径示例
cert_path = "/home/user/.config/nat-traversal/server.crt"
key_path = "/home/user/.config/nat-traversal/server.key"
# Windows 路径示例
# cert_path = "C:\\Users\\username\\AppData\\Roaming\\nat-traversal\\nat-traversal\\server.crt"
# key_path = "C:\\Users\\username\\AppData\\Roaming\\nat-traversal\\nat-traversal\\server.key"
verify_client = false

[auth]
tokens = ["your-secret-token-here"]  # 修改为强密码
require_auth = true
max_clients_per_token = 10

[limits]
max_tunnels_per_client = 10
max_connections_per_tunnel = 100
connection_timeout_secs = 300

[logging]
level = "info"
max_size_mb = 100
max_files = 5

1.4 启动服务器

# Linux
./target/release/nat-server

# Windows
./target/x86_64-pc-windows-gnu/release/nat-server.exe
# 或者在 Windows 本地编译后
./target/release/nat-server.exe

# 后台运行(Linux)
nohup ./target/release/nat-server > server.log 2>&1 &

# 使用 systemd 服务(Linux)
sudo cp nat-server.service /etc/systemd/system/
sudo systemctl enable nat-server
sudo systemctl start nat-server

第二步:客户端配置

2.1 生成配置文件

# Linux
./target/release/nat-client --generate-config

# Windows
./target/x86_64-pc-windows-gnu/release/nat-client.exe --generate-config
# 或者在 Windows 本地编译后
./target/release/nat-client.exe --generate-config

配置文件位置

  • Linux: ~/.config/nat-traversal/client.toml
  • Windows: %APPDATA%\nat-traversal\nat-traversal\client.toml

2.2 编辑客户端配置文件

编辑 client.toml

[server]
addr = "your-server.com"       # 服务器公网 IP 或域名
port = 7000                    # 服务器端口
token = "your-secret-token-here"  # 与服务器配置一致
client_id = "my-desktop"       # 客户端唯一标识
auto_reconnect = true          # 自动重连
reconnect_interval_secs = 30   # 重连间隔
tls_verify = true              # 验证 TLS 证书(生产环境建议开启)
                               # 开发环境使用自签名证书时设置为 false

[gui]
enabled = true                # 启用图形界面
start_minimized = false       # 启动时最小化
system_tray = true           # 显示系统托盘图标
theme = "dark"               # 界面主题

[logging]
level = "info"               # 日志级别
max_size_mb = 50            # 最大日志文件大小
max_files = 3               # 保留日志文件数量

# 隧道配置将通过 GUI 管理,或手动添加:
[[tunnels]]
name = "SSH Server"          # 隧道名称
local_port = 22             # 本地端口
remote_port = 2222          # 远程端口(可选,不指定则自动分配)
protocol = "Tcp"            # 协议类型
auto_start = true           # 启动时自动连接

2.3 启动客户端

GUI 模式

# Linux
./target/release/nat-client

# Windows
./target/x86_64-pc-windows-gnu/release/nat-client.exe
# 或者在 Windows 本地编译后
./target/release/nat-client.exe

命令行模式

# Linux
./target/release/nat-client --no-gui

# Windows
./target/x86_64-pc-windows-gnu/release/nat-client.exe --no-gui

调试模式

# 启用详细日志
RUST_LOG=debug ./target/release/nat-client

# Windows PowerShell
$env:RUST_LOG="debug"; ./target/release/nat-client.exe

第三步:隧道管理

3.1 使用 GUI 管理隧道

  1. 启动 GUI 客户端
  2. 在"连接配置"标签页确认服务器设置
  3. 点击"连接服务器"建立连接
  4. 在"隧道管理"标签页添加新隧道:
    • 隧道名称:例如 "SSH"
    • 本地端口:例如 22
    • 远程端口:例如 2222(可选)
    • 协议:TCP
  5. 点击"启动隧道"

3.2 常用隧道配置示例

SSH 远程连接

[[tunnels]]
name = "SSH"
local_port = 22
remote_port = 2222
protocol = "Tcp"
auto_start = true

Web 服务器

[[tunnels]]
name = "Web Server"
local_port = 8080
# remote_port 不指定,系统自动分配
protocol = "Tcp"
auto_start = false

远程桌面(Windows)

[[tunnels]]
name = "RDP"
local_port = 3389
remote_port = 13389
protocol = "Tcp"
auto_start = true

数据库连接

[[tunnels]]
name = "MySQL"
local_port = 3306
remote_port = 13306
protocol = "Tcp"
auto_start = false

第四步:连接测试

4.1 测试隧道连接

SSH 连接测试

# 通过隧道连接到本地机器
ssh [email protected] -p 2222

Web 服务测试

# 假设系统分配了端口 18080
curl http://your-server.com:18080

端口连通性测试

# Linux/Mac
telnet your-server.com 2222

# Windows
Test-NetConnection your-server.com -Port 2222

4.2 状态监控

查看服务器日志

# 实时查看日志
tail -f ~/.config/nat-traversal/server.log

# 检查错误
grep ERROR ~/.config/nat-traversal/server.log

查看客户端状态

  • GUI 模式:在状态栏查看连接状态
  • CLI 模式:查看控制台输出
  • 日志文件:~/.config/nat-traversal/client.log

第五步:生产部署

5.1 服务器端生产配置

使用 systemd 服务(Linux)

# 创建服务文件
sudo tee /etc/systemd/system/nat-server.service > /dev/null <<EOF
[Unit]
Description=NAT Traversal Server
After=network.target

[Service]
Type=simple
User=nat-server
WorkingDirectory=/opt/nat-traversal
ExecStart=/opt/nat-traversal/nat-server
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
EOF

# 启用并启动服务
sudo systemctl enable nat-server
sudo systemctl start nat-server
sudo systemctl status nat-server

防火墙配置

# UFW (Ubuntu)
sudo ufw allow 7000/tcp

# firewalld (CentOS/RHEL)
sudo firewall-cmd --permanent --add-port=7000/tcp
sudo firewall-cmd --reload

# iptables
sudo iptables -A INPUT -p tcp --dport 7000 -j ACCEPT

5.2 客户端自动启动

Windows 服务安装

# 使用 NSSM (Non-Sucking Service Manager)
nssm install "NAT Traversal Client" "C:\path\to\nat-client.exe"
nssm set "NAT Traversal Client" Parameters "--no-gui"
nssm start "NAT Traversal Client"

Linux systemd 用户服务

# 创建用户服务文件
mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/nat-client.service <<EOF
[Unit]
Description=NAT Traversal Client
After=network.target

[Service]
Type=simple
ExecStart=%h/.local/bin/nat-client --no-gui
Restart=always
RestartSec=10

[Install]
WantedBy=default.target
EOF

# 启用用户服务
systemctl --user enable nat-client
systemctl --user start nat-client

故障排除快速指南

连接失败

  1. 检查网络连通性:telnet server-ip 7000
  2. 验证证书配置:openssl s_client -connect server-ip:7000
  3. 检查防火墙设置
  4. 确认认证令牌正确

性能问题

  1. 检查服务器资源使用:htopiotop
  2. 调整连接限制配置
  3. 监控网络带宽使用

日志分析

# 启用调试日志
RUST_LOG=debug ./nat-server
RUST_LOG=debug ./nat-client --no-gui

# 查看特定模块日志
RUST_LOG=nat_traversal_server::tunnel=debug ./nat-server

配置文件详解

服务器配置 (server.toml)

服务器配置文件包含网络、TLS、认证和限制设置:

[network]
bind_addr = "0.0.0.0"        # 服务器绑定地址
port = 7000                  # 服务器监听端口
max_connections = 1000       # 最大连接数

[tls]
cert_path = "server.crt"     # TLS 证书路径
key_path = "server.key"      # TLS 私钥路径
verify_client = false        # 是否验证客户端证书

[auth]
tokens = ["secret-token"]    # 认证令牌列表
require_auth = true          # 是否需要认证
max_clients_per_token = 10   # 每个令牌最大客户端数

[limits]
max_tunnels_per_client = 10     # 每个客户端最大隧道数
max_connections_per_tunnel = 100 # 每个隧道最大连接数
connection_timeout_secs = 300    # 连接超时时间

[logging]
level = "info"               # 日志级别
max_size_mb = 100           # 最大日志文件大小
max_files = 5               # 保留日志文件数量

客户端配置 (client.toml)

客户端配置文件包含服务器连接、GUI和隧道设置:

[server]
addr = "your-server.com"     # 服务器地址
port = 7000                  # 服务器端口
token = "secret-token"       # 认证令牌
client_id = "client-001"     # 客户端标识
auto_reconnect = true        # 自动重连
reconnect_interval_secs = 30 # 重连间隔
tls_verify = true           # 验证 TLS 证书

[gui]
enabled = true              # 启用 GUI
start_minimized = false     # 启动时最小化
system_tray = true         # 系统托盘
theme = "dark"             # 界面主题

[logging]
level = "info"             # 日志级别
max_size_mb = 50          # 最大日志文件大小
max_files = 3             # 保留日志文件数量

# 隧道配置示例
tunnels = []               # 隧道列表 (由 GUI 管理)

使用场景示例

SSH 远程连接

配置 SSH 隧道实现远程访问:

[[tunnels]]
name = "SSH Server"
local_port = 22
remote_port = 2222
protocol = "Tcp"
auto_start = true

连接方式:

ssh [email protected] -p 2222

Web 服务器访问

暴露本地 Web 服务器:

[[tunnels]]
name = "Web Server"
local_port = 8080
auto_start = false  # 手动启动

服务器将自动分配端口,通过 GUI 查看分配的端口号。

远程桌面连接

Windows 远程桌面转发:

[[tunnels]]
name = "Remote Desktop"
local_port = 3389
remote_port = 13389
protocol = "Tcp"
auto_start = true

WSL + Windows 混合部署指南

这是一个流行的开发场景:在 WSL 中运行服务器,在 Windows 宿主机中运行客户端。

环境要求

  • Windows 10/11 with WSL2
  • WSL 中安装了 Rust 和编译工具
  • Windows 宿主机无需额外依赖

快速部署步骤

1. WSL 服务器端设置

# 在 WSL 中获取 IP 地址
WSL_IP=$(ip addr show eth0 | grep 'inet ' | awk '{print $2}' | cut -d'/' -f1)
echo "WSL IP: $WSL_IP"

# 安装交叉编译工具
sudo apt install gcc-mingw-w64-x86-64
rustup target add x86_64-pc-windows-gnu

# 生成服务器配置
cargo run --bin nat-server -- --generate-config

# 构建服务器
cargo build --bin nat-server --release

2. 配置服务器绑定到 WSL IP

编辑 ~/.config/nat-traversal/server.toml

[network]
bind_addr = "172.22.247.72"  # 替换为你的 WSL IP
port = 7000
max_connections = 1000

[tls]
cert_path = "/home/username/NAT_Traversal/server.crt"  # 使用绝对路径
key_path = "/home/username/NAT_Traversal/server.key"   # 使用绝对路径
verify_client = false

[auth]
tokens = ["secure-token-123"]  # 使用强密码
require_auth = true

3. 生成 WSL 兼容的证书

# 生成包含 WSL IP 的证书
cat > server-wsl.conf << EOF
[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no

[req_distinguished_name]
C = US
ST = State
L = City
O = NAT-Traversal
CN = localhost

[v3_req]
basicConstraints = CA:FALSE
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost
IP.1 = 127.0.0.1
IP.2 = $WSL_IP  # 你的 WSL IP
EOF

# 生成证书和密钥
openssl genrsa -out server.key 2048
openssl req -new -x509 -key server.key -out server.crt -days 365 -config server-wsl.conf

4. 交叉编译 Windows 客户端

# 编译 Windows 客户端
cargo build --target x86_64-pc-windows-gnu -p nat-traversal-client --release

# 生成客户端配置
cargo run --bin nat-client -- --generate-config

# 配置客户端连接到 WSL 服务器
sed -i "s/addr = .*/addr = \"$WSL_IP\"/" ~/.config/nat-traversal/client.toml
sed -i 's/tls_verify = true/tls_verify = false/' ~/.config/nat-traversal/client.toml
sed -i 's/token = "default-token"/token = "secure-token-123"/' ~/.config/nat-traversal/client.toml

5. 部署到 Windows

# 创建部署目录
mkdir -p /mnt/c/NAT-Traversal

# 复制文件到 Windows
cp ./target/x86_64-pc-windows-gnu/release/nat-client.exe /mnt/c/NAT-Traversal/
cp ~/.config/nat-traversal/client.toml /mnt/c/NAT-Traversal/

# 创建 Windows 批处理启动脚本
cat > /mnt/c/NAT-Traversal/start-client.bat << 'EOF'
@echo off
cd /d "%~dp0"
echo Starting NAT Traversal Client...
nat-client.exe --config client.toml
pause
EOF

# 创建 CLI 模式启动脚本
cat > /mnt/c/NAT-Traversal/start-client-cli.bat << 'EOF'
@echo off
cd /d "%~dp0"
echo Starting NAT Traversal Client (CLI mode)...
nat-client.exe --config client.toml --no-gui
pause
EOF

运行和测试

启动服务器 (WSL)

# 前台运行(调试模式)
./target/release/nat-server

# 后台运行
nohup ./target/release/nat-server > server.log 2>&1 &

# 检查服务器状态
ss -tlnp | grep 7000

启动客户端 (Windows)

REM 切换到部署目录
cd C:\NAT-Traversal

REM GUI 模式
start-client.bat

REM CLI 模式
start-client-cli.bat

REM 直接运行
nat-client.exe --config client.toml

网络和防火墙配置

WSL 端口访问

# WSL 默认允许 Windows 宿主机访问
# 如果有防火墙,添加规则
sudo ufw allow 7000/tcp

# 验证端口监听
ss -tlnp | grep 7000

Windows 防火墙 (可选)

REM 如果连接失败,可能需要添加防火墙规则
netsh advfirewall firewall add rule name="NAT Traversal Client" dir=out action=allow protocol=TCP remoteport=7000

故障排除

连接测试

# 在 WSL 中测试本地连接
telnet localhost 7000

# 在 Windows 中测试 WSL 连接
telnet 172.22.247.72 7000

常见问题解决

  1. 连接被拒绝: 检查 WSL IP 是否正确,server 是否运行
  2. TLS 握手失败: 确保客户端配置了 tls_verify = false
  3. WSL IP 变化: 重启后 WSL IP 可能变化,需要更新配置

自动化脚本

#!/bin/bash
# wsl-update-config.sh - 自动更新 WSL IP 配置

WSL_IP=$(ip addr show eth0 | grep 'inet ' | awk '{print $2}' | cut -d'/' -f1)
CONFIG_FILE="$HOME/.config/nat-traversal/server.toml"
CLIENT_CONFIG="$HOME/.config/nat-traversal/client.toml"

echo "Updating configuration for WSL IP: $WSL_IP"

# 更新服务器配置
sed -i "s/bind_addr = .*/bind_addr = \"$WSL_IP\"/" "$CONFIG_FILE"

# 更新客户端配置
sed -i "s/addr = .*/addr = \"$WSL_IP\"/" "$CLIENT_CONFIG"

# 重新生成证书
openssl genrsa -out server.key 2048
openssl req -new -x509 -key server.key -out server.crt -days 365 \
  -subj "/C=US/ST=State/L=City/O=NAT-Traversal/CN=localhost" \
  -addext "subjectAltName=IP:127.0.0.1,IP:$WSL_IP"

# 复制更新的客户端配置到 Windows
cp "$CLIENT_CONFIG" /mnt/c/NAT-Traversal/

echo "Configuration updated successfully!"

编译和构建

开发环境依赖

Linux:

# Ubuntu/Debian
sudo apt update
sudo apt install -y libgtk-3-dev libatk1.0-dev libcairo-gobject2 \
  libcairo2-dev libgdk-pixbuf2.0-dev libgio2.0-cil-dev \
  libglib2.0-dev libpango1.0-dev pkg-config

# 交叉编译到 Windows
sudo apt install gcc-mingw-w64-x86-64
rustup target add x86_64-pc-windows-gnu

Windows: 无额外系统依赖,所有功能使用纯 Rust 实现。

编译选项

# 本地编译(包含 GUI)
cargo build --release

# Windows 交叉编译
cargo build --target x86_64-pc-windows-gnu --release

# 仅命令行版本(无 GUI 依赖)
cargo build -p nat-traversal-client --no-default-features --release

# 开发版本
cargo build

特性标志

  • gui: 启用 egui 图形界面 (默认启用)
  • 使用 --no-default-features 可编译纯命令行版本

测试运行

# 运行所有测试
cargo test -p nat-traversal-common -p nat-traversal-server -p nat-traversal-platform

# 测试客户端(无 GUI)
cargo test -p nat-traversal-client --no-default-features

# 代码格式检查
cargo fmt
cargo clippy

安全特性

  • TLS 1.3 加密: 使用 rustls 库提供的现代 TLS 实现
  • 令牌认证: 基于共享密钥的客户端身份验证
  • 连接隔离: 每个客户端的隧道完全隔离
  • 证书验证: 支持服务器证书验证
  • 连接限制: 可配置的并发连接数限制
  • 超时机制: 自动清理僵尸连接

故障排除

常见问题

  1. 服务器启动失败
# 检查证书文件
ls -la server.crt server.key

# 验证证书有效性
openssl x509 -in server.crt -text -noout

# 检查端口占用
ss -tlnp | grep 7000
  1. 客户端连接失败
# 测试网络连通性
telnet your-server.com 7000

# 检查 TLS 连接
openssl s_client -connect your-server.com:7000

# 查看详细日志
RUST_LOG=debug ./nat-client --no-gui
  1. GUI 启动失败
# Linux: 检查 GTK 依赖
pkg-config --modversion gtk+-3.0

# 使用命令行模式
./nat-client --no-gui

# 查看错误信息
RUST_LOG=debug ./nat-client
  1. 编译错误
# 更新 Rust 工具链
rustup update

# 清理缓存
cargo clean

# 重新编译
cargo build --release

日志调试

启用详细日志输出:

# 服务器端调试
RUST_LOG=debug ./nat-server

# 客户端调试
RUST_LOG=debug ./nat-client

# 特定模块调试
RUST_LOG=nat_traversal_server=debug ./nat-server

开发和贡献

代码结构

nat-traversal/
├── common/          # 共享库 (协议、配置、加密)
├── server/          # 服务器端
├── client/          # 客户端 (GUI + CLI)
├── platform/        # 平台特定功能
├── target/          # 编译输出
├── CLAUDE.md        # 开发指南
├── TESTING.md       # 测试文档
└── README.md        # 本文档

开发命令

# 格式化代码
cargo fmt

# 代码检查
cargo clippy

# 运行测试
cargo test

# 生成文档
cargo doc --open

贡献指南

  1. Fork 项目
  2. 创建功能分支
  3. 编写代码和测试
  4. 运行 cargo fmtcargo clippy
  5. 提交 Pull Request

更多详细信息请参阅:

版本历史

  • v0.1.0: 基础功能实现,TLS 通信,基本 GUI
  • 更多版本计划中...

许可证

本项目采用双许可证:

您可以选择其中任一许可证使用本项目。

技术支持


感谢您使用 NAT 穿透工具! 🚀

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

  •  
  •