网上关于端口转发软件的评测非常少，最近正好将socat与Brook都打包为了Docker镜像，今天先用他两来比一比，测一测，看看到底谁的效率更好一些。（非权威测试，结果仅供参考）测试环境已经在目标服务器163.172.35.xxx安装好了WebServer（Nginx），同时在中继服务器137.175.30.xxx上分别部署了socat和brook进行端口转发到目标的80端口上，信息如下。目标服务器：163.172.35.xxx:80中继服务器：137.175.30.xxx:32771（socat）中继服务器：137.175.30.xxx:32770（brook）初始环境（第一轮）socat与Brook均是通过Docker方式部署，部署完毕后，没有任何连接的情况下，内存占用情况如下。socat占用内存不到800KbBrook占用1.8Mb内存hey进行HTTP压力测试（第二轮）接下来通过hey工具分别对两个不同的转发端口进行HTTP并发压力测试，测试命令为：./hey -n 10000 -c 1000 -m GET http://xxx/上面命令是对中继服务器发起10000个请求，客户端并发连接数为1000socat压测结果：最高内存占用154Mb，最高CPU使用率32%，耗时67s，平均耗时1.5347s，错误次数238次Summary: Total: 67.5975 secs Slowest: 19.9194 secs Fastest: 0.3516 secs Average: 1.5347 secs Requests/sec: 147.9345 Response time histogram: 0.352 [1] | 2.308 [8318] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 4.265 [738] |■■■■ 6.222 [227] |■ 8.179 [166] |■ 10.136 [100] | 12.092 [48] | 14.049 [53] | 16.006 [31] | 17.963 [39] | 19.919 [41] | Latency distribution: 10% in 0.3608 secs 25% in 0.3721 secs 50% in 0.7243 secs 75% in 1.4874 secs 90% in 3.3814 secs 95% in 6.0845 secs 99% in 14.1610 secs Details (average, fastest, slowest): DNS+dialup: 0.0225 secs, 0.3516 secs, 19.9194 secs DNS-lookup: 0.0000 secs, 0.0000 secs, 0.0000 secs req write: 0.0001 secs, 0.0000 secs, 0.0309 secs resp wait: 1.4584 secs, 0.3515 secs, 19.9191 secs resp read: 0.0002 secs, 0.0001 secs, 0.0270 secs Status code distribution: [200] 9762 responses Error distribution: [238] Get "http://137.175.30.xxx:32771/": context deadline exceeded (Client.Timeout exceeded while awaiting headers)brook压测结果：最高内存占用25Mb，最高CPU使用率64%，总耗时44s，平均耗时1.0304s,错误次数67次Summary: Total: 44.2130 secs Slowest: 19.4560 secs Fastest: 0.3522 secs Average: 1.0304 secs Requests/sec: 226.1777 Response time histogram: 0.352 [1] | 2.263 [9106] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 4.173 [528] |■■ 6.083 [158] |■ 7.994 [69] | 9.904 [22] | 11.814 [17] | 13.725 [7] | 15.635 [11] | 17.546 [9] | 19.456 [5] | Latency distribution: 10% in 0.3605 secs 25% in 0.3687 secs 50% in 0.5565 secs 75% in 1.0805 secs 90% in 2.0481 secs 95% in 2.8718 secs 99% in 7.2565 secs Details (average, fastest, slowest): DNS+dialup: 0.0192 secs, 0.3522 secs, 19.4560 secs DNS-lookup: 0.0000 secs, 0.0000 secs, 0.0000 secs req write: 0.0001 secs, 0.0000 secs, 0.0117 secs resp wait: 0.9539 secs, 0.3519 secs, 19.4558 secs resp read: 0.0002 secs, 0.0001 secs, 0.0316 secs Status code distribution: [200] 9933 responses Error distribution: [67] Get "http://137.175.30.xxx:32770/": context deadline exceeded (Client.Timeout exceeded while awaiting headers)以上结果反复压测了几次，数据方向基本一致。axel多线程下载测试（第三轮）测试命令time axel -n 32 "http://137.175.30.xxx:32771/test"测试文件为200M，使用axel开启32线程进行下载。socat测试结果：耗时48m44s，最高内存占用5.8Mb左右。real 48m44.111s user 0m1.934s sys 0m10.616sBrook测试结果：耗时36m3.646s，最高内存占用2.9Mb左右。real 36m3.646s user 0m1.730s sys 0m8.930s数据汇总软件名称/测试项socatbrook初始内存800Kb1.8Mbhey压测（耗时）67s44shey压测（max（cpu））32%64%hey压测（错误次数）23867hey压测（max（mem））154Mb25Mbaxel 32线程下载（耗时）48m44s36m3saxel 32线程下载（max（mem））5.8Mb2.9Mb初始内存socat占用比brook更低高并发情况下socat内存占用比brook更高高并发情况下brook CPU占用比socat更高多线程下载，brook效率好于socat总结以上结果仅针对HTTP转发进行压测，由于环境、网络等多方面因素影响，也没仔细研究socat参数，不保障数据100%准确性，有兴趣的同学可以自行测试，针对以上测试数据，给出的建议如下。如果是个人少量使用，并且机器配置较低的情况下建议socat如果并发较大，要求更高的效率，建议选择brook后续将对其它端口转发软件做对比测试，敬请关注。
Docker + Brook + Portainer端口转发WEB管理程序搭建教程
今天给大家介绍的是另一个端口转发程序brook relay，话不多说先看效果图。注意：以下内容需要对Docker使用有一定了解。brook relay能干嘛？先来看一段官方的介绍：brook relay 可以中继任何TCP和UDP server, 这是一个独立的功能, 它不依赖brook server和brook wsserver等请求 <--> relay server <--> 被中继的server不过Brook的功能远不止如何，他还能干嘛，你懂的，有兴趣的可以上官方文档自行了解：https://txthinking.github.io/brook/#/zh-cn/ ，今天主要是介绍brook relay进行端口转发。为什么要使用Docker + BrookBrook使用golang开发，作者已经打包好了二进制文件，安装和使用已经非常简单，简单到只需要几行命令即可完成端口转发操作。来看看官方的演示命令，只需要简单的一行即可完成：#假设你的中继服务器IP是 5.6.7.8, 那么你就可以访问 5.6.7.8:9999等于访问1.2.3.4:9999 brook relay -f :9999 -t 1.2.3.4:9999既然官方命令已经足够简单，为啥还要运行在Docker之上，这不是脱了裤子放屁吗？总结了运行在Docker中的几个好处。当你要转发多个端口时，brook relay管理不太方便难以监控到每个端口转发的内存、CPU、流量使用情况，而使用Docker天然支持对每个容器的监控配合Portainer还可实现WEB界面管理（后面介绍）在Docker中运行brook relay既然已经了解了Brook运行在Docker中的优势，那接下来就开始部署容器。已将brook relay制作好了Docker镜像，如果您已经安装好Docker，输入下面的命令可直接使用：docker run -itd \ --restart=always -e DIP="192.168.1.222" \ -e DPORT="22" \ -p 2293:9999 \ helloz/brook-relay解释下上面命令的作用：--restart=always：当容器出现异常是总是保持自动启动DIP="192.168.1.222"：目标IP-e DPORT="22"：目标端口-p 2293:9999:2293为你中继服务器端口，可自行定义，9999为容器内部端口，这个不要修改，永远保持默认即可假设你中继服务器IP为192.168.1.111，那么连接到192.168.1.111:2293相当于为您转发到了192.168.1.222:22，用过端口转发的同学，相信不难理解。如果需要运行多个端口转发，继续复制上面的命令，并修改中继端口、目标IP、目标端口即可。安装PortainerPortainer是可视化容器管理工具，可以直接在WEB界面对Docker进行管理，安装Portainer是可选的。为了实现WEB管理端口转发，有需要的可以安装Portainer，请继续往下阅读。继续在中继服务器，复制以下命令安装Portainer#创建一个存储 docker volume create portainer_data #运行Portainer docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce然后访问IP:9000打开Portainer界面，根据提示设置管理员账号、密码。选择Docker并进行连接。进入后台找到containers选项，可以看到所有容器，包括刚刚通过Docker命令创建的brook relay端口转发。下面继续用Portainer来演示如何部署一个brook relay端口转发容器。在Portainer左侧找到containers，并点击Add Container按照下图所示填写Name：容器名称，随便填写Image：填写打包好的镜像名字：helloz/brook-relay:latesthost端口自行定义container容器端口保持9999固定不变还没完，继续往下拉，还需要填写目标IP和目标端口。在Advanced container settings这个设置中，点击ENV，并增加2行，按照下图填写。DIP：为目标IPDPORT：为目标端口按照上方设置完毕后，点击界面上的Deploy the container按钮进行部署。部署成功即可在界面上看到我们刚刚创建好的容器。点击Stats按钮，还可以对容器状态进行监控，比如CPU、内存、流量使用情况。可以看到brook relay闲时内存占用在5Mb左右，内存占用非常小。总结利用这个思路你可以将任意端口转发程序，比如rinetd、nginx、socat打包为Docker镜像，再结合Portainer实现WEB管理和状态监控。网上开源的端口转发面板很难实现对CPU、内存、流量监控，而Docker可以原生支持。最后感谢以下开源项目：https://github.com/txthinking/brookhttps://www.portainer.io/