zhboner / realm

A network relay tool
MIT License
1.61k stars 291 forks source link

feature request: easy advanced multi-port mapping #108

Closed Zerorigin closed 1 year ago

Zerorigin commented 1 year ago

现在的高级多端口映射步骤有点过于繁琐,不便于给同一个服务或IP映射多个端口(需要编写冗长的配置段) 可以通过增加几个配置项来做简化

[[endpoints]]
listen_addrs = ["0.0.0.0", "[::]"]
remote_addrs = ["a.a.a.a", "b.b.b.b"] # 或 remote_addr = "a.a.a.a"
listen_ports = ["80", "8080"]
remote_ports = ["8080", "80"]

在程序添加配置时,对这四个键值对的值是否存在做下判断,如果存在则忽略原本的一对一映射,转而使用“多端口对多端口”或“多端口对单端口”的映射逻辑 如果有意支持远端负载均衡,则 remote_addrs 是字符串数组,否则使用 remote_addr 字符串代替(一般比较少人需要负载均衡,故不一定需要实现)

若 remote_ports 的端口数等于1,则进行 N 对 1 端口映射,将 listen_addrs 所列所有 IP 地址指定的 listen_ports 都映射到 remote_addr(s) 唯一的远端端口上 若 remote_ports 的端口数等于 listen_ports 的端口数,则进行一对一的端口映射,将 listen_addrs 所列所有 IP 地址指定的 listen_ports 按配置文件手动编写的数组阅读顺序,一一映射到 remote_addr(s) 所列远端端口上(此例为:80->8080,8080->80) 若 remote_ports 的端口数不等于上述两个值,则报错提示

当然可以借鉴 docker,进行扩展: 例如: 监听端口 ["80", "8080/tcp", “10001-10005/tcp”] 则表示监听的是 TCP 端口,所对应的映射端口 ["80", "8080", "10001-10005"] 也就默认都是 TCP 端口 或者 ["80", "843/udp"] 则映射到 [“80/tcp”, "843/udp"] 亦或 ["443/both"] 则同时进行 443/tcp -> 443/tcp 和 443/udp -> 443/udp 映射

这样可以在配合network使用时,方便的配置哪些 TCP/UDP 端口需要映射,而不是全部映射

[network]
no_tcp = false
use_udp = true 
zephyrchien commented 1 year ago

个人认为配置文件语法格式再多,表达能力也终究有限。 把这些语法硬编码进项目也是件费劲的事情..

最好还是请用户自行编写配置文件生成脚本,以满足个性化需求