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

发布时间:2023年12月17日

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 结构和匹配条件进行适当的调整。确保根据实际需要定义正确的条件和返回内容。

文章来源:https://blog.csdn.net/a1058926697/article/details/134967734
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。