월루를 꿈꾸는 대학생
7주차 로드밸런서 ELB 본문
다수의 트래픽이 몰렸을 떄 혹은 부하분산의 처리 등 여러가지 환경에서 사용하는 기능
어느 한 쪽의 서버가 고장이 났을 때 다른 서버로 연결을 즉 라우팅을 해주는 기능
설정
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
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 설정하기 !
체계 : 외부 접근 인터넷 경계 // 아니면 내부로 !
리스너는 외부 사용자들이 어디로 들어오는지 핸들링
가용용역 : 서비스 가능한 AZ
대상을 IP인지 인스턴트인지 구분 가능
두 번연속 10초간 응답 없으면 비정상으로 판단
3번 오면 정상으로
이제 정검
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
라운드로빈방식으로 거의 대등하게 나옴
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"
아이폰, 안드로이드 사용자 차단 → 설정 후 자신의 핸드폰(wifi on & off)에서 ALB DNS로 접속 차단 확인
해당 폰의 접근은 User-Agent값에 *iPhone* 혹은 *Android*값이 포함되어 있다
인스턴스 1번을 중지
ec2-1 키면
첫째, 로드 밸런서 삭제 (EC2 → 로드 밸런싱 → 로드 밸런서 → 작업 → 삭제)
둘째, 대상 그룹 삭제 (EC2 → 로드 밸런싱 → 대상 그룹 → 작업 → 삭제)
셋째, CloudFormation 스택 삭제 (CloudFormation → 스택 → 스택 삭제)
'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 |