HAProxy 根据报文解析来定义不同的acl

文章介绍了如何在HAProxy中使用ACL检查TCP报文和JSONpayload,包括基于payload内容、正则表达式匹配和Base64解码的应用实例。

1 .在 HAProxy 中使用 ACLs(Access Control Lists)检查 TCP 报文内容时,你可以使用 payload 关键字。以下是一个例子,演示如何在 HAProxy 的 ACL 中使用 payload


frontend my_frontend
  bind *:80
  mode tcp

  acl payload_hello req.payload(0,7) -m bin 68656c6c6f21
  acl payload_world req.payload(7,5) -m bin 776f726c64

  use_backend backend_hello if payload_hello
  use_backend backend_world if payload_world

backend backend_hello
  mode tcp
  server server_hello 192.168.1.10:8080

backend backend_world
  mode tcp
  server server_world 192.168.1.11:8080

在这个例子中:

  • acl is_hello payload(0,7) -m bin 68656c6c6f21 表示如果 TCP 报文的内容的前7个字节与二进制值 68656c6c6f21 匹配(即 "hello!" 的二进制表示),则定义了一个名为 is_hello 的 ACL。
  • tcp-request content accept if is_hello 表示如果 is_hello ACL 匹配,则接受此连接。
  • tcp-request content reject 表示如果没有

2. 在 HAProxy 中使用 ACL(Access Control List)来检查 JSON payload,你需要使用 payload 指令,并结合 base64converterstr 等关键词来处理 JSON 数据。以下是一个简单的例子,假设你的 JSON 数据被 Base64 编码:

# 定义一个 ACL 用于匹配 JSON payload
acl is_valid_json_payload req.payload(0,base64) -m reg \{.*"key":"value".*\}

# 使用 ACL 进行条件判断
use_backend backend1 if is_valid_json_payload
use_backend backend2 if !is_valid_json_payload

在这个例子中:

  • req.payload(0,base64) 用于提取请求的 Base64 编码的 payload 数据。
  • -m reg \{.*"key":"value".*\} 用于使用正则表达式检查 payload 中是否包含特定的 JSON 键值对(在这个例子中,键是 "key",值是 "value")。

请注意,这只是一个简单的演示例子,实际中你可能需要根据你的 JSON 结构和匹配条件进行适当的调整。确保根据实际需要定义正确的 ACL 条件。

如果 JSON 数据没有被 Base64 编码,可以省略 base64 部分,直接使用 req.payload(0) 来提取未编码的 JSON 数据。

请注意,HAProxy 的 ACL 不是专门设计用于处理 JSON 数据的,而是一般用于 HTTP 请求的条件匹配。因此,复杂的 JSON 结构和条件可能需要更高级的工具或自定义解决方案。

3.在 HAProxy 中,你可以使用 ACL(Access Control List)来检查 JSON payload 是否不包含某个 key,并根据条件返回一个 JSON 串。以下是一个简单的示例,假设你希望在 JSON payload 中不包含 "key" 时返回一个特定的 JSON 串:

# 定义一个 ACL 用于检查 JSON payload 不包含特定的 key
acl json_does_not_contain_key req.payload(0) -m reg \{[^\}]*"key"[^\}]*\}

# 使用 ACL 进行条件判断
http-response set-header Content-Type application/json if json_does_not_contain_key
http-response return 200 '{"message": "Key is missing"}' if json_does_not_contain_key

在这个例子中:

  • req.payload(0) 用于提取请求的未编码的 JSON payload 数据。
  • -m reg \{[^\}]*"key"[^\}]*\} 用于使用正则表达式检查 payload 中是否包含 "key"。如果不包含,ACL 将匹配。

接下来,通过 http-response set-header 设置返回的 HTTP 头,确保它表明返回的内容类型是 JSON。然后,使用 http-response return 返回一个自定义的 JSON 串。

请注意,这只是一个简单的演示例子,实际中你可能需要根据你的 JSON 结构和匹配条件进行适当的调整。确保根据实际需要定义正确的 ACL 条件和返回内容。

4.

在 HAProxy 中,对于 TCP 流量,你可以使用 tcp-request contentcontent 指令结合正则表达式来检查 JSON payload 是否不包含某个 key,然后返回一个 JSON 串。以下是一个简单的示例,假设你希望在 JSON payload 中不包含 "key" 时返回一个特定的 JSON 串

frontend your_frontend
  bind :80
  mode tcp
  option tcplog

  tcp-request content reject if { req.payload(0,raw) -m reg \{[^\}]*"key"[^\}]*\} -m found }
  tcp-response content add Content-Type:\ application/json if !{ req.payload(0,raw) -m reg \{[^\}]*"key"[^\}]*\} -m found }
  tcp-response content add \{ "message": "Key is missing" \} if !{ req.payload(0,raw) -m reg \{[^\}]*"key"[^\}]*\} -m found }

在这个例子中:

  • req.payload(0,raw) 用于提取 TCP 请求的原始(未解码)payload 数据。
  • -m reg \{[^\}]*"key"[^\}]*\} 用于使用正则表达式检查 payload 中是否包含 "key"。如果不包含,ACL 将匹配。

然后,通过 tcp-response content 指令设置响应内容,包括 Content-Type 和返回的 JSON 串。

请注意,这只是一个简单的演示例子,实际中你可能需要根据你的 JSON 结构和匹配条件进行适当的调整。确保根据实际需要定义正确的条件和返回内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

opdolo

一分钱也是爱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值