出品|MS08067实验室(www.ms08067.com)

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

1.概述

  Haproxy是一个使用c语言开发的高性能负载均衡代理软件,提供tcp和http的应用程序代理,免费、快速且可靠。

  类似frp,使用一个配置文件+一个server就可以运行。

优点:

  • 大型业务领域应用广泛
  • 支持四层代理(传输层)以及七层代理(应用层)
  • 支持acl(访问控制列表),可灵活配置路由
  • windows使用cygwin编译后可运行(可跨平台)

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

2.配置

  官方配置手册:

  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中需要编写具体的操作,就是转达到哪个目标的哪个端口。

3.思路

(1) 思路一(通用)

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

(2) 思路二

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

4.步骤

以思路一为例:

  1. 通过wireshark捕获tpkt(应用层数据传输协议)信息
  2. 编写acl规则路由进行流量分发
  3. 添加后端server
  4. 原始接口接管
  5. 完成

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上。

5.实验

  • 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日志:

6.端口重定向

  为了不影响正常的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端口转发规则。

7.参考链接

转载请联系作者并注明出处!

一文打尽端口复用 VS Haproxy端口复用的更多相关文章

  1. winServer2003除默认端口外的其他端口只能本地访问,关闭防火墙即可

    winServer2003除默认端口外的其他端口只能本地访问,关闭防火墙即可

  2. ubuntu中使用nginx把本地80端口转到其他端口

    ubuntu中使用nginx把本地80端口转到其他端口 因为只是在开发的过程中遇到要使用域名的方式访问, 而linux默认把1024以下的端口全部禁用. 在网上找了N多方式开启80端口无果后, 方才想 ...

  3. Tp-link路由器怎么设置端口映射 内网端口映射听语音

    https://jingyan.baidu.com/article/ca00d56c710ef9e99eebcf85.html 只有一台能上网的电脑就可以自己免费搭建服务器,本经验简单介绍家用tp-l ...

  4. PC端的软件端口和adb 5037端口冲突解决方案

    引用https://www.aliyun.com/jiaocheng/32552.html 阿里云 >  教程中心   >  android教程 >  PC端的软件端口和adb 50 ...

  5. Centos查看端口占用和开启端口命令

    Centos查看端口占用情况命令,比如查看80端口占用情况使用如下命令: lsof -i tcp:80 列出所有端口 netstat -ntlp 1.开启端口(以80端口为例) 方法一: /sbin/ ...

  6. docker上部署nginx容器80端口自动转443端口

    拉去nginx镜像 # docker pull nginx 运行nginx容器config用于拷贝nginx配置文件 # docker run --name nginxconfig -d docker ...

  7. 1.3.6、CDH 搭建Hadoop在安装之前(端口---DistCp使用的端口)

    DistCp使用的端口 列出的所有端口都是TCP. 在下表中,每个端口的“ 访问要求”列通常是“内部”或“外部”.在此上下文中,“内部”表示端口仅用于组件之间的通信; “外部”表示该端口可用于内部或外 ...

  8. linux将80端口映射到指定端口命令

    1.添加一个端口映射 将80端口映射到8088端口命令如下: iptables -t nat -I PREROUTING -p tcp --dport 80-j REDIRECT --to-port ...

  9. 设置nginx反向代理将80端口转发到9999端口

    关于linux系统不允许个人账户使用80端口,导致无法将express默认的bin/www内3000端口改为80端口一个问题,可以使用sudo来强制启动,当然,这样显然不合适,这时候,可以使用ngin ...

随机推荐

  1. grpc系列- protobuf详解

    Protocol Buffers 是一种与语言.平台无关,可扩展的序列化结构化数据的方法,常用于通信协议,数据存储等等.相较于 JSON.XML,它更小.更快.更简单,因此也更受开发人员的青眯. 基本 ...

  2. LVS之2---基于LVS负载均衡集群架构

    LVS之2---基于LVS负载均衡集群架构实现 目录 LVS之2---基于LVS负载均衡集群架构实现 ipvsadm software package Options 常用命令 保存及重载规则 内存映 ...

  3. r5 5600H 怎么样 相当于什么水平

    Ryzen 5 5600H是基于Zen 3架构的6核12线程处理器.它具有3.30 GHz的默认频率和4.25GHz的加速频率,带有16MB的L3缓存和3 MB的L2缓存,显卡部分,AMD搭配的Veg ...

  4. 2021年了,`IEnumerator`、`IEnumerable`还傻傻分不清楚?

    IEnumerator.IEnumerable这两个接口单词相近.含义相关,傻傻分不清楚. 入行多年,一直没有系统性梳理这对李逵李鬼. 最近本人在怼着why神的<其实吧,LRU也就那么回事> ...

  5. 比较Power BI和Tableau,好比用奔驰对比奥迪

    经常会有人问Power BI和Tableau的区别,好吧,为了非IT专业的能看懂,咱们就用车,奔驰和奥迪来对比一下.因为他们确实有太多相似之处. 所以Power BI VS Tableau,就相当于国 ...

  6. Centos7安装Jenkins和目录迁移

    Centos7安装Jenkins和目录迁移 内容: 安装Jenkins和相关的配置 尝试目录迁移,模拟磁盘空间不足 1. 安装Jenkins和配置 安装 根据Jenkins的官方安装指引,安装步骤如下 ...

  7. 如何实现CentOS服务器的扩容??

    Linux的硬盘识别: 一般使用"fdisk -l"命令可以列出系统中当前连接的硬盘 设备和分区信息.新硬盘没有分区信息,则只显示硬盘大小信息. 1.关闭服务器加上新硬盘 2.启动 ...

  8. hugo建站 | 我的第一个博客网站

    前言 博客地址 - https://billie52707.cn 1. 建博客的初衷? 2020那一年,八月的第一天,我还是像往常一样打开我的域名网站,本以为还是会像以前一样显示每日一图的界面,结果出 ...

  9. 在项目中应该使用Boolean还是使用boolean?

    起因 在公司看代码时,看到了使用Boolean对象来完成业务逻辑判断的操作.和我的习惯不一致,于是引起了一些反思. boolean和Boolean的差别咱就不说了,我们仅探讨使用boolean与Boo ...

  10. 【Linux】 多个会话同时执行命令后history记录不全的解决方案

    基本认识 linux默认配置是当打开一个shell终端后,执行的所有命令均不会写入到~/.bash_history文件中,只有当前用户退出后才会写入,这期间发生的所有命令其它终端是感知不到的. 问题场 ...