# Net Reverse Proxy **Repository Path**: ulyan/net-reverse-proxy ## Basic Information - **Project Name**: Net Reverse Proxy - **Description**: 计算机网络反向代理,一个简单实用的内网穿透工具。 - **Primary Language**: Unknown - **License**: GPL-3.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2021-08-01 - **Last Updated**: 2023-08-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 网络反向代理工具 ## 它是什么 **网络反向代理 (Net reverse proxy, NRP)** 是一个简单实用的工具。当有一个服务器 **A** (往往在内网中) 可以主动访问到服务器 **B** (通常在更为公开的网域) 但是服务器 **B** 却不能主动访问 **A** 时,这个工具可以构建一条从 **A** 到 **B** 的通道并将 **A** 的某些侦听端口映射到 **B** 上,从而使 **B** 成为 **A** 的代理服务器并允许 **B** 通过访问自身对应的侦听端口来实现对 **A** 的访问。 例如,**A** 现在运行着一个 HTTP 服务器,服务端口是 80。我们可以利用这个工具将 **A** 的 80 端口映射到 **B** 的某个端口 (例如 8080) 上去。如果 **B** 的 IP 地址是 `b.b.b.b`,我们就可以通过浏览器访问 `http://b.b.b.b:8080/` 来实现对服务器 **A** 的访问了。 ## 构建 & 编译 这是一个用 Rust 语言编写的工程。如果要编译它,需要先安装 [Rust 编译工具](https://www.rust-lang.org/tools/install)。 如果你已经安装了 Rust 编译工具,你可以克隆本仓库并在仓库中运行以下命令来编译它: ```sh cargo build ``` 或者编译成发行版(这将不能调试它,但运行效率更高): ```sh cargo build --release ``` ## 使用说明 **NRP** 可以以两种模式运行: **客户端模式** 和 **服务器模式**. **客户端模式** 应该运行在上述案例中的 A 服务器上,也就是真正的服务器进程所运行的计算机上。它是用来连接一个以服务器模式运行的 **NRP** 实例(就像案例中的 B)以建立通道。假设编译之后的可执行文件叫作 `nrp`,以下命令可以让它以客户端模式运行: ```shell nrp <服务器 IP> <服务器端口> -p <代理端口>[:映射端口] [-p <代理端口>[:映射端口] ...] ``` 例如: ```shell nrp 10.0.2.2 50500 -p 22 -p 80:8080 ``` 这个命令旨在映射客户端节点的 22 号端口和 80 号端口分别到服务端节点的 22 号端口和 8080 号端口,服务端的 IP 地址是 `10.0.2.2`。 **服务器模式** 应该运行在类似于上述案例中的服务器 B 上,也就是其他访问者能够访问到的节点上。它用于侦听 **NRP** 客户端实例的连接请求。 假设编译之后的可执行文件叫作 `nrp`,以下命令可以让它以服务器模式运行: ```shell nrp -l <监听地址> <监听端口> [-h <代理监听地址>] ``` 例如: ```shell nrp -l 0.0.0.0 50500 ``` 这条命令会侦听 50500 端口以等待来自 nrp 客户端的请求。 **注意** 默认情况下,以服务器模式运行的 nrp 仅会侦听本地 `127.0.0.1` 的连接请求,也就是说案例中的 B 所代理的端口无法被除了它本身以外的计算机访问。 如果需要使它可以被所有计算机访问,可以使用 `-h` 参数设置代理服务的侦听地址: ```shell nrp -l 0.0.0.0 50500 -h 0.0.0.0 ``` 这条命令将侦听来自任何计算机的访问请求(任何计算机都能访问 A 了)。