미니 팀 프로젝트를 배포하는 과정을 해보지 못해서 aws로 배포해보고자 했는데, 처음이라 모든게 쉽지않다. 특히 EC2 인스턴스 생성→연결→배포→접속 해봤는데,
분명 서버는 열렸는데 접속이 안되는 상황이 발생했다. 알고보니 인바운드 규칙 설정을 잘못했었음
인바운드 규칙을 제대로 설정하지 않으면 방금처럼 서버는 열렸는데 도메인 접속, ip로 접속이 되지 않는 현상이 발생한다.
인바운드 규칙이란?
인바운드 규칙은 클라이언트가 자신의 서버 데이터에 들어올 수 있는 규칙을 의미한다.
기본적으로 인바운드 규칙은 모든 포트를 닫는 것을 전제로 한다. 즉 인바운드 규칙에서 설정하지 않은 포트들은 사용할 수 없는 포트이다.
물론 서버구동이나 서버환경관리를 위한 SSH접속과 http연결은 필수적으로 필요하니까 모든 포트를 닫아놓고, 정말 필요한 포트만 개방하는 것!
(포트에 대해서는 먼저 서버 접속 가능 경로로 이해하고 아래에서 짧게 설명합니다.)
쉽게 말해서
조금 더 쉽게 말하면 인바운드 규칙으로 아무 경로도 허용하지 않은 경우 아무도 접속할 수 없는 서버가 배포되는것이고,
인바운드 규칙으로 모든 경로를 허용하는 경우 누가 악의적으로 서버 스토리지에 15TB짜리 파일을 전송한다해도 막을 수가 없을 수 있다.
aws 보안 그룹의 인바운드 규칙
보통 서버를 배포하기위해 EC2 인스턴스를 활용하고 사람들이 내 서버에 접속할 수 있으려면 인바운드 규칙에 어긋나지 않아야 하기 때문에, http연결을 허용하게된다.
aws는 이를 각 서버마다 귀찮게 설정하지 않고 서버 용도에 맞게 미리 보안그룹에 인바운드 규칙을 정의하고 재사용할 수 있도록 제공한다.
아웃바운드 규칙이란?
아웃바운드 규칙은 서버에서 외부로 나가는 규칙을 의미한다.
aws 보안 그룹의 아웃바운드 규칙
기본적으로 모든 아웃바운드 트래픽을 허용하는 아웃바운드 규칙을 포함한다.
aws 보안그룹 인바운드 규칙 설정법
1. 설명 탭의 보안 그룹에서 인바운드 규칙 보기를 선택합니다.
Security Groups associated with i-1234567890abcdef0 Ports Protocol Source launch-wizard-N 22 tcp 0.0.0.0/0
2. 보안 그룹에서 Amazon EC2 인스턴스를 위한 보안 그룹을 선택한다.
보안그룹이 없어서 새로 만든 경우 위의 사진과 같이 이름은 자동으로 launch-wizard 로 시작하는 보안그룹이 생성 될 것이고 여기서 설정한 다음 앞으로도 재사용하면 된다.
배포된 서버로 사람들이 접속할 수 있기를 원한다면(http 접속, naver google 접속하듯이), 인바운드 탭에서 아래와 같은 인바운드 규칙이 있어야 한다.
- 유형: HTTP
- 프로토콜: TCP
- 포트 범위: 80
- 소스: 0.0.0.0/0
인스턴스를 연결할 때 필수는 아니지만, SSH 트래픽 연결을 허용해야하는 경우도 있다 그렇다면 아래와 같은 인바운드 규칙이 있어야한다.
- 유형: SSH
- 프로토콜: TCP
- 포트 범위: 22
- 소스: 내 ip
설정을 잘 했다면, 위의 사진과 같이 aws 내 보안그룹의 규칙을 보는 화면에서ssh, HTTP, HTTPS 3개의 포트 접속만을 허용하는 위와 같은 화면을 볼 수 있다.
결국 22(관리자) 80 번의 포트로 접속을 허용(인바운드 가능) 한다는 뜻이 되는데, 이 포트 번호들은 뭘까?
포트란?
포트(port)는 운영 체제 통신의 종단점이다. 네트워크 서비스나 특정 프로세스를 식별하는 논리 단위이다.
주로 포트를 사용하는 프로토콜은 전송 계층 프로토콜이라 하며, 예를 들어 전송 제어 프로토콜(TCP)와 사용자 데이터그램 프로토콜(UDP)가 있다. 각 포트는 번호로 구별되며 이 번호를 포트 번호라고 한다. 포트 번호는 IP 주소와 함께 쓰여 해당하는 프로토콜에 의해 사용된다.
URI 문법에 의해서 사용 및 표기할 수 있으며, IP 주소와 함께 URL을 표기하는 예는 다음과 같다.
ftp://000.000.000.000:21
위 예는 ftp프로토콜로, 000.000.000.000 ip주소의 21번 포트로 접속, 통신 요청하는 상황이다.
포트는 여러 서비스가 동일한 컴퓨터 또는 서버에서 작동할 수 도록, 각 서비스가 구분되어 서로 간섭하지 않도록 하는 역할을 한다.
포트가 없다고 가정한다면
서버 호스트의 ip주소는 우선 한개이므로, 해당 서버와 메일을 주고받거나, 데이터 통신, 단순 방문… 이외에도 여러가지 목적으로 사람들은 서버 호스트의 ip주소로 통신하고자 할 텐데,
모든 서비스, 프로토콜이 하나의 접속, 통신 경로로 몰린다고 생각해보면 포트의 필요성이 느껴질 것이다.
HTTP와 HTTPS의 경우 지정된 포트 번호가 대부분의 경우 사용되는 이러한 포트들을 "Well known ports” 라고 한다. 그러니까,
HTTP는 80번, HTTPS는 443 포트로 접속하는 것으로 약속이 되어있고, 잘 알려져있다는 것.
이전에 설정한 관리자용 포트 22번은 SSH연결을 담당할 포트이다.
클라이언트가 브라우저에 도메인 주소를 입력하면(예를들어 네이버 : https://www.naver.com) 서버에 요청되는 건
- 도메인 주소
- 해당하는 ip주소
- http프로토콜
의 3가지의 정보를 보내게된다. 도메인주소와 ip주소는 알법하니 넘어가고, http프로토콜은 HTML문서를 주고받기 위한 약속이며, 80번포트를 사용한다.