[VPC] 보안그룹 설정 가이드
Prerequisite
- AWS 계정 접근 권한: EC2 및 VPC 서비스에 접근할 수 있어야 합니다.
- 기본적인 네트워크 지식: IP, Port, 프로토콜(TCP/UDP/ICMP)에 대한 이해가 필요합니다.
Process
1. 인바운드 및 아웃바운드 설명
보안그룹(Security Group)은 인스턴스에 대한 트래픽을 제어하는 가상 방화벽 역할을 합니다.
-
인바운드(Inbound): 외부에서 인스턴스로 들어오는 트래픽에 대한 규칙입니다. (기본값: 모두 거부)
+-----------------------+ +-----------------------+ | Internet | Inbound | EC2 Instance | | (External) | --------------------> | (Security Group) | | | Default: Deny All | | +-----------------------+ +-----------------------+
-
아웃바운드(Outbound): 인스턴스에서 외부로 나가는 트래픽에 대한 규칙입니다. (기본값: 모두 허용)
+-----------------------+ +-----------------------+ | EC2 Instance | Outbound | Internet | | (Security Group) | --------------------> | (External) | | | Default: Allow All | | +-----------------------+ +-----------------------+
Stateful(상태 저장) 특성: 보안그룹은 상태를 저장합니다. 즉, 인바운드 규칙에서 허용된 트래픽에 대한 응답(아웃바운드)은 아웃바운드 규칙과 관계없이 자동으로 허용됩니다. 반대로, 허용된 아웃바운드 트래픽에 대한 응답(인바운드)도 자동으로 허용됩니다.
2. 테스트 환경 구성
테스트를 진행하기 위해 퍼블릭 서브넷에 2개의 EC2 인스턴스를 생성하고 각기 다른 보안그룹을 적용합니다.
(Notice) 인스턴스를 총 2개 만드는 작업입니다. 가이드를 반복하세요.
-
AWS 콘솔에서 EC2 서비스로 이동하여 인스턴스 시작을 클릭합니다.


-
Amazon Linux 2023 등 가벼운 이미지를 선택하고,
t3.micro타입을 선택합니다.이름은 구분하기 쉽게 A, B등으로 설정합니다.

-
키페어를 생성하고 저장해둡니다.


(Notice : 두번째 인스턴스 생성시에는 새로 키페어를 생성할 필요 없이 생성한 키페어를 그대로 사용해도 됩니다.)
-
네트워크 설정에서 '퍼블릭 IP 자동 할당'을 활성화여 기본값 VPC에 생성합니다.


-
보안그룹을 각각 다르게 생성하여 할당합니다. (각각의 인스턴스 생성 시 다른 보안그룹으로 생성하세요)
-
Instance-A: 보안그룹
SG-Test-A생성 (SSH 22 포트 - 내 IP 허용)
-
Instance-B: 보안그룹
SG-Test-B생성 (SSH 22 포트 - 내 IP 허용)
-
-
인스턴스 생성 후 두 인스턴스가 '실행 중' 상태인지 확인합니다.


3. 상호 연결 확인 (Ping 활용)
SSH 접속가이드는 아래를 확인합니다.
서로 다른 보안그룹이 적용된 인스턴스 간의 통신을 확인합니다.
-
로컬 터미널에서
Instance-A에 SSH로 접속합니다.

-
Instance-B의 프라이빗 IP(Private IP)를 확인합니다.
-
Instance-A에서Instance-B로 Ping 테스트를 수행합니다.
ping <Instance-B의 Private IP> -w 10
-
결과 확인: 현재
SG-Test-B에는 ICMP(Ping)에 대한 인바운드 허용 규칙이 없으므로 응답이 오지 않아야(Timeout) 합니다.
+-----------------------+ +-----------------------+| Instance A | Ping | Instance B || (SG-Test-A) | (ICMP Req) | (SG-Test-B) || [Outbound: Allow All] | --------------> | [Inbound: Allow None] || | Failure | |+-----------------------+ +-----------------------+ -
SG-Test-B의 인바운드 규칙에 SG-Test-A의 보안그룹 ID를 소스로 하는 모든 ICMP - IPv4 규칙을 추가한 뒤, Ping이 정상적으로 되는지 확인합니다.




+-----------------------+ +-----------------------+| Instance A | Ping | Instance B || (SG-Test-A) | (ICMP Req) | (SG-Test-B) || [Outbound: Allow All] | --------------> | [Inbound: Allow ICMP || | Success | from SG-Test-A] |+-----------------------+ +-----------------------+
4. 웹 서버 접속 테스트 (Hello World API)
특정 포트를 통한 애플리케이션 접속을 테스트합니다.
-
Instance-A에 접속하여 간단한 Python 웹 서버를 실행합니다.
cat <<EOF > server.pyfrom http.server import HTTPServer, BaseHTTPRequestHandlerclass SimpleHandler(BaseHTTPRequestHandler):def do_GET(self):self.send_response(200)self.send_header('Content-type', 'text/html; charset=utf-8')self.end_headers()# 여기에 브라우저로 보낼 메시지를 적습니다self.wfile.write("Hello World! 이것은 명령어 한 번으로 만든 서버입니다.".encode('utf-8'))print("서버가 8080 포트에서 실행 중입니다...")# 0.0.0.0은 모든 IP에서의 접속을 허용한다는 뜻입니다HTTPServer(('0.0.0.0', 8080), SimpleHandler).serve_forever()EOFpython3 server.py -
로컬 브라우저에서
http://<Instance-A의 퍼블릭 IP>:8080으로 접속을 시도합니다.
- 결과:
SG-Test-A에 8080 포트 허용 규칙이 없으므로 접속에 실패합니다.
- 결과:
-
SG-Test-A의 인바운드 규칙에 사용자 지정 TCP (포트 8080), 소스 내 IP를 추가합니다.


-
다시 브라우저에서 접속하여 "Hello World" 문구가 출력되는지 확인합니다.
+-----------------------+ +-----------------------+| User (My IP) | HTTP Req | Instance A || (Local Browser) | (TCP Port 8080) | (SG-Test-A) || | --------------> | [Inbound: Allow 8080 || | Success | from My IP] |+-----------------------+ +-----------------------+
5. (중요) 보안그룹 Self 참조 설명
Self 참조(Self-Reference)란?
보안그룹의 인바운드 규칙에서 소스(Source)로 자기 자신의 보안그룹 ID를 지정하는 것을 말합니다.
이 설정을 적용하면, 동일한 보안그룹을 가진 모든 리소스(EC2 등) 간의 트래픽을 허용하게 됩니다.
+--------------------------------------------------+ | Security Group: SG-Common | | [Inbound Rule: Allow All Traffic from SG-Common] | +------------------------+-------------------------+ | Applies to +----------------+----------------+ | | +-------v-------+ +-------v-------+ | Instance A | <-------------> | Instance B | | (SG-Common) | Traffic | (SG-Common) | +---------------+ Allowed +---------------+
- 사용 목적:
- 오토스케일링 그룹(ASG) 내의 인스턴스끼리 자유로운 통신이 필요할 때
- 클러스터링 된 DB나 애플리케이션 노드 간의 통신
- IP 주소가 동적으로 변경되는 환경에서 유연한 정책 관리
6. Self 참조 적용 및 연결 확인
-
SG-Common이라는 새로운 보안그룹을 생성합니다.
인바운드 규칙에 내 IP를 소스로 SSH만 접근 가능하도록 설정후 생성합니다.

-
생성한 보안그룹의 인바운드 규칙을 다음과 같이 설정합니다.


- 유형: 모든 트래픽 (All Traffic)
- 소스: 사용자 지정 -> 검색창에
SG-Common을 입력하여 자기 자신을 선택
-
Instance-A와Instance-B의 보안그룹을 모두SG-Common으로 변경합니다. (기존 SG 제거, SG-Common 추가)

-
(Notice : 두개 인스턴스 모두 동일한 SG-Common으로 변경하는것입니다.)
-
Instance-A에서Instance-B로 Ping 접속을 시도합니다.
- 결과: 별도의 IP 지정과 프로토콜 설정 없이도, 동일한 보안그룹을 가지고 있다는 이유만으로 통신이 성공해야 합니다.
+--------------------------------------------------+| Security Group: SG-Common || [Inbound Rule: Allow All Traffic from SG-Common] |+------------------------+-------------------------+| Applies to+----------------+----------------+| |+-------v-------+ +-------v-------+| Instance A | <-------------> | Instance B || (SG-Common) | Traffic | (SG-Common) |+---------------+ Allowed +---------------+