7.Haproxy实现ACL和HTTPS安全.md

ACL才是HAproxy相对于nginx的优势

ACL

image-20241205140822420

acl xxx xx xxx xxx # 这些字段不一定都有

匹配规范:比如head里带什么内容,url带什么关键字,尾包含什么。

匹配模式:比如简单的区分大小写

具体操作符:相等还是不等

value:具体的值

image-20241205140822421

image_service就是acl的name

hdr_dom是haproxy里的固定用法,是一个判断条件,hdr_dom(host)就是主机头里host字段里 包含 后面的value--mg.wang.com的意思

-i 忽略大小写

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

host字段是在Request Headers块里的,然后新版HTTP/2 /3不叫host而是authority字段。

image-20241205142450879

image-20241205142532302

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

hdr:抓取head头里的东西

image-20241205141422393

beg开头end结尾dir是uri,rge是正则,sub是包含字符串

image-20241205143636936

👇 hdr_sub(User-Agent) -i curl wget 解释;hdr_sub就看是否包含字符串,看User-Agent字段里的是否有curl wget 且不区分大小写。

如果你用curl和wget请求的就deny掉👇

image-20241205141627459

👆面的几个都一个意思都是www.开头

上图的hdr_dom(host) 和 hdr(host) 好像没啥区别啊,都是hdr(headr块里的)host字段啊,前置是域名,后者没说域名又有什么关系呢,都是beg 或 end xxx不一样用啊

然后-m写不写都都一样,-m就是-i类似的,-i是忽略大小写,不写-m就是精确匹配,如果用beg end这种就需要用-m来配合。

抓取部分url里的东西:base的用法

image-20241205145909128

👆👇这差不多是url匹配就是nginx没法实现的

抓取部分url里的东西:path的用法

image-20241205150458775

👇去掉下图的xx/就能够满足前面的匹配了

image-20241205151335469

👆reg就是regex正则

path_sub是子串,所谓子串就是只要包含就匹配到了。

path_dir jpegs就是必须是一个独立的文件夹,比如www.ming.org/xxx/jpegs/xxx xxx有没有都可以咯。

抓取整个url里的东西:url的用法

image-20241205151616332

抓取:源目IP和端口、状态码、以及method七层协议里的动作(GET/POST等)🐂

image-20241205152403346

匹配模式

image-20241205153003957

-u就是acl不能同名,这种写法就不行了

image-20241205153042174

本来多个acl同名就是并集也就是或的关系,squid里就是这么用的。

操作符

image-20241205153230045

value值

image-20241205153303938

acl组合

image-20241205153429093

实验-基于访问域名提供调度

假设 一个网站提供手机端访问,一个网站提供电脑端访问

案例01:

rocklinux9.3 因升级openssl导致ssh起不来的处理记录

1、先用telnet起来

dnf install telnet -y
dnf install telnet-server -y

systemctl start telnet.socket

ss -tlnup # 检查23端口起来了

2、改用telnet登入,卸载openssh重新安装

dnf remove openssh-server openssh-clients openssh -y
dnf install openssh-server openssh-clients openssh -y
systemctl start sshd
systemctl status sshd

继续haproxy实验

1、haproxy的配置,编译安装和带子配置文件夹启动(参见前文)

[root@server ~]# cat /etc/haproxy/conf.d/site.cfg
frontend www.ming.com
    bind 192.168.126.137:80
    acl pc_domain hdr_dom(host) -i www.ming.com
    acl mobile_domain hdr_dom(host) -i mobile.ming.com
    use_backend www_servers if pc_domain
    use_backend mobile_servers if mobile_domain
    #default_backend mobile_domain  # 这是默认的转发规则

backend mobile_servers
    server web1 192.168.126.135:80 check inter 1000 fall 2 rise 10

backend www_servers
    server web2 192.168.126.136:80 check inter 1000 fall 2 rise 10

2、后面两个成员的配置很简单,就用nginx

web1
cat /usr/share/nginx/html/index.html
this is 135-mobile


web2
cat /usr/share/nginx/html/index.html
this is 136-pc


client上简单配置一个hosts做解析
192.168.126.137 www.ming.com mobile.ming.com

3、检查效果

image-20241211104623518

实验2-基于ip

[root@server ~]# cat /etc/haproxy/conf.d/site.cfg
frontend www.ming.com
    bind 192.168.126.137:80
    acl lan1 src 192.168.126.1
    acl lan2 src 192.168.126.137
    use_backend www_servers if lan1
    use_backend mobile_servers if lan2

backend mobile_servers
    server web1 192.168.126.135:80 check inter 1000 fall 2 rise 10

backend www_servers
    server web2 192.168.126.136:80 check inter 1000 fall 2 rise 10
[root@server ~]#
[root@server ~]# systemctl reload haproxy

cmd是192.168.126.1 右边是192.168.127.137

image-20241211105246025 image-20241211105334058

实验3-拒绝

image-20241211110157958

实验4-动静分离

image-20241211110549047

预定义也叫内置acl

https://cbonte.github.io/haproxy-dconv/2.1/configuration.html#7.4

image-20241211111053148

内置acl:禁用trace方法

这种acl直接用,不用自定义抓哪些流量

image-20241211111807294

上图405是已经穿过haproxy到达了后端的nginx了,405是nginx不支持的反馈。而administrative是haproxy拒绝了的。

禁用ab、curl、wget

image-20241211112954502

image-20241211113451160

error报错文件

image-20241211115456005

image-20241211115509936

这个报错页面需要完善

通过curl -v可见要补充的部分

image-20241211115719564

[root@server ~]# cat /etc/haproxy/errorfiles/403forbid.http
HTTP/1.1 403 Forbidden
content-length: 93
cache-control: no-cache
content-type: text/html

<html><body><h1>403 Forbidden</h1>
Request forbidden by administrative rules.
</body></html>

image-20241211134259964

为什么haproxy的这个error页面必须加上响应包的头呢,因为haproxy不像nginx一样是一个web服务器,必须手动补上。

image-20241211135341164

四层acl控制

image-20241211140731287

haproxy做ssl证书卸载-负担重一点的会

image-20241211142243761

也可以haproxy卸载ssl,然后http 80 到后端

# 配置HAProxy支持Https协议,支持ssl会话
bind *:443 ssl crt /PATH/TO/SOME_PEM_FILE


# 把80端口的请求利用302重定向443
bind *:80
redirect scheme https if !{ ssl_fc }

# 向后端传递用户请求的协议和端口(frontend或backend)
http_request set-header X-Forwarded-Port %[dst_port]
http_request add-header X-Forwarded-Proto https if { ssl_fc }


# 指令crt后证书文件为PEM格式,需要同时包含证书和所有私钥
cat demo.key demo.crt > demo.pem

证书制作

方法

mkdir /etc/haproxy/certs/
cd /etc/haproxy/certs/
openssl genrsa -out haproxy.key 2048
openssl req -new -x509 -key haproxy.key -out haproxy.crt -subj "/CN=www.ming.com" -days 365
# 或者用下一条命令实现上面2条命令
openssl req -x509 -newkey rsa:2048 -subj "/CN=www.ming.com" -keyout haproxy.key -nodes -days 365 -out haproxy.crt

cat haproxy.key haproxy.crt > haproxy.pem  # 合二为一
chmod 600 haproxy.pem  # 因为包含私钥了,所以改成600安全些
openssl x509 -in haproxy.pem -noout -text

方法2
mkdir /etc/haproxy/certs/
cd /etc/pki/tls/certs
make /etc/haproxy/certs/haproxy.pem
umask 77 ; \
PEM1=`/bin/mktemp /tmp/openssl.XXXXX` ; \
PEM2=`/bin/mktemp /tmp/openssl.XXXXX` ; \
/usr/bin/openssl req -utf8 -newkey rsa:2048 -keyout $PEM1 -nodes -x509 -days 365 -out $PEM2 ; \
cat $PEM1 > /etc/haproxy/certs/haproxy.pem ; \
echo "" >> /etc/haproxy/certs/haproxy.pem ; \
cat $PEM2 >> /etc/haproxy/certs/haproxy.pem ; \
rm -f $PEM1 $PEM2

image-20241211145542308

image-20241211145514868

image-20241211150941142

此时https就好了

再加个跳转

image-20241211151514302

image-20241211153614181

Copyright 🌹 © oneyearice@126.com 2022 all right reserved,powered by Gitbook文档更新时间: 2024-12-11 16:23:24

results matching ""

    No results matching ""