如何分析Haproxy端口复用

本文作者:Spark(Ms08067内网安全小组成员)

一、概述

Haproxy是一个使用c语言开发的高性能负载均衡代理软件,提供tcp和http的应用程序代理,免费、快速且可靠。
类似frp,使用一个配置文件+一个server就可以运行。
优点:

大型业务领域应用广泛

支持四层代理(传输层)以及七层代理(应用层)

支持acl(访问控制列表),可灵活配置路由

windows使用cygwin编译后可运行(可跨平台)

访问控制列表(Access Control Lists,ACL)是应用在路由器接口的指令列表,这些指令列表用来告诉路由器哪些数据包可以接受,哪些数据包需要拒绝。

二、配置

官方配置手册:https://cbonte.github.io/haproxy-dconv/2.2/configuration.html
配置文件由全局配置和代理配置组成:
全局配置(global):定义haproxy进程管理安全及性能相关的参数

代理设定(proxies):

defaults:为其他配置段提供默认参数,默认配置参数可由下一个”defaults”重新设定

frontend:定义一系列监听的套接字,这些套接字可接受客户端请求并与之建立连接

backend:定义”后端”服务器,前端代理服务器将会把哭护短的请求调度至这些服务器

listen:定义监听的套接字和后端的服务器,类似于将frontend和backend段放在一起

示例:

globaldefaults  log global  mode tcp  option dontlognull  timeout connect 5000  timeout client 50000  timeout server 50000frontend main  mode tcp  bind *:8888  option forwardfor except 127.0.0.1  option forwardfor header X‐Real‐IP# 配置acl规则  acl is‐proxy‐now urlp_reg(proxy) ^(http|https|socks5)$# 分发到对应的backend  use_backend socks5 if is‐proxy‐now  use_backend httpbackend socks5  mode tcp  timeout server 1h  server ss 127.0.0.1:50000backend http  mode tcp  server http 127.0.0.1:80

重点关注frontend和backend。
Frontend中需要编写acl规则,配置转发。比如,当http流量来的时候,转发给web服务;当rdp流量来的时候,转发给rdp服务。
Backend中需要编写具体的操作,就是转达到哪个目标的哪个端口

三、思路

(1) 思路一(通用)

编写acl规则,在四层(传输层)进行负载,根据协议类型进行分发,例如:遇到http流量发送给http服务,遇到rdp发送给rdp服务等。

(2) 思路二

编写acl规则,在七层(应用层)进行负载,判断应用类型进行分发,例如,遇到http分发到http服务,否则发送到xxx服务。

四、步骤

以思路一为例:

通过wireshark捕获tpkt(应用层数据传输协议)信息

编写acl规则路由进行流量分发

添加后端server

原始接口接管

完成

4.1 捕获tpkt

关于tpkt可百度或查看参考链接
三次握手后,开始应用层数据传输。
使用wireshark抓包:
ssh协议:
如何分析Haproxy端口复用

前三个包为三次握手,第四个包的起始三位,便是我们需要的tpkt,例如ssh为535348。
rdp协议:030000

如何分析Haproxy端口复用速查:

协议 TPKT
SSH 535348
RDP 030000
HTTP(GET) 474554
HTTP(POS) 504f53
HTTP(PUT) 505554
HTTP(DEL) 44454c
HTTP(OPT) 4f5054
HTTP(HEA) 484541
HTTP(CON) 434f4e
HTTP(TRA) 545241
HTTPS 160301

4.2 编写acl规则

globaldefaults  timeout connect 5000  timeout client 50000  timeout server 50000frontend main  mode tcp  bind *:8888# 重点:编写acl规则进行转发  tcp‐request inspect‐delay 3s  acl is_http req.payload(0,3) ‐m bin 474554 504f53 505554 44454c 4f5054 484541 434f4e 545241  acl is_ssh req.payload(0,3) ‐m bin 535348  acl is_rdp req.payload(0,3) ‐m bin 030000# 设置四层允许通过  tcp‐request content accept if is_http  tcp‐request content accept if is_ssh  tcp‐request content accept if is_rdp  tcp‐request content accept# 分发到对应的backend  use_backend http if is_http  use_backend ssh if is_ssh  use_backend rdp if is_rdp  use_backend socks5backend socks5  mode tcp  timeout server 1h  server ss 127.0.0.1:50000backend http  mode tcp  server http 127.0.0.1:80backend ssh  mode tcp  server ssh 127.0.0.1:22backend rdp  mode tcp  server rdp 192.168.213.129:3389

该配置文件的功能是监听8888端口,将http流量(速查表中http协议的8种tpkt)转发到本地的80上,将ssh流量转发到本地的22端口上,将rdp流量转发到另一主机的3389上。

五、实验

Target1:Ubuntu 16.04 x64

IP:192.168.213.128

开启22端口、80端口

如何分析Haproxy端口复用

Target2:Win7 x64

IP:192.168.213.129

开启3389端口

如何分析Haproxy端口复用

启动haproxy,-f 指定配置文件,开启8888端口表示启动成功。-d:调试模式,可不加。

如何分析Haproxy端口复用

HTTP协议:访问靶机的8888端口,流量被haproxy分发至本机的80。

如何分析Haproxy端口复用

RDP协议:访问靶机的8888端口,流量被haproxy分发至192.168.213.129的3389。

如何分析Haproxy端口复用SSH协议:访问靶机的8888端口,流量被haproxy分发至本机的22。

如何分析Haproxy端口复用

haproxy日志:

如何分析Haproxy端口复用

六、端口重定向

为了不影响正常的80端口的访问,将过来的80端口流量转发到8888端口上。这样用户正常访问80端口时,流量会先转发到8888端口上,再由haproxy转发回80端口。

  • Linux:iptables(不需要重启服务)

iptables ‐t nat ‐A PREROUTING ‐i eth0 ‐p tcp ‐‐dport 80 ‐j REDIRECT ‐‐to‐port 8888

访问80可以正常访问:

如何分析Haproxy端口复用

Haproxy日志有记录,说明流量由80先到8888,再回到80。

如何分析Haproxy端口复用

  • Windows:netsh(需要重启web服务)

netsh interface portproxy add v4tov4 listenport=80 connectport=8888 connectaddress=127.0.0.1

注意:如果在windows下启用端口重定向,需要在端口启动前添加netsh端口转发规则。

看完上述内容,你们掌握如何分析Haproxy端口复用的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

文章标题:如何分析Haproxy端口复用,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/24337

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年9月10日 下午11:54
下一篇 2022年9月10日 下午11:56

相关推荐

  • mysql怎么设置最大连接数

    方法一:命令行修改 我们只需要打开mysql的控制台,输入“set GLOBAL max_connections=1000;”语句,就可直接设置最大连接数,如下图所示: 注:这种方法标不治本,只能暂时的修改最大连接数,一点重启mysql,最大连接数又会变回原先设置的值。 方法二:通过mysql配置文…

    2022年9月15日
    61600
  • redis实现清空缓存的方法是什么

    正文 1.首先进到redis的安装目录,进到src目录下,找到redis-cli 2.首先用账号密码的方式进入到redis的服务端 ./redis-cli -h 127.0.0.1 -p 6379 -a 1234 进去后会出现下面的界面ip:port>,你就可以操作啦 3. flushdb —…

    2022年8月29日
    63500
  • MySQL基于GTID主从搭建怎么实现

    一、用xtarbackup备份数据库 1.1 优势 使用xtarbackup来做主从的前期准备是因为xtarbackup备份数据和恢复数据都很快,特别适合数据量很大的数据库备份,而且它的安装非常的简单,使用也很简单….(巴拉巴拉,废话编不出来了)。 1.2 安装 具体版本根据自己的具体情…

    2022年8月27日
    43400
  • 怎么修改pip install默认安装路径

    1. 修改pip install默认安装路径 一般使用Anaconda时会使用 pip install ### 来安装各类包,但默认安装路径在C盘,极大占用空间,作为强迫症,我们通过以下步骤来修改默认安装路径。 1.1 查看pip 默认安装位置 名列前茅步:通过win菜单,找到Prompt,点击进入…

    2022年8月30日
    3.7K00
  • IDEA类存在但找不到如何解决

    1.刷新maven项目 2.清理idea缓存 3.maven clean install 4.重新bulid 5.如果使用了lombok插件开启之后重新build 6.maven依赖冲突导致 1.打开当前maven模块或者,父类模块对应的pom,哪个模块有冲突进入那个模块!2.ctlr+alt+sh…

    2022年9月21日
    1.7K00
  • windows softcnkiller怎么使用

    softcnkiller使用方法 1、首先下载这款软件。 2、下载完成后将下载好的压缩包解压出来。 3、解压完成后进入文件夹,运行“softcnkiller.exe” 4、打开后软件会自动扫描你系统之中存在的流氓软件。 5、对于你想要处理的内容,只要选中它,并点击右下角“处理选中” 6、软件逻辑是通…

    2022年9月21日
    70300
  • Android开发怎么自定义实时图表控件

    今天分享文章“Android开发怎么自定义实时图表控件”,主要从:演示、环境、实现、第十一步:绘制等几个方面为大家介绍,希望能帮到您。 演示 环境 开发工具:Android Studio 开发语言:Kotlin 实现 名列前茅步:新建项目RealTimeChartDemo 第二步:新建RealTim…

    2022年6月29日
    53400
  • 导入mdf文件损坏如何解决

    解决方法: 1、安装D-RecoveryForMSSQLServer软件。 2、进入主界面。 3、点击“打开数据库文件”。 4、选择损坏文件点击“确定”。 5、左侧为打开文件。 6、点击把所有表导入数据库。 7、将信息填完整即可。 以上就是关于“导入mdf文件损坏如何解决”这篇文章的内容,相信大家都…

    2022年9月8日
    47400
  • 子网掩码和ip地址的关系介绍

    子网掩码和ip地址的关系:1、子网掩码是用来判断两台计算机的ip地址是否属于同一子网络的根据,也即子网掩码和ip地址可以确定少数地址的关系;2、把子网掩码和ip地址进行二进制换算进行and算法,就是对外的少数地址;3、子网掩码可以用于区分网络地址和主机地址。 子网掩码和ip地址的关系是什么 IP地址…

    2022年9月13日
    1.7K00
  • 怎么分析Facebook Ads广告业务API接口的源代码泄露漏洞

    发现漏洞 一个多月后,我就发现了存在Facebook Ads广告业务系统API中的一个漏洞。存在漏洞的API是一个图片处理接口,它用于Facebook商户账户上传广告图片,上传的图片会储存在一个名为“/adimages”的目录下,并用base64格式编码。所以,我的测试构想是,在这里的机制中,可以向…

    2022年9月19日
    62100
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部