ACL定制法则:

开放策略:拒绝所有,只开放已知

拒绝策略:允许所有,只拒绝某些

事实上实现安全策略,无非也就是以上两种方法

redirect

参考:http://cbonte.github.io/haproxy-dconv/configuration-1.4.html#4-redirect

如果符合某种特定条件,则返回某种新的前缀

acl clear         dst_port 80
acl secure         dst_port 8080
acl login_page      url_beg         /login

#如果url的地址,除了主机名之外是login的页面则定义成logon,如果是登录页面却又属于不安全的连接 那么
acl logout         url_beg         /logout
acl uid_given        url_reg          /login?userid=[^&]+
acl cookie_set       hdr_sub(cookie)SEEN=1                         #取得cookie的子串,如果没有cookie则:

redirect prefix   https://mysite.com set-cookie SEEN=1 if!cookie_set        #如果定义的第一个用户来访问我们的站点的时候,没有被设置cookie 在将用户的请求转为https

redirect prefix  https://mysite.com             iflogin_page !secure
redirect prefix   http://mysite.com drop-query             if login_page !uid_given
redirect locationhttp://mysite.com/               if !login_page secure
redirect location / clear-cookie USERID=               if logout

我们自定定义一个acl

如果访问的是/bbs开头的地址,那么将其跳转到/forum

acl acbbs url_beg/bbs

redirect /forum if/bbs     #if判断是否匹配/bbs  如果匹配则将/bbs 跳转至/forum

只不过对于haproxy来讲需要基于acl的机制来实现,所以要比nginx要麻烦一点

reqadd

如果访问的是ssl则则加入X-Proto首部

acl is-ssldst_prot 81

reqadd X-Proto:\SSL if is-ssl

rspadd

响应报文首部,所有响应首部都需要经过haproxy,因此经过haproxy的时候,想通告其客户端是通过haproxy来转发过来的,因此这时候会在首部添加一个 X-Via首部,明确说明是通过代理服务器转发的

#只要是通过haproxy转发的请求统统添加首部信息,如下所示:

rspadd X-Via:\ 10.0.10.61        #haproxy的IP地址

Server的检测机制

backup

check

disabled

fall          #检测机[1]制,检测超过几次认为失败

inter          #检测的时间间隔

另外inter还可以对其做优化:

fastinter       #快速检测

downinter       #慢速检测

以上可以做启发式检测,如果发现故障了可以将其快速检测几次

限制最大连接数

Maxconn参数为最大连接数,可以将其限制最大连接数,如下所示

backend webserver
    balance uri
    hash-type consistent
    server   web1 10.0.10.82:80 check  weight 1 maxconn 2000
    server   web2 10.0.10.83:80 check  weight 1 maxconn 3000

访问管理页面:

如果请求过多,所有超出这个最大连接数 ,如果还被转发至这个服务器中会被放入至等待队列中,如果队列也超时了,这个请求则会直接被响应403

maxqueue

维持每个队列的长度

minconn

最少连接,用来将maxconn定制为动态值

observer<mode>

健康状态监测,如果存活则不对其检查
可以根据4/7层做观测

redir

所有发往这个服务器的请求做重定向,因此可以实现单台服务器的重定向

实现重定向:

server  web1 10.0.10.82:80 check  weight 1 maxconn 2000 redir http://www.baidu.com

访问测试,可发现最后访问其haproxy的IP地址 最后被跳转至百度页面中了

slowstart

让haproxy支持慢启动,但是对于haproxy来讲第一启动是没有任何意义的

慢启动只在服务器故障又重新上线的时候才有效果

weight

权重

HAproxy 的 ACL 机制

http访问控制参数

rediect blockhttp-request use_backend

但凡是使用if的时候必须使用acl进行定义,访问控制列表的定义可以通过源地址/目标地址,源端口目标端口来定义,所以acl中所支持定义的标准和机制还是比较多的

定义ACLacl <aclname> <creterion> [flags][operator] <value>

·ACL     基本定义语法

·acl     名称 acl标准 [标志位][操作]

·acl     区分大小写

通常参数都是 -i

值的类型

e.g 1024:65535

比较操作

eg ge gt le lt

字符串

常用参数  -i

常用的匹配标准:

dst       目标地址

dst_port    目标端口

src       源地址

src_prot    源端口

acl goodguys src ip/24             如果是goodguys则允许访问

tcp-request content accept if goodguys   如果是goodguys则允许发起连接请求

tcp-request content reject          没有if语句 则拒绝所有(reject)

============================================================================

 

基于SRC做访问控制

我们期望用户访问的时候如果来源地址是10.0.10.1则拒绝访问

frontend  web_server

bind*:80

default_backend webservers

acl badguy src 10.0.10.1

block if badguy

#acl定义规则名称为badguy,并且定义如果来源是10.0.10.1的IP地址拒绝访问

#block表示拒绝的意思,if后面加判断,如果匹配badguy名称定义的规则那么就执行block的操作

==>访问效果 403 Forbidden

使用重定向

如果想访问403页面重定向到其他页面的话,则:

frontend web_server
      bind *:80

      default_backend webserver

      acl badguy src 10.0.10.1
       block if badguy
       errorloc 403 http://baidu.com/     #定义403错误页面重定向

在七层做其他的匹配

hdr(header) <string>  检查首部是否属于某个指定字符的

  frontend web_server
    bind *:80
    default_backend webserver
    acl badguy src 10.0.10.1
    acl dstipaddr hdr(Host) 10.0.10.61
    redirect location  http://www.qq.com/ if dstipaddr
    errorloc 403 http://baidu.com

#以上,通过har机制检测 如果头部信息包含此IP地址10.0.10.61那么将其重定向至qq.com

#如果非此IP地址,那么请求的uri返回是403,那么则直接跳转到baidu.com

hdr_reg(header) <redex> 正则表达式匹配  说明某个首部的值只要匹配这个正则,则执行跳转

http_first_req  第一次请求匹配

method <string>  访问方法匹配(GET或POST等)

实现简单动静分离功能

  acl read method GET

  acl read method HEAD

  acl write method PUT

  acl write method POST

  use_backend imgser  if read

  use_backend upload  if write

基于path http路径做访问控制

path <string>

是做精确匹配的,因此通常只匹配用户已经知道的文件路径

来自某个ip的主机访问的是1.html 则拒绝访问,其他全部放行,则:

#首先定义acl 名称denyfile 根据path来做访问控制,而path一定跟的是具体访问路径

#http-reques 来做规则 如果是badguy 并且访问的是denyfile 如果匹配两者则deny掉

frontend web_server
    bind *:80
    default_backend webserver
    acl badguy src 10.0.10.1
    acl denyfile path/1.html
    http-request deny if badguy denyfile

==>重新加载配置文件,并且访问测试:访问/1.html 则返回403 ,访问其他uri则正常返回

path_beg <string>

path只能定义单一路径或文件,但是path_beg可以定义多个文件或路径

实例:实现动静分离功能

首先定义两个backend,分别以动态和静态进行分组

  backend jingtai
    balance roundrobin
    server   web1 10.0.10.82:80 check  weight 1maxconn 2000

  backend dongtai
    balance roundrobin
    server   web2 10.0.10.83:80 check  weight 1maxconn 3000

配置frontend

  frontend  web_server

bind *:80

default_backend webservers

acl badguy src 10.0.10.1

acl denyfile path /1.html

#http-request deny if badguy denyfile

acl static path_end .html

use_backend   jingtai if static

default_backend dongtai

#定义acl名称为static ,如果访问匹配是.html结尾的文件,那么直接跳转至jingtai 这个backend

#如果访问的不匹配.html 那么直接跳转至默认backend dongtai组

实现完全动静分离

path_end中可以使用-i参数指定多个选项

修改配置信息,将一系列尽可能出现的静态内容文件类型加入acl的static组内

bind *:80

default_backend webservers

acl badguy src 10.0.10.1

acl denyfile path /1.html

#http-request deny if badguy denyfile

acl static path_end -i .html .jpg .png.jpeg .gif .swf .css .xml .txt .pdf

use_backend jingtai if static

default_backend dongtai

path_reg <regex>正在表达式匹配

acl url_static  path_reg  -i .jpg$ .html$  ^/static ^/images^/stylsheets

基于正则表达式匹配要比基于字符匹配慢很多,所以如果可以写成字符匹配就尽可能使用 path_end path_end 而不要使用path_reg

url <string>

之前我们在用path做匹配的时候发现,path不包含头部信息,而url全部包含

做url匹配要做整个路径匹配,但事实上用的最多的是path 而不是url,以为用户访问文件的时候,可能是这样访问:

http://xxx.com/login.PHP?name=test&password=xxxx

很显然login.php 才是访问的文件,而根据整个路径结尾进行判断的话则不能判断其类型的,所以更多用到的是path_end ,因为path_end顶多只能匹配到login.php,而不包含后面的内容

url_beg <string>  url开头

url_end <string>  url结尾

有些时候我们用url做匹配的时候可能会使用多条进行组合起来

比如:

如果badguy 访问的是除了denyfile之外的其他文件,则将被拒绝

http-request deny  if badguy !denyfile

如果badguy或其他人访问的是除了denyfile之外的其他文件,则将被拒绝

http-request deny  if badguy OR denyfile

健康状态检查机制

monitor-uri

通过web组件实现监控的,明确指定监控哪个uri而不是内部监控机制(check)

frontend www

bind :80

monitor-uri   /haproxy

意思为做状态监测必须去请求这个uri的页面,能请求到并且状态为200则认为正常的

httpchk

做服务器的健康状态监测的时候明确说明http协议,可以指定检查那个uri,还可以指定那种方式检查uri,只启用就明确说明只做uri监测 而后面的监测方法全部省略了

backendhttps_relay
    mode tcp
    option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
    server apache1 192.168.1.1:443 check port 80

也就意味着我们做健康检测的时候,是发送自定义信息去check

也就是说httpchk是发送的自定义的方法以及发送的请求报文格式的,只有发送的请求返回值是200,才认为正常否则失败的

http请求格式:

<method><uri> <version>

<header>

<body>

将OPTIONS *HTTP/1.1\r\nHost:\ www 转换成标准格式,如下所示:

OPTIONS * HTTP/1.1

Host: www

例:定义对MySQL进行检测

option mysqlchkuser mysqlusername

使用option参数套mysqlchk插件以mysqlusername的名称去连接mysql,只要能连接上,则认为数据库正常,否则不允许连接

综合示例:

示例1.实现动静分离

匹配以/static/images /img /css 目录的URI,并匹配以静态文件内容的URI

acl usr_static path_beg -i /static /images /img /css

acl usr_static path_end -i .gif .png .jpg

#判断用户访问如果主机名以www开头的话则标示为host_www

acl host_www hdr_beg(host) -i www

#如果主机是以img video download 的域名开头,都被认为是静态内容

acl host_static hdr_beg(host) -i img. video. download.

#而后做匹配内容,如果三者匹配其中一个则分发至backend static组

use_backend static if host_static or host_www or url_static

default_backend appservers

实例                 
global
    pidfile /var/run/haproxy.pid
    log 127.0.0.1 local0 info

defaults
  mode http
  clitimeout        600000   # maximum inactivity time on the client side
  srvtimeout        600000   # maximum inactivity time on the server side
  timeout connect      8000    # maximum time to wait for aconnection attempt to a server to succeed

stats enable
    stats auth        admin:password
    stats uri        /monitor
    stats refresh      5s
    option httpchk      GET /status
    retries          5
    option redispatch
    errorfile 503 /path/to/503.text.file

balance roundrobin     # each server isused in turns, according to assigned weight

frontend http
    bind :80
    monitor-uri   /haproxy  # end point tomonitor HAProxy status (returns 200)

#只要用户访问的path路径是以api开头则匹配 /api1/a.php /api1/ /api1
    acl api1 path_reg ^/api1/?
    acl api2 path_reg ^/api2/?

#如果是api1的话则使用backend api1 以此类推
    use_backend api1 if api1
    use_backend api2 if api2

backend api1
    # option httpclose
    server srv0 127.0.0.1:9000 weight 1 maxconn 100 check inter4000
    server srv1 127.0.0.1:9001 weight 1 maxconn 100 check inter4000
    server srv2 127.0.0.1:9002 weight 1 maxconn 100 check inter4000
backend api2
    option httpclose
    server srv01 127.0.0.1:8000 weight 1 maxconn 50 check inter 4000

#但是没有默认服务器也就意味着只允许用户请求api1api2,以别的任何方式都访问不到

haproxylisten配置示例:

基于COOKIE做持久连接

只要在listen中还是在backend中是要使用cookie指令 就意味着server中去引用这个cookie的,每个用户都加上sessionid,因此会为每个用户请求插入一个会话ID,因此基于这个会话id做负载均衡调度

listen webfarm
    bind 192.168.0.99:80
    mode http
    stats enable
    stats auth someuser:somepassword             #指定某个用户某个密码
    balance roundrobin                   #指定调度算法
    cookie JSESSIONID prefix               #基于cookie做负载均衡
    option httpclose

    option forwardfor                   #添加首部信息
    option httpchk HEAD /check.txt HTTP/1.0    #http首部请求的方法是head 请求的是 /check.txt 协议是1.0 ,没有跟主机就意味着请求的是默认主机,而不是检测虚拟主机
    server webA 192.168.0.102:80 cookie A check     #使用cookie做了负载均衡
    server webB 192.168.0.103:80 cookie B check

对mysql读集群做负载均衡

只是对于读请求可以做负载均衡,如果对于写做负载均衡的时候直接这样调度是不合适的

frontend mysqlservers
     bind *:3306
     default_backend myservs

backend myservs
     balance leastconn
     option mysqlchk user root
     server myserv1 172.16.100.11:3306 check
     server myserv2 172.16.100.12:3306 check

blog.csdn.net/tantexian

HAproxy负载均衡-ACL篇的更多相关文章

  1. HAproxy负载均衡-ACL篇(转) blog.csdn.net/tantexian

    ACL定制法则: 开放策略:拒绝所有,只开放已知 拒绝策略:允许所有,只拒绝某些 事实上实现安全策略,无非也就是以上两种方法 redirect 参考:http://cbonte.github.io/h ...

  2. 解决 RabbitMQ 集群 Channel shutdown: connection error 错误(HAProxy 负载均衡)

    相关文章:搭建 RabbitMQ Server 高可用集群 具体错误信息: 2018-05-04 11:21:48.116 ERROR 60848 --- [.168.0.202:8001] o.s. ...

  3. HAProxy详解(三):基于虚拟主机的HAProxy负载均衡系统配置实例【转】

    一.基于虚拟主机的HAProxy负载均衡系统配置实例 1.通过HAProxy的ACL规则配置虚拟主机: 下面将通过HAProxy的ACL功能配置一套基于虚拟主机的负载均衡系统.这里操作系统环境为:Ce ...

  4. [记录]HAproxy负载均衡配置教程

    HAproxy负载均衡配置教程 一.简介 haproxy是一个开源的高性能负载均衡软件:支持双机热备.虚拟主机和图形化的管理界面,自带强大的对RS健康检查功能:支持TCP(四层).HTTP(七层)应用 ...

  5. Nginx/LVS/HAProxy负载均衡软件的优缺点详解

    PS:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些使用经验,总结一下. 一般对负载均衡的使用是随着网站规模的提升根据不 ...

  6. Nginx/LVS/HAProxy负载均衡软件的优缺点详解(转)

    PS:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些使用经验,总结一下. 一般对负载均衡的使用是随着网站规模的提升根据不 ...

  7. Nginx/LVS/HAProxy负载均衡软件的优缺点详解(转)

    PS:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些使用经验,总结一下. 一般对负载均衡的使用是随着网站规模的提升根据不 ...

  8. (总结)Nginx/LVS/HAProxy负载均衡软件的优缺点详解

    PS:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些使用经验,总结一下. 一般对负载均衡的使用是随着网站规模的提升根据不 ...

  9. Nginx/LVS/HAProxy 负载均衡软件的优缺点详解

    Nginx/LVS/HAProxy 负载均衡软件的优缺点详解   Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些使用经验 ...

随机推荐

  1. [Abp vNext微服务实践] - 服务通讯

    简介 服务通讯是微服务架构中必不可少的功能,服务通讯的效率决定了微服务架构的优略.常用的微服务通讯策略有两种,分别是rpc.http,其中rpc以gRpc框架为代表使用者最多.abp vNext微服务 ...

  2. anaconda环境---ubuntu下重装

    anaconda环境---ubuntu下重装 @wp20190312 为何重装? 配置一个环境,意外发现conda命令不好用了,提示“找不到conda模块”,整个conda虚拟环境中的工程项目无法使用 ...

  3. Pycharm中查看内置函数的源码

    方法1.鼠标放在函数上,Ctrl+B,看源码 方法2.将光标移动至要查看的方法处,按住ctrl 键,点击鼠标左键,即可查看该方法的源码.

  4. String字符串反转

    new StringBuffer("abcde").reverse().toString(); 通过char数组进行转换 package com.test.reverse; pub ...

  5. 无法安装 Composer 怎么办?

    详细方法参见 http://pkg.phpcomposer.com/ 下载 composer.phar ,放置到项目中 在同目录中执行命令行 echo @php "%~dp0composer ...

  6. HDU 6057 - Kanade's convolution | 2017 Multi-University Training Contest 3

    /* HDU 6057 - Kanade's convolution [ FWT ] | 2017 Multi-University Training Contest 3 题意: 给定两个序列 A[0 ...

  7. 简单NLT

    目录 操作文本 需求 代码实现 操作文本 I have a dream that my four little children will one day live in a nation where ...

  8. Java 面试题 二

    1.线程怎么保持同步 关于线程同步(7种方式) --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3897440.html"谢谢 ...

  9. When you want to succeed as bad as you wanna breathe, then you’ll be successful.

    上周末登了次山,回来就各种矫情犯懒.今天周四一周又要完蛋,我发现自己真的是对时间流逝无可奈何.然后中午看了把小码哥网站还有MJ博客什么的,各种首期班大爆照,心中羞愧无比.年纪大也不能放弃自己啊,要不人 ...

  10. 捣乱Linux环境下的C语言

    #include <stdlib.h> 头文件作用.CSDN C 标准库 – <stdlib.h> | 菜鸟教程  https://www.runoob.com/cprogra ...