一个 TCP/UDP 端口复用器,根据第一个包的内容用正则表达式来确定转发的目标

337 天前
 ppxppx

github: https://github.com/lidotcircle/portForwarder

应用协议复用器

应用协议复用器是一种工具,它允许您根据客户端发送的第一个数据包中的正则表达式模式匹配,将 TCP 或 UDP 流量转发到不同的地址。

使用方法

可以从源代码构建此工具,或者从发布页面下载名为 portfd 的预编译二进制文件。

可以使用简单的命令行参数运行 portfd ,请使用以下语法:portfd <local-bind> <remote>。 在这种情况下,需要指定监听地址和远程地址。 对于更高级的用法,portfd 可以使用支持更复杂规则的配置文件启动。以下是一个使用 YAML 格式的配置文件示例:

forwarders:
  - local: 0.0.0.0:8808
    # 指定 'remoteMap' 或 'remote'
    remoteMap:
      - pattern: "[http:localhost]"
        remote: 192.168.44.43:5445
      - pattern: "[https:baidu.com]"
        remote: "39.156.66.10:443"
      - pattern: "[ssh]"
        remote: "192.168.44.43:22"
      - pattern: .*
        remote: 192.168.100.46:3389
    remote: <remote-address/127.0.0.1:2233>
    enable_tcp: true # 默认为 true
    enable_udp: true # 默认为 true
    conn_bufsize: 2MB
    max_connections: 10000 # 可选
    allow_nets: # 可选的白名单
      - 127.0.0.0/24

pattern字段支持四种格式,所有格式都将转换为正则表达式:

2335 次点击
所在节点    分享创造
27 条回复
happyn
337 天前
很有用的小工具,这样一些服务可以根据流量特征,做负载均衡了;
Tink
337 天前
6
一个端口既翻墙又跑网站顺便还能 ssh
myqoo
336 天前
这个用 iptables 可以实现吗?
ppxppx
336 天前
@myqoo #3 应该不行,这个需要根据流量的内容来决定转发的目标,我问 chatgpt 得到的答案是 iptable 不支持这个功能。

```
No, iptables cannot directly route traffic based on the content of the traffic. iptables is a tool used for configuring the firewall rules in the Linux kernel's netfilter framework. It primarily operates at the network layer (Layer 3) and transport layer (Layer 4) of the network stack, inspecting factors such as source and destination IP addresses, ports, and protocols.
```

而且这个工具用 Rust 写的,所以可以在 Windows 下用。
IDAEngine
336 天前
@ppxppx iptables 可以根据流量特征转发特定目标,不过要制定一套 tag 规则
listenfree
336 天前
nftables 应该可行吧,昨天学了下,感觉比 iptables 简单。
ppxppx
336 天前
@IDAEngine 哈哈,看来 chatgpt 还是不可尽信。不过 iptables 上手难度还是挺高的,看了半天也没 tag 规则理解怎么用
ppxppx
336 天前
@listenfree #6 确实,而且 nftables 语法看着比 iptables 友好太多
leonshaw
336 天前
这是四层代理功能,iptables/nftables 应该不行。
不知道对第一个包不够的情况怎么处理的,比如 http url 过长导致 host 第一次没读到。
myqoo
336 天前
@leonshaw 第一个包长度不够先暂存这就可以。读够缓冲区再识别。
myqoo
336 天前
能用 iptables 的话可以保留原地址,否则日志里的原地址都是本地 ip 。
ppxppx
336 天前
@leonshaw 这种情况还没考虑,感觉要处理这种情形挺复杂的。
myqoo
336 天前
像 ngixn 里可以用 proxy_bind $remote_addr transparent; 转发时保留原始 IP ,不过这个特征貌似不是跨平台的。
ppxppx
336 天前
@myqoo #10 主要是不知道客户端什么时候才能把包发完,所以一直保留这个包可能导致内存爆炸。
myqoo
336 天前
@ppxppx 加个最大长度+最大时间就可以。最大长度内没出现,或超时,就断开。这种都是极小概率事件。
ppxppx
336 天前
@myqoo #15 这倒是可以考虑,有时间我去试试看
leonshaw
336 天前
@ppxppx
是的,我之前写类似工具的时候就很头疼,不同协议区别太大了,加超时又可能影响体验。举个极端例子,telnet 客户端可能一开始根本不发数据包,而是先等服务端给个提示符。
ppxppx
336 天前
@leonshaw 这种服务端先发就没办法,最多就直接转发
leo97
336 天前
haproxy 可以做到
leeyuzhe
336 天前
不通协议的粘包如何处理?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/943547

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX