Table of Contents
Haproxy 의 ACL 설정
reverse proxy 로 활용하면서 header 의 값을 판단하거나, source 의 IP 대역을 확인하거나, 또는 기타 특정 backend 연결을 위해서 acl을 정의한다.
# ACL "vpc-network" 선언
acl vpc-network src 10.10.1.0/16
# ACL "allow_url" 선언
# whitelist url 목록 파일 지정
acl accept_url url_beg -i -f /etc/haproxy/accept_url.list
# ACL "found-header" 선언
acl found-header req.hdr_val(my_custom_header) -m found
조건에 따른 분기 처리를 위한 변수 획득
예를들어 header 의 특정 값을 변수로 획득하여 조건에 따라 다른 백엔드 서버로 요청을 처리를 하고 싶다고 가정해보자. 이 값을 내부 변수로 획득하기 위해서는 몇가지 설정을 통해서 처리할 있다.
apache 에서는 다음과 같이 처리할 수 있다.
#apache
# my_custom_header 라는 값이 존재하는지 확인하고 이 값을
# CUSTOM_HEADER 라는 변수에 할당한다.
SetEnvIf my_custom_header (.+) CUSTOM_HEADER=$1
# 로그에 CUSTOM_HEADER 라는 변수값을 기록한다.
LogFormat "%{CUSTOM_HEADER}e %{Host}i %D [%{%FT%T%z}t] \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
nginx 에서는 다음과 같이 처리할 수 있다.
#nginx
# http_my_custom_header 라는 값을 찾아 custom_header 라는 변수에 할당한다
# 값이 없다면 공백으로 지정
# 값지 존재한다면 해당값을 변수에 저장한다.
map $http_my_custom_header $custom_header {
"-" "";
default $http_my_custom_header;
}
# custom_header 라는 변수값을 로그에 기록한다.
log_format main '$custom_header $forward_ip $http_host $request_time [$time_iso8601] ';
haproxy document 를 확인하면 애석하게도 acl 을 곧바로 로그에 남기는 방법이 존재하지 않는다. apache 나 nginx 보다는 조금 불편한 방법을 거쳐야 한다. 다음과 같이 해보자.
#haproxy
# request header 에 들어 있는 my_custom_header 라는 변수값을 찾아 이를
# req.my_custom_variable 이라는 값으로 지정한다.
http-request set-var(req.my_custom_variable) req.hdr(my_custom_header)
# 특정 acl 에 따라서 string 값으로 지정할 수 있다.
http-request set-var(req.my_custom_variable) str("other_value") if my_acl
# 길이 제한 10으로 이 값을 capture 하자.
http-request capture var(req.my_custom_variable) len 10
# 위에서 캡처한 값을 로그에 기록한다.
# 캡쳐한 값이 여러개라면 index 번호는 0, 1, 2.. 순으로 늘어난다.
log-format "%[capture.req.hdr(0)]\ %Tt [%trl]\ \"%HM\ %HU\ %HV\"\ %ST\ %B\"
이렇게 하면 원하는 값을 acl 에 따라서 지정할 수 있고, 이를 로그에서 확인할 수 있다. 나의 경우에는 내부 내트워크 에서 접속인지 아닌지 로그에서 바로 확인하는 용도로 사용한다. 테스트는 haproxy 1.9 버전에서 정상적으로 동작하는 것을 확인했다.
요약
haproxy 에서 acl 값을 log 에 바로 남기는 방법을 알아보았다. apache 처럼 바로 acl 을 변수값으로 확인해서 기록하는 방법이 있으면 편하겠지만. 조금 불편한 방법을 거쳐야 한다. 또한 capture 한 값을 index 값처럼 0, 1, 2.. 로 확인하려니 설정이 지저분해지는 단점이 있다.
참고
- 크롬 브라우저에서 header 에 특정 값을 추가하는 extension : https://chrome.google.com/webstore/detail/modheader/idgpnmonknjnojddfkpgkljpfnnfcklj
- stat haproxy 매뉴얼 : https://cbonte.github.io/haproxy-dconv/1.8/management.html#9
- socket 으로 haproxy stat 획득하기 : https://makandracards.com/makandra/36727-get-haproxy-stats-informations-via-socat
- stat 수집 script : https://gist.github.com/bpaquet/7153979
- stat 설명 : https://gist.github.com/alq666/20a464665a1086de0c9ddf1754a9b7fb
comments powered by Disqus
FEATURED TAGS
2024
3 keywords
accesscontrol
adaptive growth
alpine linux
ansible
ansible tower
apache2.4
architecture
argocd
asgi
aws
awx
backoffice
beautiful goodbye
begining docker
benchmark
blockhound
blocking code
blog
book
brew cask
build cache
collaboration
communication
composer
confluence
cronjob
curl
customizing
customlog
data.sql
database
developer
difference
docker
docker desktop
dockerize
dos attack
eks
elasticsearch
empty string
environment to do well
errorlogformat
event driven
experience
file upload
filebeat
fluentd
forwarded option
framework
fuse.js
golang
graceful deploy
happy new year
haproxy
haproxy 1.8
haproxy acl logging
haproxy custom variable logging
haproxy metric
haproxy reload fail
haproxy stat
heap memory
hedgehog sharp
how do i work
hugo
index alias
install
installation
instance type
inverted index
istio
iterm
java
jdk 21
jekyll
jekyll to hugo
jetbrains
json
k8s
k8s api
kmooc
kubernetes
leadership
learning in 2019
let's encrypt
letsencrypt
limit_req_zone
litestar
logstash
m1 macbook pro
macro
macro key mapping
mapping
match
match_phrase
maven
microservice 설계 및 구현
migration
mm
multi datasource
mysql
nginx
nginx ingress
nginx regexp
ngram
node drain
null
openjdk
partial matching
phpstorm
poddisruptionbudget
poeaa
portfolio expansion
product strategy
python
query dsl
rate limit
rate litmiting
rds
reindex
rss template
seamless reload
search on hugo
service account & role
sidebar search
speed up
speedup
spring
spring boot
spring camp
spring camp 2023
spring event
ssh
struct
study
system manager
systemd reload
template
term
throughput
timezone
tips
traffic management
ulid
unused plugins
uuid
ux consideration
virtual thread
vm options
webflux
wildcard
year review
zero downtime
만들면서 배우는 클린 아키텍처
시작하세요 도커
엔터프라이즈 애플리케이션 아키텍처 패턴
쿠버네티스 시작하기