# tcp-proxy **Repository Path**: homingfly/tcp-proxy ## Basic Information - **Project Name**: tcp-proxy - **Description**: No description available - **Primary Language**: Go - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-19 - **Last Updated**: 2025-09-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # TCP Proxy README ## 一、项目概述 `tcp - proxy` 是一个基于Go语言开发的TCP反向代理工具,旨在通过配置文件或环境变量来转发TCP流量。它能够将客户端发送到特定监听端口的TCP请求转发到指定的后端目标地址,适用于多种基于TCP协议的应用场景,如数据库访问、SSH连接等。 ## 二、功能特点 1. **灵活的配置方式**:支持从配置文件(如JSON、YAML)读取转发规则,同时也可以通过环境变量扩展或覆盖配置,方便在不同环境下部署和管理。 2. **规则去重**:在合并来自配置文件和环境变量的转发规则时,会自动去除重复的规则,确保每个转发规则的唯一性。 3. **多规则支持**:可以同时配置多个监听端口及其对应的目标地址,实现多个TCP服务的代理转发。 ## 三、安装与运行 ### (一)本地运行 1. **安装Go环境**:确保你的机器上安装了Go环境,你可以从[Go官方网站](https://golang.org/dl/)下载并安装。 2. **获取代码**:将项目代码克隆到本地: ```bash git clone https://gitee.com/homingfly/tcp-proxy.git cd tcp-proxy ``` 3. **运行程序**:在项目目录下执行以下命令运行程序: ```bash go run main.go ``` ### (二)使用Docker运行 1. **构建镜像**:在包含 `Dockerfile` 的项目目录下执行以下命令构建Docker镜像: ```bash docker build -t tcp - proxy - image. ``` 2. **运行容器**:使用以下命令运行容器,并通过环境变量配置转发规则: ```bash docker run -d \ -p 53306:53306 \ -p 5522:5522 \ -p 58080:58080 \ -e PROXY_RULES="tcp:53306:172.16.12.233:3306;tcp:5522:172.16.12.233:22;tcp:58080:172.16.104.108:58080" \ tcp - proxy - image ``` ### (三)使用Docker Compose运行 1. **编写 `docker - compose.yml`**:在项目目录下创建 `docker - compose.yml` 文件,并添加以下内容: ```yaml version: '3' services: tcp - proxy: build:. image: tcp - proxy - image ports: - "53306:53306" - "5522:5522" - "58080:58080" environment: - PROXY_RULES=tcp:53306:172.16.12.233:3306 - PROXY_RULES=tcp:5522:172.16.12.233:22 - PROXY_RULES=tcp:58080:172.16.104.108:58080 ``` 2. **启动服务**:在包含 `docker - compose.yml` 的目录下执行以下命令启动服务: ```bash docker - compose up - d ``` ## 四、配置说明 ### (一)配置文件 1. **JSON格式**:项目支持JSON格式的配置文件,例如 `config.json`: ```json { "rules": [ { "listen_port": 53306, "target_addr": "172.16.12.233:3306" }, { "listen_port": 5522, "target_addr": "172.16.12.233:22" } ] } ``` 2. **YAML格式**:也可以使用YAML格式的配置文件,例如 `config.yaml`: ```yaml rules: - listen_port: 53306 target_addr: 172.16.12.233:3306 - listen_port: 5522 target_addr: 172.16.12.233:22 ``` ### (二)环境变量 1. **单个环境变量**:可以通过 `PROXY_RULES` 环境变量配置转发规则,格式为 `protocol:listen_port:target_addr`,多个规则之间用分号 `;` 分隔。例如: ```bash export PROXY_RULES="tcp:58080:172.16.104.108:58080" ``` 2. **数组形式的环境变量**:在 `docker - compose.yml` 中,`environment` 字段可以设置为数组形式来配置多个 `PROXY_RULES`: ```yaml environment: - PROXY_RULES=tcp:53306:172.16.12.233:3306 - PROXY_RULES=tcp:5522:172.16.12.233:22 - PROXY_RULES=tcp:58080:172.16.104.108:58080 ``` ## 五、日志记录 1. **标准输出**:程序运行时的日志会输出到标准输出,方便查看运行状态和错误信息。 2. **日志文件**:可以通过修改代码将日志同时记录到文件中。例如,在 `main` 函数中: ```go // 打开日志文件 logFile, err := os.OpenFile("proxy.log", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666) if err!= nil { log.Fatalf("无法打开日志文件: %v", err) } defer logFile.Close() // 创建一个MultiWriter,将日志同时写入文件和控制台 multiWriter := io.MultiWriter(logFile, os.Stdout) // 设置日志输出为MultiWriter log.SetOutput(multiWriter) ``` ## 六、常见问题及解决方法 1. **配置文件读取失败**:确保配置文件格式正确,路径正确,并且有读取权限。如果使用JSON格式,检查JSON语法是否有误;如果使用YAML格式,确保缩进和语法正确。 2. **环境变量未生效**:在使用环境变量配置时,检查环境变量是否正确设置。在Docker容器中,确保 `docker run` 或 `docker - compose.yml` 中环境变量的设置正确。 3. **连接转发失败**:检查监听端口是否被占用,后端目标地址是否可达,网络配置是否正确。可以使用 `telnet` 或 `ping` 命令测试目标地址的连通性。 ## 七、贡献与反馈 1. **贡献**:如果你发现了问题或者有改进的想法,欢迎提交Pull Request。在提交之前,请确保你的代码符合项目的编码风格,并添加相应的测试。 2. **反馈**:如果你在使用过程中遇到任何问题或有任何建议,欢迎在项目仓库的Issues页面提交反馈。 ## 八、许可证 本项目基于[具体许可证名称]开源协议发布,详细信息请查看项目中的 `LICENSE` 文件。