VPC: 망분리 그리고 테스트
학습
서브넷 구성
Multiple AZ 구성 시 알아두면 좋은 점
AZ a와 AZ c는 그룹으로 버저닝을 지원 받는다.
a에 있는 버전이 b에 없는 경우가 존재 할 수 있기 때문에 a, c로 Multiple AZ 구성이 유리함
서브넷을 잘 구성 했는지 확인 하려면 어떻게 해야할까?
OSI 7 Layer 기준 3계층, 4계층, 7계층 테스트 진행
-
3계층 (네트워크)
Ping check:
ICMPIP 정보만으로 서버에 요청이 가능한지 확인 가능한 프로토콜이며
ICMP는TCP,UDP와 달리 Port Number가 없기 때문에 SG 등의 보안 규칙 설정 시 별도 프로토콜 지정이 필요하다.example
ping google.com -c 1RTT(round trip time): 한 패킷이 왕복한 시간연결 시간, 요청 시간, 응답 시간으로 구성 되어 있으며 RTT가 높을 경우 어느 구간에서 오래 걸리는지 확인 해야함(이 경우 웹 서버 성능 등은 확인 할 필요도 없음)
traceroute google.com“Ping 테스트가 실패하면 어떻게 해야할까?”
- 서버가 요청을 받을 수 있는 상태인지 확인하기
- 서버에 할당한 공인 IP를 대상으로 테스트하고 있는지 확인하기
- ICMP 접근 허용 설정이 되어있는지 보안 그룹 확인하기
- 라우팅 테이블 정책에서 외부망 인터넷 게이트웨이로 요청을 보내도록 설정 되어있는지 확인하기
- 클라이언트와 서버 구간에서 지연 구간(RTT)이 있는지 확인하기 ->
traceroute
-
4계층 (트랜스포트)
Port check:
telnetPort를 대상으로 테스트할 때는 “서버가 현재 정상적으로 구동 되고 있는지”를 확인한다.
“Port 는 한 개만 열었는데 어떻게 다수의 사용자가 연결할 수 있는걸까?”
.png)
소켓 은
file descriptor,local ip,local port,remote ip,remote port등 5가지 정보를 활용하여 생성 된다.이중 우리가 할당하는 포트인
local port의 경우, 프로세스가 구동될 때 할당하기도 하고, /etc/services 를 보면 이미 known port로 지정되어 있기도 한다.특정 프로세스 (가령, 8080 포트번호의 톰캣 서버)에 보내는 클라이언트의 요청은
remote port를 제외하고 모두 동일하다.remote port는 client의 브라우저에서 요청 보낼 시 랜덤으로 지정하는unknown port이며 이로인해 요청을 구분할 수 있게 된다.“하나의 프로세스(서버)에서 몇 개의 클라이언트와 연결이 가능할까?”
.png)
위 이미지 처럼 해당 프로세스에 별다른 제약이 없다면 기본적으로 생성할 수 있는 파일의 갯수가 제한되어 있다.
“소켓을 하나 더 두어 요청을 다른 포트 번호로 전달할 수는 없을까?”
.png)
192.168.0.1:80 포트로 요청을 전달 받아 192.168.0.1:8080 포트로 전달하여 프로세스가 처리할 수 있는데, 이를 “포트 포워딩” 이라고 한다.
주로 컨테이너 환경에서 많이 사용된다.
“Port 테스트가 실패하는 경우는 어떻게 해야할까?”
- 보안 그룹 에서 특정 포트 허용 정책이 있는지 확인하기
- 포트에 할당된 프로세스가 수신 받을 수 있는 상태인지 확인하기 ->
netstat - 서버까지 요청이 도달하는지 확인하기 ->
tcpdump - 프로세스가 현재 정상적으로 동작하고 있는지 확인하기
- 터미널로 서버 내에서 localhost:[포트번호] 요청시 정상 응답인지
-
7계층 (어플리케이션)
HTTP Response Check:
curl해당 테스트는 특정 URL에 대한 API 이상 유무를 확인할 수 있다.
example
curl -i google.com“도메인 주소를 IP로 변환하는 과정 알아보기”
-
우선 /etc/hosts 파일에 정적으로 설정한 정보를 확인한다.
해당 파일은 사용자가 직접 등록할 수 있기 때문에 최우선으로 사용되며 해당 파일에 도메인 주소가 존재한다면 이를 그대로 활용한다.
-
로컬의 DNS Cache 를 확인해봅니다.
-
/etc/resolv.conf 에 설정된 정보를 기반으로 DNS 서버 에 질의합니다.
-
DNS 서버는 정보가 있으면 반환하고, 없으면 본인의 상위 DNS 서버 에게 질의하여 정보를 알아옵니다.
-
도메인에 해당하는 IP를 알게되면 DNS Cache 에 추가합니다.
Cache에 등록하게 되면 이후 요청부터 캐시를 활용해서 DNS 서버에 다시 질의하지 않는다
HTTP Status Code를 기반으로 클라이언트에서 에러가 발생했는지, 서버에서 에러가 발생했는지 확인하고 디버깅하여 트러블 슈팅을 한다. -
OSI 7Layer를 바탕으로 패킷이 네트워크 각 구간을 돌아다니는 것을 머릿 속으로 상상하는 습관을 들이면 여러 상황에서 트러블 슈팅 할 때 유리함
Summary
- Ping check: IP 정보만으로 서버에 요청이 가능한지 확인
- Port check: 서비스의 정상 구동 여부를 확인
- Http Status check: 특정 URL에 대한 API 이상 유무 확인
실습
기본 망 구성
- VPC 구성
- 192.168.0.0/24 (C Class)
- 서브넷 구성
- 192.168.0.0/26 public-a
- 192.168.0.64/26 public-c
- 192.168.0.128/27 internal-a
- 192.168.0.160/27 internal-c
- IGW 구성
- 생성 및 미션을 위해 구성 된 VPC Attatch
- NAT Gateway 구성
- 서브넷 연결(외부망 public a)
- EIP 할당
외부망 구성
-
VPC 연결
-
public-a 서브넷 연결
-
Prod EC2 인스턴스 프로비전
- 스펙: T2.Medium
- 보안그룹
- 내 IP SSH 포트 오픈
- HTTPS Allow any 오픈
- ICMP IPv4 Allow any 오픈
-
Public 라우팅 테이블과 인터넷 게이트웨이 연결
- 외부망 통신을 위해 0.0.0.0 대역으로 인터넷 게이트웨이 연결
-
내 IP로 접근이 가능하게 설정 된 운영 인스턴스 상태 체크
- 결과: 성공

내부망 구성
-
VPC 연결
-
internal-a 서브넷 연결
-
DB EC2 인스턴스 프로비전
- 스펙: T2.micro
- 보안그룹
- 내 IP SSH 포트 오픈
- 외부망 SSH 포트 오픈
- ICMP IPv4 Allow any 오픈
-
Elastic IP 할당
-
내 IP -> 외부망 접근 Ping 테스트
- 결과: 성공

-
외부망 -> 내부망 Ping 테스트
- 결과: 성공

망 분리
-
외부망 라우팅 테이블 서브넷 설정
- IGW 연결(외부망 통신)
- public subnet 2개 연결
-
내부망 라우팅 테이블 생성 및 서브넷 설정
- internal subnet 2개 연결
-
내부망 서버 공인 IP Ping 체크
- 결과: 실패

-
내부망 -> 인터넷망 접근 체크
- 결과: 실패

-
외부망 -> 내부망 telnet 테스트
- 결과: 성공

-
Internal 라우팅 테이블에 NAT GW 연결
- 내부망이 외부망과 통신을 위해 0.0.0.0 대역으로 NAT 게이트웨이 연결
-
내부망에서 라이브러리 업데이트를 통해 인터넷망 사용 여부 체크

-
외부망 443 Port listen 후 접근 확인
- socket listen
sudo socket -s 443
- 테스트
telnet {IP} 443
- socket listen
-
내부망 서버의 공인 IP로 접근 테스트
- 내부망의 공인 IP Ping 테스트
VPC 리소스 맵
