웹 서비스를 위한 통신망 (구성/분리)

YEON·2022년 5월 18일
1

인프라 미션

목록 보기
2/7

통신망이란?

통신망이란 노드(IP로 식별할 수 있는 대상)들과 이들 노드들을 연결하는 링크(물리적 회선)들로 구성된 하나의 시스템이다. 즉, 하나의 Subnet을 하나의 망이라고 볼 수 있다.

망 분리는 여러겹의 복잡한 방어를 통해 최적화되고 강력한 보안체계를 갖추기 위해 사용되며,
개인 정보를 다루는 DB 서버 등을 위한 내부망, 사용자가 접근하는 웹 서버를 위한 외부망을 나누어 구성한다.




AWS 망 구성하기

AWS 에서 망은 Region, Availability Zone, VPC 로 볼 수 있다.

  • Region: AWS 의 물리적 서버가 위치하고 있는 국가/지역 (ex.뉴욕,서울)
  • Availability Zone: Region 안에서 사용할 수 있는 데이터 센터(물리적 서버) (ex.서울,부산)
  • VPC: 사용자가 정의한 가상 네트워크



다음은 웹 서비스를 운영할 네트워크 망을 구성하는 과정들에 관해 설명이다.
다음 과정을 거쳐 망을 구성해보도록 하겠다.


VPC 생성

VPC(Virtual Private Cloud) 는 사용자가 정의하는 IP 주소 범위 선택, 서브넷 생성, 라우팅 테이블 및 네트워크 게이트웨이 구성 등 사용자 정의의 가상 네트워킹 환경이다.
VPC는 하나의 Region에 종속되며 다수의 AZ설정이 가능하고, VPC IP 대역 내에서 망을 구성할 수 있다.

Amazon VPC를 이용하면 사용자가 정의한 가상 네트워크로 AWS 리소스를 시작할 수 있다.

  • 퍼블릭 서브넷 : 외부망 / Amazon VPC는 인터넷에 액세스할 수 있는 웹 서버
  • 프라이빗 서브넷 : 내부망 / 인터넷 액세스가 없는 데이터베이스나 애플리케이션 서버 같은 백엔드 시스템을 배치

서브넷은 다음과 같이 구성하였으며, 보안 그룹 등을 사용하여 각 서브넷에서 EC2 인스턴스의 액세스를 제어할 수 있다. (네트워크 환경이니까)



Subnet 생성

Subnet하나의 IP 네트워크 주소를 지역적으로 나누어 여러 개의 서로 연결된 지역 네트워크로 사용할 수 있도록 하는 네트워크의 논리적인 분할 방법이다. ( ex. A class: 0.0.0.0 ~ 127.0.0.0 , B class: 128.0.0.0 ~ 191.255.0.0, C class: 192.0.0.0 ~ 223.255.255.0, D class: 224.0.0.0 ~ 239.255.255.255 .. )
VPC에서 설정한 네트워크 대역이 더 세부적으로 나눠진 작은 네트워크라고 볼 수 있다.

서브넷을 생성하는 이유는 무엇일까?
VPC 안에서 서브넷을 생성하여 통신망을 나눔으로써 (더 작은 네트워크 구역을 만듦으로써)
특정 서버에는 특정 부서만 접근 가능하도록하여 보안 성능을 향상 시킬 수 있고, 운영중인 서비스의 규모에 맞게 분할하여 사용하여 낭비되는 IP주소 자원을 최소화 할 수 있다.

VPC 내에는 보통 Public Subnet과 Private Subnet으로 구성되어 있다.

  • Public Subnet (외부가 개방되어있어 인터넷 연결 가능)
    인스턴스들은 Internet Gateway, ELB, public/elastic ip 를 가지고 있다. 그중 NAT 인스턴스를 통하여 Private Subnet 내에 있는 인스턴스가 인터넷이 가능하게 한다.

  • Private Subnet (내부가 차단되어있어 인터넷 연결 불가능)
    인스턴스들은 private ip 만을 가지고 있다. internet inbound/outbound가 불가능하고 오직 다른 서브넷과의 연결만이 가능하다.

둘의 차이에 관해 설명하자면,
Public Subnet 또는 Private Subnet 이라는 별개의 리소스가 있는 것이 아니라 생성은 동일하되,
생성된 서브넷에 연결된 Routing Table 에 Internet Gateway 로의 라우팅 설정이 되어있으면 Public Subnet 이고 안 되어있으면 Private Subnet 이다.
한마디로, 연결 설정을 통해 인터넷이 통하냐 안통하냐의 차이 라고 이해하면 된다.



Internet Gateway 연결

GateWay 란 서로 다른 통신망, 프로토콜을 사용하는 네트워크 간의 통신을 가능하게 하는 통로의 역할을 한다.
통로 역할로써 서로 다른 프로토콜을 적절히 변환해주는 역할을 한다.

Internet Gateway는 VPC 구성 요소로 VPC의 인스턴스와 인터넷 간에 통신할 수 있게 한다.
퍼블릭 IP 주소를 지닌 인스턴스를 인터넷과 연결하면, 인터넷에서 들어오는 요청을 수신할 수 있도록 한다.

또한 NAT(네트워크 주소 변환) 역할을 수행하여, 외부에서는 접근 못하지만 Private 네트워크가 외부의 Public 네트워크와 통신하고 싶을 때 사용된다. (즉, 내부 망과 외부 망과의 연결을 담당한다 )

NAT 게이트웨이란?
NAT 게이트웨이는 NAT(네트워크 주소 변환) 서비스이다.
Private subnet 의 인스턴스가 VPC 외부의 서비스에 연결할 수 있지만, 외부 서비스에서 이러한 인스턴스와의 연결을 시작할 수 없도록 NAT 게이트웨이를 사용할 수 있다.



Route Table 생성

Route 는 노선,경로이고 Routing 은 경로를 설정하고 찾아가는 일 또는 과정을 의미한다.
Routing Table 이란 네트워크 목적지까지의 거리와 가는 방법 등을 명시하고 있는 이정표같은 테이블이다. 라우터는 어떤 목적지를 찾아갈때 이 라우팅 테이블을 보고 찾아간다.
vpc 내에는 subnet이 있고 각 subnet은 각기 다른 네트워크 대역을 지니고 있으므로, 서로 다른 subnet 으로 가기 위해서는 routing 이 필요한 것이다.

인터넷 통신은 어떻게 할까?
인터넷 게이트웨이를 생성해서 VPC에 Attach 시키고, 인터넷 게이트웨이로 가는 길을 라우팅 테이블에 명시해줘야 사용이 가능하다. (만약 라우팅 대상이 0.0.0.0/0 이라면 모든 IPv4를 의미하여 모든 트래픽들을 한꺼번에 라우팅시키고, 인터넷 게이트웨이를 명시하지 않으면 인터넷 통신이 불가능하다.)

결국, AWS에서의 라우팅 테이블은 VPC 내에서 트래픽의 유입, 유출, 이동을 제어하는 역할을 한다고 볼 수 있다.



Security Group 설정

보안 그룹은 EC2 인스턴스의 가상 방화벽이다.
인바운드 규칙과 아웃바운드 규칙을 설정하여 여러 가지 트래픽을 제어 할 수 있다. 생성된 Security Group이 AWS 리소스에 할당되면, 해당 인스턴스 바로 앞단에서 접근 제어를 하게 된다.
보안그룹은 인터넷게이트웨이(IGW)와 연결되기 때문에 HTTP나 HTTPS 포트를 허용하게 되면 web 서버를 간단하게 구축할 수 있다.

  • Inbound
    인바운드 규칙은 EC2 인스턴스로 들어오는 트래픽에 대한 규칙이다.
    쉽게 말하면 규칙을 정하여 특정 프로토콜, 포트만을 지닌 ip가 나의 공간에 접근 할 수 있게하는 보안장치규칙 설정이다. (ex. SSH(관리자)-22port, MySQL(DB)-3306port)

  • Outbound
    아웃바운드는 그 반대로 데이터를 인스턴스에서 내보낼때, 해당 트래픽에 대한 규칙이다.
    기본 값은 모든 트래픽을 허용하며, 인바운드와 같이 규칙을 설정할 수 있다.



서버 생성

이제 나만의(서비스만의) 네트워크를 구성하였기 때문에, 이 네트워크에 EC2 인스턴스를 생성하면 된다.
모든 인스턴스는 vpc 안에 위치하게 되고, vpc는 AZ안에 위치하게 된다.

인스턴스는 subnet에서 설정한 외부망, 내부망(+관리망)에 따라서
외부망에 웹 서비스 용도의 EC2, 내부망에 데이터베이스 용도의 EC2, 관리망에 베스쳔 서버 용도의 EC2 를 생성할 수 있다. (이건 subnet을 어떻게 구성하였는지에 따라 다르다.)


베스천 서버의 구성했다면, 이제 다음과 같이 서비스용 서버(WAS) 에 접속할 수 있다.

## 베스천 서버에서 서비스용 서버 접속 방법1
bastion $ ssh -i [pem 파일명] ubuntu@[서비스 서버 private ip]

## 베스천 서버에서 서비스용 서버 접속 방법2 (별칭 등록 [서비스용 private ip] [별칭])
bastion $ vi /etc/hosts 
bastion $ ssh [서비스 서버 별칭]

Bastion Server 란?
보안에 문제가 생겼을시 서비스에 심각한 문제를 방지하고자 피해를 보더라도 Bastion Server만 재구성하여 서비스에 영향을 최소화하도록 다른 서버들과 구분하여 보안을 위해 고안된 서버이다.
또한, 보안에 문제가 생겨 서비스용 서버에 접근이 어려울때 서비스 정상 트래픽과 관리자용 트래픽을 구분하여 별도의 경로를 확보할 수 있다.

현재 우리는 SSH(Secure Shell) 22번 포트 를 통해 운영 중인 리눅스 서버에 접속한다.
하지만 만약 22번 포트의 보안에 문제가 생긴다면 중요한 회사 서버 내역들의 보안에 문제가 생길 것이다.
때문에, 22번 Port 접속을 Bastion 서버에 오픈하고 그 서버의 보안을 더욱 집중하는 것이 효율적이다.
(모든 서버의 보안을 최상으로 하다보면 관리할 것이 많아진다.)

Private IP로만 접근이 허용된 서버를 외부에서 접속하고자 할 경우, Bastion Host를 경유하여 Private IP 서버에 접근하도록 보안을 구성할 수 있다.

Bastion Host가 없는 경우 외부 네트워크에서 공격을 받아 패스워드가 탈취 당하면 내부 네트워크 Server에 바로 접근이 가능해진다. 하지만 Bastion Host를 운영하고 있다면 외부 네트워크의 패스워드가 탈취 당하더라도 내부 Server까지는 한번에 접근할 수 없다.


추가적으로,
AWS 에서는 EC2 인스턴스를 생성하면 private ip , pulbic ip 2가지 ip를 제공한다.

  • private ip
    private network 에서만 고유한 ip 이다.
    두 개의 다른 private network 에서는 동일한 ip여도 서로 다른 ip인 것이다. (101동의 101호와 102동의 101호는 다른 집인 것과 동일하다.)
    NAT+인터넷 게이트웨이(proxy역할) 을 통해 www에 접속이 가능하다.

  • public ip
    전체 웹 상에서 고유해야하는 ip 이다.
    두 개의 장비가 동일한 public ip를 가질 수 없다.

간단하게 생각하자면 private ip 는 AWS 네트워크 내부에서 사용 가능하고, public ip 는 www 접속시 사용 가능하다.
만약 우리가 EC2 인스턴스에 SSH 접속을 하고 싶다면, 현재 vpc 같은 네트워크 망에 있다면 private ip로 아니라면 public ip로 접속하면 된다.





✨ 요약

  1. 웹 서비스를 운영할 서비스 전용의 네트워크를 구성하기위해 VPC(집)를 생성한다.
  2. VPC 내부에 컴퓨터(리소스)를 위치시킬 수 있는 subnet(방)을 생성한다.
  3. IP를 가지고 있다고 모든 인터넷과 바로 연결되는 것이 아니다. 인터넷 통신을 가능하게 하기 위해 Internet Gateway(문,통로)를 연결한다.
  4. 나의 네트워크,목적지에 대한 길을 알려주기 위하여 Route Table(이정표)를 생성한다.
  5. 모든 트래픽을 허용하지 않고, 특정 ip만 허용하려면 Security Group(접근제어)의 inbound 규칙을 통해서 원하는 port들을 구분/접근을 제어할 수 있다.
  6. 위를 통해 구성한 네트워크에 이제 EC2 instance 서버를 생성해준다.






[참고]
https://dev.classmethod.jp/articles/for-beginner-vpc-explanation/
https://eataws.tistory.com/m/20
https://www.javatpoint.com/aws-nacl-vs-security-group
https://tech.cloud.nongshim.co.kr/2018/10/16/4-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B5%AC%EC%84%B1%ED%95%98%EA%B8%B0vpc-subnet-route-table-internet-gateway/
https://yoo11052.tistory.com/40
https://err-bzz.oopy.io/c4abbed2-fc30-4061-81b0-2803c4a59809
https://err-bzz.oopy.io/1b00f195-1bde-431b-9599-857ef2394445
https://seondongpyo.github.io/infra%20workshop/infra-workshop-week1-step1/
http://blog.plura.io/?p=13106
https://err-bzz.oopy.io/f5616e26-79ca-4167-b2eb-140de69b9b54
https://4betterme.tistory.com/106
프로젝트 공방 - 망 분리하기

profile
- 👩🏻‍💻

0개의 댓글