From 9fcae13dffa0cfa1ac50007b9088fdeee6134bbb Mon Sep 17 00:00:00 2001 From: okxlin Date: Tue, 15 Aug 2023 17:32:22 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0port-forward=E5=88=B0?= =?UTF-8?q?=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/port-forward-agent/1.3.7/.env.sample | 2 + apps/port-forward-agent/1.3.7/Dockerfile | 18 +++++ apps/port-forward-agent/1.3.7/data.yml | 10 +++ apps/port-forward-agent/1.3.7/data/app.conf | 3 + .../1.3.7/docker-compose.yml | 17 ++++ apps/port-forward-agent/README.md | 74 ++++++++++++++++++ apps/port-forward-agent/data.yml | 20 +++++ apps/port-forward-agent/logo.png | Bin 0 -> 26073 bytes apps/port-forward-server/1.3.7/.env.sample | 2 + apps/port-forward-server/1.3.7/Dockerfile | 19 +++++ apps/port-forward-server/1.3.7/data.yml | 10 +++ .../1.3.7/data/conf/app.conf | 20 +++++ .../1.3.7/data/conf/data.conf | 6 ++ .../1.3.7/data/data/data.db | Bin 0 -> 8192 bytes .../1.3.7/docker-compose.yml | 18 +++++ apps/port-forward-server/README.md | 74 ++++++++++++++++++ apps/port-forward-server/data.yml | 20 +++++ apps/port-forward-server/logo.png | Bin 0 -> 26073 bytes 18 files changed, 313 insertions(+) create mode 100644 apps/port-forward-agent/1.3.7/.env.sample create mode 100644 apps/port-forward-agent/1.3.7/Dockerfile create mode 100644 apps/port-forward-agent/1.3.7/data.yml create mode 100644 apps/port-forward-agent/1.3.7/data/app.conf create mode 100644 apps/port-forward-agent/1.3.7/docker-compose.yml create mode 100644 apps/port-forward-agent/README.md create mode 100644 apps/port-forward-agent/data.yml create mode 100644 apps/port-forward-agent/logo.png create mode 100644 apps/port-forward-server/1.3.7/.env.sample create mode 100644 apps/port-forward-server/1.3.7/Dockerfile create mode 100644 apps/port-forward-server/1.3.7/data.yml create mode 100644 apps/port-forward-server/1.3.7/data/conf/app.conf create mode 100644 apps/port-forward-server/1.3.7/data/conf/data.conf create mode 100644 apps/port-forward-server/1.3.7/data/data/data.db create mode 100644 apps/port-forward-server/1.3.7/docker-compose.yml create mode 100644 apps/port-forward-server/README.md create mode 100644 apps/port-forward-server/data.yml create mode 100644 apps/port-forward-server/logo.png diff --git a/apps/port-forward-agent/1.3.7/.env.sample b/apps/port-forward-agent/1.3.7/.env.sample new file mode 100644 index 00000000..55771ce1 --- /dev/null +++ b/apps/port-forward-agent/1.3.7/.env.sample @@ -0,0 +1,2 @@ +CONTAINER_NAME="port-forward-agent" +PANEL_APP_PORT_CONSOLE="7000" diff --git a/apps/port-forward-agent/1.3.7/Dockerfile b/apps/port-forward-agent/1.3.7/Dockerfile new file mode 100644 index 00000000..3948bdc7 --- /dev/null +++ b/apps/port-forward-agent/1.3.7/Dockerfile @@ -0,0 +1,18 @@ +FROM debian:bullseye-slim + +RUN mkdir -p /app/pfg + +WORKDIR /app/pfg + +RUN apt-get update && apt-get upgrade -y && \ + apt-get install -y wget unzip tzdata + +RUN wget -O pfg.zip https://gitee.com/tavenli/port-forward/releases/download/v1.3.7/forward-agent.linux64.v1.3.7.zip && \ + unzip pfg.zip && \ + chmod +x /app/pfg/forward-agent/forward-agent + +ENV TZ=Asia/Shanghai + +WORKDIR /app/pfg/forward-agent + +CMD ["./forward-agent"] diff --git a/apps/port-forward-agent/1.3.7/data.yml b/apps/port-forward-agent/1.3.7/data.yml new file mode 100644 index 00000000..08600a55 --- /dev/null +++ b/apps/port-forward-agent/1.3.7/data.yml @@ -0,0 +1,10 @@ +additionalProperties: + formFields: + - default: 7000 + disabled: true + envKey: PANEL_APP_PORT_HTTP + labelEn: HTTP Port + labelZh: HTTP端口 + required: true + rule: paramPort + type: number diff --git a/apps/port-forward-agent/1.3.7/data/app.conf b/apps/port-forward-agent/1.3.7/data/app.conf new file mode 100644 index 00000000..98c4ed8c --- /dev/null +++ b/apps/port-forward-agent/1.3.7/data/app.conf @@ -0,0 +1,3 @@ + +magic.server = "127.0.0.1:7000" + diff --git a/apps/port-forward-agent/1.3.7/docker-compose.yml b/apps/port-forward-agent/1.3.7/docker-compose.yml new file mode 100644 index 00000000..c29561ed --- /dev/null +++ b/apps/port-forward-agent/1.3.7/docker-compose.yml @@ -0,0 +1,17 @@ +version: "3" +services: + port-forward-server: + build: + context: . + dockerfile: Dockerfile + args: + IMAGE_TAG: 1.3.7 + container_name: ${CONTAINER_NAME} + restart: always + network_mode: host + volumes: + - "./data:/app/pfg/forward-agent/conf" + cap_add: + - NET_ADMIN + labels: + createdBy: "Apps" diff --git a/apps/port-forward-agent/README.md b/apps/port-forward-agent/README.md new file mode 100644 index 00000000..514b3a87 --- /dev/null +++ b/apps/port-forward-agent/README.md @@ -0,0 +1,74 @@ +# 使用说明 +- 控制台:http://IP:Port/login + +- 账户密码: +``` +username:admin +password:123456 +``` + +# 原始相关 + +# port-forward +Go语言开发的端口转发工具 for port data forward + +官网地址: +https://gitee.com/tavenli/port-forward + +``` +开发语言:GO +控制台框架:beego +数据库:sqlite3 +``` + +# 最近更新 +``` +v1.3.6 发布,重新增加 TCP端口数据分发功能 +v1.3.5 发布,增加批量导入、批量添加规则 +v1.3.3 发布,增加 一键开启所有转发 和 一键关闭所有转发 +v1.3.2 发布,服务稳定性已经过长时间的验证 +v1.3.1 发布,增加程序启动自动开启转发 +v1.2.9_beta 发布,完善点对点转发的稳定性,支持TCP和UDP协议转发 +``` + +# 最新编译好的版本下载: +[https://gitee.com/tavenli/port-forward/releases](https://gitee.com/tavenli/port-forward/releases) + + + +# 功能介绍 + +> 支持Web控制台添加端口映射 + +> 支持对每条端口映射进行开启和关闭控制 + +> 支持 RestfulAPI 接口,方便被其它系统集成 + +> 支持每条端口转发的同时,再分发给多个端口,满足某些测试场景 + +> 类似企业交换机的功能,即软交换机,主要是方便企业网络维护人员或开发人员 + + +# 使用交流群 + +> 使用问题或个性化需求可加QQ号:17020415 (申请时请备注:端口转发) + +# 快速安装说明 +1. 下载编译好的程序包,并解压程序包 +2. 执行 start.sh (Linux)或 start.bat (Win)命令 +3. 打开浏览器,进入控制台,打开 http://127.0.0.1:8080/login +4. 输入用户 admin 密码 123456 进入控制台 + + +# 控制台UI +![登录](https://gitee.com/tavenli/port-forward/raw/master/screenshot/Login.png "在这里输入图片标题") + + +![转发列表](https://gitee.com/tavenli/port-forward/raw/master/screenshot/List.png "在这里输入图片标题") + + +![端口转发配置](https://gitee.com/tavenli/port-forward/raw/master/screenshot/edit.png "在这里输入图片标题") + + +![方便与其它平台集成接口](https://gitee.com/tavenli/port-forward/raw/master/screenshot/ApiDoc.png "在这里输入图片标题") + diff --git a/apps/port-forward-agent/data.yml b/apps/port-forward-agent/data.yml new file mode 100644 index 00000000..d815afa9 --- /dev/null +++ b/apps/port-forward-agent/data.yml @@ -0,0 +1,20 @@ +name: Port-Forward-Agent +tags: + - 工具 +title: Go语言开发的端口转发工具 (客户端) +type: 工具 +description: Go语言开发的端口转发工具 (客户端) +additionalProperties: + key: port-forward-agent + name: Port-Forward-Agent + tags: + - Tool + shortDescZh: Go语言开发的端口转发工具 (客户端) + shortDescEn: Port forwarding tool developed in Go (Agent) + type: tool + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://gitee.com/tavenli/port-forward + github: https://gitee.com/tavenli/port-forward + document: https://gitee.com/tavenli/port-forward diff --git a/apps/port-forward-agent/logo.png b/apps/port-forward-agent/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..023fe72df4c2c99878a8f9c803ecbe3f1e4204cf GIT binary patch literal 26073 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 literal 0 HcmV?d00001 diff --git a/apps/port-forward-server/1.3.7/.env.sample b/apps/port-forward-server/1.3.7/.env.sample new file mode 100644 index 00000000..ed2fdcff --- /dev/null +++ b/apps/port-forward-server/1.3.7/.env.sample @@ -0,0 +1,2 @@ +CONTAINER_NAME="port-forward-server" +PANEL_APP_PORT_CONSOLE="8080" diff --git a/apps/port-forward-server/1.3.7/Dockerfile b/apps/port-forward-server/1.3.7/Dockerfile new file mode 100644 index 00000000..b17c71f7 --- /dev/null +++ b/apps/port-forward-server/1.3.7/Dockerfile @@ -0,0 +1,19 @@ +FROM debian:bullseye-slim + +RUN mkdir -p /app/pfg + +WORKDIR /app/pfg + +RUN apt-get update && apt-get upgrade -y && \ + apt-get install -y wget unzip tzdata + +RUN wget -O pfg.zip https://gitee.com/tavenli/port-forward/releases/download/v1.3.7/forward-server.linux64.v1.3.7.zip && \ + unzip pfg.zip && \ + chmod +x /app/pfg/forward-server/start.sh && \ + chmod +x /app/pfg/forward-server/forward-server + +ENV TZ=Asia/Shanghai + +WORKDIR /app/pfg/forward-server + +CMD ["./forward-server"] diff --git a/apps/port-forward-server/1.3.7/data.yml b/apps/port-forward-server/1.3.7/data.yml new file mode 100644 index 00000000..6cf7999c --- /dev/null +++ b/apps/port-forward-server/1.3.7/data.yml @@ -0,0 +1,10 @@ +additionalProperties: + formFields: + - default: 8080 + disabled: true + envKey: PANEL_APP_PORT_HTTP + labelEn: HTTP Port + labelZh: HTTP端口 + required: true + rule: paramPort + type: number diff --git a/apps/port-forward-server/1.3.7/data/conf/app.conf b/apps/port-forward-server/1.3.7/data/conf/app.conf new file mode 100644 index 00000000..5b522a32 --- /dev/null +++ b/apps/port-forward-server/1.3.7/data/conf/app.conf @@ -0,0 +1,20 @@ + +app.name = "PortForward" +app.cname = "端口转发系统" +servername = "PortForward-Server" +runmode ="dev" +#runmode ="prod" +viewspath = "views" +#logfile.config = "close" + +[dev] +httpaddr = "0.0.0.0" +httpport = 8080 +recoverpanic = false +[prod] +httpaddr = "0.0.0.0" +httpport = 8080 +recoverpanic = true +graceful = true + +include "data.conf" diff --git a/apps/port-forward-server/1.3.7/data/conf/data.conf b/apps/port-forward-server/1.3.7/data/conf/data.conf new file mode 100644 index 00000000..d75da424 --- /dev/null +++ b/apps/port-forward-server/1.3.7/data/conf/data.conf @@ -0,0 +1,6 @@ +magic.service = ":7000" +api.auth = "26CCD056107481F45D1AC805A24A9E59" + +agent.auth = "722ED8F8D9900CC1AB17243DC7B51A2D" + +onstart.forward = "false" \ No newline at end of file diff --git a/apps/port-forward-server/1.3.7/data/data/data.db b/apps/port-forward-server/1.3.7/data/data/data.db new file mode 100644 index 0000000000000000000000000000000000000000..d241e9914c8bb38c2cd6588e3288345ec650ab20 GIT binary patch literal 8192 zcmeHMO>Y}T7@pZl>@@LGK@L6y)JcGnRbp#)osHw%UH-sp%RvUXmEhVwD z-iVeHC2B4eLRHlR`~wuJzyXPmA`ZR75%mWoL7X`C!i9I&>#yLCeh^fo9q)RanRlLj z=b0Jj_4{01UMyM$-7J~gxI%h)b!PO~Ol`KQ{3G%EUj{*qS=i;cV$-6$>kLVNMBIir|YN8b95<9 z*BgU!bi8ho6K;NV&L12d#rtt*8#K%spGeF4w<10Jg4eukyG{;lS+7)9OD625Hrv9n zc(P5=ndZ!ZFE}xQ*P0H7RxyC$oxFQa>VNjPkWf7X_0Dm7_rhWG5AoznM7W2Ddq_0$ zD*2`D$@CgM23}kSR&fAD@d!8k78mF7(ZQ{gpY9wz`1t6vJID9FKK}In(GPbq3p=k1 zU#RmLF(!q@>6x$?mKY2CAu%x;Vsc1|QpRSTYr=U)iM{|D!8`zC06zZq_U~Wa6YV}LNt!lEo^03sG*Qb>$Z7Mqpj*{LZP;tCf)Z{iU={5qaPu5TxYpPzj4ea)ri z7LR6Ztkdp<8Dlp6tL`l8NT+6r80!z9^O(oO7jT5fA)K(B+uEv0=#529u+k z65E`ai5R%c_liAba!B$}*%5d(3bz}*;xXVc@VpFM;)WVAKs7vhrV!vN9;(GTbEs{Y zgPtzTvEvG!{E9eoh{(_I4RH9pQ}xDs40sHj5d*LE69HSAoeR<+U-zMI7W!Y}$SAbc z@+)>qPQ*<~GAa66ABp3RDKKsjMqu(7k;mlEGxFPm^%(FNcySo;6}WRGh@GDe*#7-b zxXXy#=e~jJKgrGapu)@l*F=a$g1@A~8osm&bs*FhIJI^-2Nxm zVgRh8K<9$lj<*x&YTexgI@hL$K-XfG>HfHO5?xicgsGIQYlaEJWcs~C*3qeCW-E~{ v{-%1P48mSb4y}omOn@-)H(QlGh&G8&Pov8AwFpvOR9SD`o8{ZHU3cMc1+Vz+ literal 0 HcmV?d00001 diff --git a/apps/port-forward-server/1.3.7/docker-compose.yml b/apps/port-forward-server/1.3.7/docker-compose.yml new file mode 100644 index 00000000..acebd3f3 --- /dev/null +++ b/apps/port-forward-server/1.3.7/docker-compose.yml @@ -0,0 +1,18 @@ +version: "3" +services: + port-forward-server: + build: + context: . + dockerfile: Dockerfile + args: + IMAGE_TAG: 1.3.7 + container_name: ${CONTAINER_NAME} + restart: always + network_mode: host + volumes: + - "./data/data:/app/pfg/forward-server/data" + - "./data/conf:/app/pfg/forward-server/conf" + cap_add: + - NET_ADMIN + labels: + createdBy: "Apps" diff --git a/apps/port-forward-server/README.md b/apps/port-forward-server/README.md new file mode 100644 index 00000000..514b3a87 --- /dev/null +++ b/apps/port-forward-server/README.md @@ -0,0 +1,74 @@ +# 使用说明 +- 控制台:http://IP:Port/login + +- 账户密码: +``` +username:admin +password:123456 +``` + +# 原始相关 + +# port-forward +Go语言开发的端口转发工具 for port data forward + +官网地址: +https://gitee.com/tavenli/port-forward + +``` +开发语言:GO +控制台框架:beego +数据库:sqlite3 +``` + +# 最近更新 +``` +v1.3.6 发布,重新增加 TCP端口数据分发功能 +v1.3.5 发布,增加批量导入、批量添加规则 +v1.3.3 发布,增加 一键开启所有转发 和 一键关闭所有转发 +v1.3.2 发布,服务稳定性已经过长时间的验证 +v1.3.1 发布,增加程序启动自动开启转发 +v1.2.9_beta 发布,完善点对点转发的稳定性,支持TCP和UDP协议转发 +``` + +# 最新编译好的版本下载: +[https://gitee.com/tavenli/port-forward/releases](https://gitee.com/tavenli/port-forward/releases) + + + +# 功能介绍 + +> 支持Web控制台添加端口映射 + +> 支持对每条端口映射进行开启和关闭控制 + +> 支持 RestfulAPI 接口,方便被其它系统集成 + +> 支持每条端口转发的同时,再分发给多个端口,满足某些测试场景 + +> 类似企业交换机的功能,即软交换机,主要是方便企业网络维护人员或开发人员 + + +# 使用交流群 + +> 使用问题或个性化需求可加QQ号:17020415 (申请时请备注:端口转发) + +# 快速安装说明 +1. 下载编译好的程序包,并解压程序包 +2. 执行 start.sh (Linux)或 start.bat (Win)命令 +3. 打开浏览器,进入控制台,打开 http://127.0.0.1:8080/login +4. 输入用户 admin 密码 123456 进入控制台 + + +# 控制台UI +![登录](https://gitee.com/tavenli/port-forward/raw/master/screenshot/Login.png "在这里输入图片标题") + + +![转发列表](https://gitee.com/tavenli/port-forward/raw/master/screenshot/List.png "在这里输入图片标题") + + +![端口转发配置](https://gitee.com/tavenli/port-forward/raw/master/screenshot/edit.png "在这里输入图片标题") + + +![方便与其它平台集成接口](https://gitee.com/tavenli/port-forward/raw/master/screenshot/ApiDoc.png "在这里输入图片标题") + diff --git a/apps/port-forward-server/data.yml b/apps/port-forward-server/data.yml new file mode 100644 index 00000000..ec400be4 --- /dev/null +++ b/apps/port-forward-server/data.yml @@ -0,0 +1,20 @@ +name: Port-Forward-Server +tags: + - 工具 +title: Go语言开发的端口转发工具 (服务端) +type: 工具 +description: Go语言开发的端口转发工具 (服务端) +additionalProperties: + key: port-forward-server + name: Port-Forward-Server + tags: + - Tool + shortDescZh: Go语言开发的端口转发工具 (服务端) + shortDescEn: Port forwarding tool developed in Go (Server) + type: tool + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://gitee.com/tavenli/port-forward + github: https://gitee.com/tavenli/port-forward + document: https://gitee.com/tavenli/port-forward diff --git a/apps/port-forward-server/logo.png b/apps/port-forward-server/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..023fe72df4c2c99878a8f9c803ecbe3f1e4204cf GIT binary patch literal 26073 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 literal 0 HcmV?d00001