如何分析Haproxy端口复用

发布时间 - 2023-05-29 00:00:00    点击率:

本文作者: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段放在一起

示例:

global
defaults
  log global
  mode tcp
  option dontlognull
  timeout connect 5000
  timeout client 50000
  timeout server 50000

frontend 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 http
backend socks5
  mode tcp
  timeout server 1h
  server ss 127.0.0.1:50000
backend 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协议:

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

速查:

协议 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规则

global
defaults
  timeout connect 5000
  timeout client 50000
  timeout server 50000
frontend 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 socks5
backend socks5
  mode tcp
  timeout server 1h
  server ss 127.0.0.1:50000
backend http
  mode tcp
  server http 127.0.0.1:80
backend ssh
  mode tcp
  server ssh 127.0.0.1:22
backend 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端口

Target2:Win7 x64

IP:192.168.213.129

开启3389端口

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

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

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

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

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日志有记录,说明流量由80先到8888,再回到80。

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

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

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


# 配置文件  # 应用层  # 四层  # 发至  # 重定向  # 后端  # 重启  # 本机  # 数据包  # 转发给 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何快速选择适合个人网站的云服务器配置?  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  装修招标网站设计制作流程,装修招标流程?  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  Laravel中的withCount方法怎么高效统计关联模型数量  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  长沙企业网站制作哪家好,长沙水业集团官方网站?  如何快速生成可下载的建站源码工具?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  如何实现建站之星域名转发设置?  专业商城网站制作公司有哪些,pi商城官网是哪个?  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  千库网官网入口推荐 千库网设计创意平台入口  iOS UIView常见属性方法小结  网站制作报价单模板图片,小松挖机官方网站报价?  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  如何基于PHP生成高效IDC网络公司建站源码?  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  如何选择PHP开源工具快速搭建网站?  如何在Windows服务器上快速搭建网站?  中山网站制作网页,中山新生登记系统登记流程?  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  如何在阿里云香港服务器快速搭建网站?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  如何在IIS7上新建站点并设置安全权限?  ,怎么在广州志愿者网站注册?  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  如何构建满足综合性能需求的优质建站方案?  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  网站优化排名时,需要考虑哪些问题呢?  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  七夕网站制作视频,七夕大促活动怎么报名?  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  如何快速搭建自助建站会员专属系统?  Laravel怎么使用Intervention Image库处理图片上传和缩放  javascript中的try catch异常捕获机制用法分析  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  php打包exe后无法访问网络共享_共享权限设置方法【教程】  如何在万网利用已有域名快速建站?  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  如何在局域网内绑定自建网站域名?  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口