월루를 꿈꾸는 대학생

7주차 로드밸런서 ELB 본문

Cloud/AWS

7주차 로드밸런서 ELB

하즈시 2021. 4. 4. 19:05
728x90

다수의 트래픽이 몰렸을 떄 혹은 부하분산의 처리 등 여러가지 환경에서 사용하는 기능 

어느 한 쪽의 서버가 고장이 났을 때 다른 서버로 연결을 즉 라우팅을 해주는 기능 

 

https://nesoy.github.io/articles/2018-06/Load-Balancer

설정

1) 리스너 : 프론트앤드 // 외부 사용자들이 리스너만 알 수 있음 마치 로벨이 외부사용자들에게 동작하는 것처럼 

2) 대상그룹 : 실제 정상적인 웹서버들이 들어가 있음 

 

ALB

- 7계층 동작 

 

NLB

- 4계층 

-TCP / UDP 

 

두 가지의 차이

- ALB는 7계층 특화 상황에 따라 IP 바뀜 

- NLB는 4계층 특화 및 고정 IP 보유 가능 

 

크로스존 로드벨런스

- 타겟 대상들 기준으로 한 쪽으로 치우치지 않고 골고루 부하분산이 일어나는 기능 

- 비활성화시 AZ 기준이므로 그럴 경우 활성화 ! 

 

 


실습 

 

 

 

 

 

 

 

EC2-1 및 2 에 접근 

 

# ELB-EC2-1
[ec2-user@ELB-EC2-1 ~]$ sudo su -

# 디렉터리(폴더) 트리 구조 출력 
[root@ELB-EC2-1 ~]# tree /var/www/html
/var/www/html
├── dev
│   └── index.html
├── index.html
└── xff.php
cat /var/www/html/xff.php

# ELB-EC2-2
[ec2-user@ELB-EC2-2 ~]$ sudo su -
[root@ELB-EC2-2 ~]# tree /var/www/html
/var/www/html
├── index.html
├── mgt
│   └── index.html
└── xff.php
cat /var/www/html/xff.php

 

ec2-1

 

ec2-2

 

 

my-ec2에 접근 

 

 

sudo su -

# ELB-EC2-1 ELB-EC2-2 퍼블릭IP를 변수에 지정 
##<< 아래 EC21, EC22 IP 정보는 각자 멤버들 실습 결과 IP 정보 입력

EC21=3.36.133.120
EC22=3.36.75.251
echo $EC21
echo $EC22

# ELB-EC2-1 서비스 확인
[root@ip-20-0-0-253 ~]# curl $EC21
<h1>ELB-EC2-1 Web Server</h1>

[root@ip-20-0-0-253 ~]# curl $EC21/xff.php
Client Public IP: 3.34.252.148
Server Public IP = 13.125.183.254
Server Private IP: 10.0.0.217
X-Forwarded-for:

[root@ip-20-0-0-253 ~]# curl $EC21/dev/
<h1>ELB-EC2-1 Dev Web Page</h1>

# sysName은 사용자가 장비에 설정한 장비명(Linux의 Hostname)
# 1.3.6.1 ~~ 해당 호스트값을 가져온다 
[root@ip-20-0-0-253 ~]# snmpget -v2c -c public $EC21 1.3.6.1.2.1.1.5.0
SNMPv2-MIB::sysName.0 = STRING: ELB-EC2-1

# sysName은 사용자가 장비에 설정한 장비명(Linux의 Hostname)
[root@ip-20-0-0-253 ~]# snmpget -v2c -c public $EC21 1.3.6.1.2.1.1.5.0
SNMPv2-MIB::sysName.0 = STRING: ELB-EC2-1

# sysUpTimeInstance(sysUpTime)값은 장비가 부팅되어 현재까지 동작한 milli-second 값이며, 쿼리 시 업데이트 되는 정보
# 아래 값의 경우 부팅 후 2분 10초가 경과된 정보이다
[root@MyEC2 ~]# snmpget -v2c -c public $EC22 1.3.6.1.2.1.1.3.0
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (13098) 0:02:10.98

# ELB-EC2-1 서비스 확인
curl $EC21
curl $EC21/xff.php;echo
curl $EC21/mgt
curl $EC21/mgt/
snmpget -v2c -c public $EC21 1.3.6.1.2.1.1.5.0
snmpget -v2c -c public $EC21 1.3.6.1.2.1.1.3.0

# ELB-EC2-2 서비스 확인
curl $EC22
curl $EC22/xff.php;echo
curl $EC22/mgt/
snmpget -v2c -c public $EC22 1.3.6.1.2.1.1.5.0
snmpget -v2c -c public $EC21 1.3.6.1.2.1.1.3.0

 

환경변수 등록 후 확인

 

 

호스트명 동작 시간 가져옴 

 

 

 

ALB 설정하기 ! 

로드벨런서 생성 

 

 

첫번째가 ALB 

 

체계 : 외부 접근 인터넷 경계 // 아니면 내부로 !

 

리스너는 외부 사용자들이 어디로 들어오는지 핸들링 

가용용역 : 서비스 가능한 AZ 

 

HTTPS 안 쓰니까 넘김 

 

웹접근이 가능한 그룹 보안 정책 

 

 

대상을 IP인지 인스턴트인지 구분 가능 

 

두 번연속 10초간 응답 없으면 비정상으로 판단 

3번 오면 정상으로 

 

대상을 위로 올려야함 !!! 까먹지 말기 

 

해당 DNS이름으로 접근이 가능하다 ! 

 

 

이제 정검 

 

MYEC2에 접속 

 

# ALB DNS 이름을 변수로 지정 << 아래 ALB 정보는 각자 멤버들 실습 결과 정보 입력
ALB=ALB-TEST-436365684.ap-northeast-2.elb.amazonaws.com
echo $ALB

# curl 접속 테스트 - ALB 는 기본 라운드 로빈 방식으로 대상 분산
dig $ALB +short
while true; do dig $ALB +short && echo "------------------------------" && date; sleep 5; done
	------------------------------
	Sun Jan 24 05:51:25 UTC 2021
	13.209.204.23
	13.124.52.66
	------------------------------

curl $ALB
curl $ALB
for i in {1..20}; do curl $ALB --silent ; done | sort | uniq -c | sort -nr
for i in {1..100}; do curl $ALB --silent ; done | sort | uniq -c | sort -nr
curl $ALB/xff.php ;echo
curl $ALB/xff.php ;echo

# /dev/index.html 접근
curl $ALB/dev/index.html --silent
curl $ALB/dev/index.html --silent

# /mgt/index.html 접근
curl $ALB/mgt/index.html --silent
curl $ALB/mgt/index.html --silent

 

alb에 할당된 ip는 변경될 수 있다 ! 

 

 

부하분산 확인

 

 

20번 묶어서 동일한 결과 카운트! 즉 12번은 ec22 8번은 ec21 

 

라운드로빈방식으로 거의 대등하게 나옴 

 

 

last client ip 3계층의 실제 소스ip가 찍힘 

 

우리는 myec2로 ec2-1나 ec2-2에 접근을 하는데 해당 소스 ip를 myec2가 아닌 alb의 내부 ip로 찍히게 됨 ! 

 

문제는 나쁜놈이 공격 들어올 때 그 놈의 ip를 알 수가 없지... 

그래서 그 대신 X-Forwarded-for 에 사용자의 ip를 대신 찍어줌 

 

 

 

Apache2 웹서버에서 클라이언트 IP 로그 확인

 

# ELB-EC2-1/2
# 실시간 로그 확인 ! 
tail -f /var/log/httpd/access_log
	10.0.1.216 - - [24/Jan/2021:06:20:38 +0000] "GET / HTTP/1.1" 200 30 "-" "ELB-HealthChecker/2.0"
	10.0.0.109 - - [24/Jan/2021:06:20:45 +0000] "GET / HTTP/1.1" 200 30 "-" "ELB-HealthChecker/2.0"

# 그랩으로 출력 필터링 -v 가 해당 문구 제외시킴 healthchcker는 살았는지 죽었는지 확인이랑 볼 필요 x

tail -f /var/log/httpd/access_log |grep -v "ELB-HealthChecker/2.0"


[root@ELB-EC2-2 ~]# tail -f /var/log/httpd/access_log |grep -v "ELB-HealthChecker/2.0"
10.0.1.246 - - [08/Nov/2020:07:17:56 +0000] "GET /mgt/ HTTP/1.1" 200 32 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15"
# alb의 로그가 뜸 

# 패킷덤프 - ELB-EC2-1/2
tcpdump tcp port 80 -nn

 

사용자 IP 보기 위해서 아파치 설정 변경이 필요 

 

# Apache 기본 로그 설정 정보 확인
[root@ELB-EC2-1 conf]# grep -n LogFormat /etc/httpd/conf/httpd.conf
196:    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
~

# Apache 기본 로그 설정 변경 : 196번째 줄에 %{X-Forwarded-For}i 추가
nano /etc/httpd/conf/httpd.conf
 LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
 CTRL+X Y Enter 로 저장하고 빠져나오기

# HTTP 다시 로드 - ## 아재 service httpd reload
systemctl reload httpd

# 실시간 로그 출력 후 외부에서 접속 시도
tail -f /var/log/httpd/access_log |grep -v "ELB-HealthChecker/2.0"
3.34.252.138 10.0.1.246 - - [08/Nov/2020:07:27:12 +0000] "GET /dev/ HTTP/1.1" 200 32 "-" "curl/7.61.1"

 

블록부분 추가 

 

클라이언트 ip가 맨 앞에 표시 

 

 


규칙보기 편집 ㄱ 고급라우팅 부분 

 

usr kikai 가 응답시 http로 연결이 아니라 저 hello 구문으로 응답 

 

웹서버 연결이 아니라 해당 설정대로 응답을 반환 ! 

 


 

아이폰, 안드로이드 사용자 차단 → 설정 후 자신의 핸드폰(wifi on & off)에서 ALB DNS로 접속 차단 확인

 

안드로이드 휴대폰 모델명 해당 ip 등 다 로그가 남음 

 

해당 폰의 접근은 User-Agent값에 *iPhone* 혹은  *Android*값이 포함되어 있다

 

 

 

 

규칙보기 편집 ㄱ 고급라우팅 부분 
해당 값이 충족되면 설정된 값 반환 

 

접근 불가 ! 

 

 


 

인스턴스 1번을 중지 

 

ec2-1 키면 

 

 

 

다시 healthy 로 돌아옴 

 


 

첫째, 로드 밸런서 삭제 (EC2 → 로드 밸런싱 → 로드 밸런서 → 작업 → 삭제)

둘째, 대상 그룹 삭제 (EC2 → 로드 밸런싱 → 대상 그룹 → 작업 → 삭제)

셋째, CloudFormation 스택 삭제 (CloudFormation → 스택 → 스택 삭제)

 

 

 

728x90

'Cloud > AWS' 카테고리의 다른 글

9주차 Wordpress & WooCommerce  (2) 2021.04.14
8주차 - EC2 Auto Scaling  (0) 2021.04.07
6주차 - 데이터베이스 서비스  (2) 2021.03.24
3주차 네트워킹 서비스  (0) 2021.03.03
2주차 컴퓨팅 서비스  (0) 2021.02.24