六月学习之Haproxy ACL实践(基本概述)
  eHipUjOuzYYH 2023年11月02日 47 0

1、ACL基本概述

1.1、什么是ACL

ACL主要对请求报文和响应报文进行匹配和过滤,其配置法则通常分为两步
首先定义ACL规则,即定义一个测试条件,条件可以是请求报文的源地址、源端口、目标地址、目标端口、请求方法、URL、文件后缀等
然后在条件得到满足时执行相应的动作,比如阻止请求、又或者转发请求至某特定的后端

1.2、ACL定义方法

#ACL语法
acl <aclname> <criterion> [flags]     [operator]  [<value>] ...
#acl  名称    条件        条件标记位   具体操作符 操作对象类型

#ACL示例:如果请求的User-Agent中包含Chrome且忽略大小写,规则则成立
acl my_chrome hdr(User-Agent) -m sub -i Chrom

<aclname>:ACL名称,可使用字母数字:.-_区分字符大小写

<criterion>:比较的标准和条件
基于源地址、源端口、目标地址、目标端口:src、src_port、dst、dst_port
基于Header信息比对:hdr、hdr_beg、hdr_end、hdr_dom
基于路径或后缀比对:path_beg、path_end
基于请求的方法比对:method

<flags>:条件标记
-i 不区分大小写
-m 使用pattern匹配方法
-n 不做DNS解析
-u 禁止acl重名,否则多个同名的ACL为或的关系

[operator]:条件筛选
-eq、-ne、-ge、-le、-gt、-lt
(-m str):字符串必须完全匹配模式
(-m sub):在提取的字符串中查找,如果其中任何一个被发现,ACl将匹配
(-m beg):在提取的字符串首部中进行查找,如果其中任何一个被发现,ACl将匹配
(-m end):在提取的字符串尾部中进行查找,如果其中任何一个匹配,则ACl进行匹配
(-m dir):提取用斜线/分隔的字符串,如果其中任何一个匹配,则ACl进行匹配
(-m dom):提取用点的.分隔字符串,如果其中任何一个匹配,则ACl进行匹配

<value>:条件目标
布尔值:不如false、true
整数或整数范围,比如用于匹配端口范围:1023~32768
IP地址或IP范围:192.168.0.1~192.168.0.1/24
字符串:比如匹配URL路径,/static、/images

1.3、ACL匹配示例

1.3.1、src

src <string>: 用于测试请求的源地址是否与<string>中定义的源地址一直
#示例:匹配请求源地址是10.0.0.1、或192.168.1.0/24网段
acl deny_src_ip src 10.0.0.1 192.168.1.0/24

1.3.2、dest

dest <string>: 用于测试请求的目标地址是否与<string>中定义的地址一致
dest_port <string>: 用于测试请求的目标端口是否与<string>中定义的端口一致

1.3.3、path_beg

path_beg <string>:用于测试请求的URL是否以<string>指定的模式开头
# 示例:测试URL是否以/static、/images、/javascript
acl url_static path_beg -i /static /images  /javascript

1.3.4、path_end

path_end <string>:用于测试请求的URL是否以<string>指定的模式结尾
# 示例:下面的例子用户测试URL是否以jpg、gif、png、css或js结尾
acl url_static path_end -i .jpg .gif .png .css .js

1.3.5、hdr_beg

hdr_beg <string>:用于测试请求报文的指定首部的开头部分是否符合<string>指定的模式
# 示例:测试请求的host开头是否为 img、video、static
acl host_static hdr_beg(host) -i img. video. static.

1.3.6、hdr_end

hdr_end <string>: 用于测试请求报文的指定首部的结尾部分是否符合<string>指定的模式
# 示例: 测试请求的host的结尾是否为 .com .net .cn
acl host_static hdr_end(host) -i .com .net .cn

1.3.7、hdr_dom

hdr_dom(host): 用于测试请求的host名称
# 示例: 测试请求的host是否为 www.qingchen.cn
acl my_www_host hdr_dom(host) -i www.qingchen.cn
acl my_blog_host hdr_dom(host) -i blog.qingchen.cn
use_backend www_cluster if my_www_host
use_backend blog_cluster if my_blog_host

1.3.8、hdr

hdr <string>: 用于测试请求头部首部指定内容
# 示例: 测试请求的User-Agent是否为Chrome
acl my_chrome hdr(User-Agent) -m sub -i Chrome

1.4、ACL逻辑关系

多个acl作为条件时的逻辑关系:
与:默认,如if acl1 acl2 表示同时满足第一个acl的同时要满足第二acl此条件为真
或:使用or或者||表示,如if acl1 || acl2表示满足acl1或acl2中的任意一个此条件就为真
非:使用!表示,如if ! acl2表示对该ACl取相反的操作,意思就是非该ACL此条件为真

1.5、ACL访问控制

1.5.1、基于HTTP访问控制

配置七层的请求访问控制,只能用在mode http中
http-request { allow | deny } [ { if | unless } <condition> ]

示例:仅允许10.0.0.1访问haproxy的stats
listen haproxy-stats
    mode http
    bind *:7777
    stats enable                    # 启用stats功能
    stats refresh 2s                # 设定自动刷新时间间隔
    stats hide-version              # 隐藏haproxy版本
    stats uri /haproxy?stats        # stats页面的访问路径
    stats realm "HAProxy stats"     # 认证提示信息
    stats auth admin:123456         # 认证的账号和密码
    stats admin if TRUE             # 启用管理功能

    #除10.0.0.1以外的用户全部拒绝
    acl all_ip src 10.0.0.1
    http-request deny if ! all_ip
    #拒绝使用curl
    acl method_curl hdr(User-Agent) -m sub -i curl
    http-request deny if method_curl || !all_ip

六月学习之Haproxy ACL实践(基本概述)_访问控制

六月学习之Haproxy ACL实践(基本概述)_源地址_02

1.5.2、基于TCP访问控制

配置四层的请求访问控制,只能用在mode tcp中
tcp-request connection { accept | reject } [ { if | unless } <condition> ]

示例:拒绝来源tcp应用,比如SSH
listen ssh
    bind *:2222
    mode tcp
    balance roundrobin
    server sshsrv1 172.16.1.7:22 check
    server sshsrv2 172.16.1.8:22 check
    
    acl invalid_src src 172.16.1.9   #定义acl匹配规则
    tcp-request connection reject if invalid_src  #在四层拒绝满足名为invalid_src的acl匹配规则
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  uvM09mQNI0hF   2023年11月19日   27   0   0 sedshell字符串
  vxoexqgjyiCS   2023年11月19日   21   0   0 linux字符串最大匹配
  vxoexqgjyiCS   2023年11月19日   24   0   0 服务器vim字符串