VPC, Public/Private Subnet, NAT Gateway

박재하·2023년 11월 20일
0

VPC, Public/Private Subnet

NCP에서 가장 중요한 건 IAM

IAM은 계정의 Authentication, Authorization을 담당하는 서비스예요

그 다음이 VPC

VPC는 가상의 서비스 네트워크 망임 (중요하고 재밌음)

네트워크 여러 개가 연결되어 있는 게 인터넷이야

서브넷 몇개가 날아가도 ㅇㅇ 몇개 선만 살아있으면 연결 가능

그래서 그 연결 경로를 찾아주는 라우터란 애가 있어. 얘는 라우팅을 해줘

아무튼 우리는 서버가 한 대가 아니잖아

그래서 VPC는 여러 대의 서버를 잘 연결해주는 역할.

예전엔 없던 기능인데 지금은 다른 사용자 네트워크와 논리적으로 완전히 분리됨

AWS 최초에는 S3만 있었음. 그 다음에 EC2가 나옴.

초기 EC2에는 분리된 망이 없었음 → AWS 사용자가 10만명이야 그럼 다 같은 망에 있는거야.

안전해 안안전해? 안안전해! 설정 잘하면 다른 서버에 접근할 수도 있고 그랬었어..

네트워크 토폴로지라고 하는데, 그래서 결국 사용자가 네트워크를 마음대로 세팅할 수 없었어.

그래서 생긴 게 VPC. 일반 데이터센터처럼 개인마다 사설망을 구축하는 거임

한 서비스 운영하는 데 VPC 몇개? 1개? 좋긴한데 서비스당 최소 1 개 필수!

3개까지 필요할 수도 있음

VPC 안만들면 어떻게 돼? 그럼 default VPC에 들어가요.

테스트 용도로는 좋지만 서비스 용도로는 좋지 않아.

참고로 AWS는 Region과 AZ라는 개념이 있음. Region은 AZ의 집합이다.

AZ는 Availabilty Zone이라서 논리적인 IDC임. Internet Data Center.

VPC는 리전 기반 서비스예요. 이유? 여러 AZ에 걸쳐서 사설망을 구축해야 좋거든요.

왜? 목동이랑 춘천에 IDC가 있으면 그 중 하나가 벼락맞아서 망해도 괜찮죠.

뭐 물리적으로 가까우니 한 AZ에 때려넣고 서버 간 통신속도를 높일수도 있긴하지만 위험

AWS 서버를 여러 AZ에 걸쳐서 분산시키는 것을 Multi AZ, MAZ라고 함.

서버 운영에서 고가용성(사고에 대비)을 위해 MAZ는 필수

VPC 서비스 들어가보면 default VPC가 있을거임

EC2 만들 때 암것도 안하면 default VPC에 들어감.

VPC 생성. wizard 없이 수동으로 만들어보겠음

CIDR이 있는데 이게 뭐게요?

  • 대충 이거 말하는거임 IP를 지정된 범위로 나누고 묶을 수 있음
    EX) 192.168.10.0/24
    32 - 24 = 8
    8bit -> 2의 8승
    256 - 2 (첫번째, 마지막) => 254 개의 호스트 사용가능

IP의 범위를 나누는거임!!! Classless Inter-Domain Routing!

뭔 뜻이죠 클래스가 있나요 IP에? 그쵸 있죠 클래스 A,B,C,…

IP 주소 공간을 특정한 범위로 나눠넣은거임. 이걸로 뭐하는거냐?

IP는 인터넷 상에서 장치를 식별하기 위한 주소체계임.

IP프로토콜에서 사용하며, 라우팅 할 때 쓰임.

라우팅: 패킷이 목적지를 찾아갈 때 경로를 결정하는 과정

그래서 IP는 네트워크 부분과 호스트 부분 크게 2가지로 나뉘는데,

라우팅 할 때 1차로 호스트가 속한 네트워크를 찾아가고, 그 뒤로 네트워크 내에 호스트를 찾아감.

네트워크 부분과 호스트 부분을 나누는 건 예전 기준으로는 8.8.8.8 이렇게 있으면 대충 점 중에 하나 자유롭게 나눌 수 있었다!

왼쪽부터 A, B, C, D 이런 식인데 A클래스는 호스트 수를 많이 둘 수 있는 반면 비싸고,

D 이런건 호스트 수는 적지만 싸고. 근데 이것도 구분이 애매했다!

그래서 CIDR이라는 기술이 나와서 네트워크, 호스트 부분을 비트 단위로 자유롭게 나눌 수 있게 했다!

CIDR은 다음 시간에 설명

IP / 상위고정비트 형식임

그래서 IP 부분까지가 네트워크 파트고, 상위고정비트 파트가 호스트 파트야.

ex)

0.0.0.0/0 → 고정없이 다 유동 0.0.0.0 ~ 255.255.255.255 === Any address

192.168.0.5/32 → IP 1개 (32비트 고정)

10.5.0.0/16 → 10.5.0.0 ~ 10.5.255.255 (16개 비트 고정) === 65536개

10.5.1.0/28 → 10.5.1.0 ~ 10.5.1.15 (28개 비트 고정. 4개 유동) === 16개

고정 비트가 16~28bit다 → 유동 IP 16~65536개

근데 서브넷마다 고정된 5개의 IP가 있어서 5개는 못씀

브로드캐스트(마지막IP), 게이트웨이 등등

가정용 공유기의 사설IP 국룰 192.168.

근데 AWS VPC에선 예약된 사설 IP대역이 있음

10.0.0.0/16~28 해서 쓰는 경우가 많음.

NCP에서도 VPC 똑같이 있으니까 만들어 봐요.

IP 대역 함부로 하면 안되는게 8.8. 대역 만들면 아무 문제 없게 생성되더라도

실제 외부 IP랑 내부 IP랑 충돌나면 당연히 내부를 먼저 라우팅하니껜 8.8. 쓰는 구글같은 데 접속못해

그래서 보통 지정된 사설망 대역이 10.대역, 172.대역, 192.대역이 있음 이중 하나써 그거 안쓰면 외부 서비스와의 IP대역 중복가능성이 있으니껜~

이제 VPC(honux-test-vpc) 내에 서브넷을 만들어줘야해

보통 honux-test-public-subnet-1 이런식으로 이름을 설정함.

서브넷을 만들 때는 AZ를 하나 골라주고요

VPC CIDR Block은 아까처럼 10.77.0.0/16으로 하고

Subnet CIDR Block은 그 대역 안에 있게. 10.77.1.0/24 이렇게 해줘야함.

그다음 private subnet을 추가해줘야 함.

public에 서버가 들어간다면, private에서는 DB가 들어가겠죠?

이름 honux-test-private-subnet-1 이걸로 짓고

VPN CIDR Block은 10.77.0.0/16으로 하고

Subnet CIDR Block 그 대역 안에 있게. 10.77.51.0/24 이렇게 해주자.

이제 외부와의 연결을 위해 인터넷 게이트웨이(IGW)를 생성해서 VPC에 연결해줘야 함.

이래도 연결 안됨 일단 EC2 만들어보자. 키페어는 미리 만들어둔 거 쓰고,

네트워크 설정에 VPC, 서브넷 만들어준 거 설정해주고(public),

ssh만 일단 허용해주고, 인스턴스 만들어 봅시다.

근데 인스턴스 만들어서 보면요! public IP가 없어서 외부에서 접속할 수가 없어요!

이때를 위해 Elastic IP(탄력적 IP 뭐시기)라는 게 있어요.
고정IP를 외부IP 할당할 수 있는건데, 이거 연결해주면 됨

한 달에 3천원 쯤 해요. 연결해놓고 서버가 살아 있으면 돈 안나간대요

ssh -i [키페어파일(.pem)] ec2-user@[아까 그 외부IP]

하면 연결돼야 하는데 안됨 왜?

규칙이 없잖아! 라우팅 테이블에 규칙을 설정해줘야 연결이 된대요

public 라우팅 테이블이라는 것을 생성해야 해요.

생성하고 라우팅 편집 들어가보면

대상 - 대상 - 상태 - 전파됨 있는데 번역오류임

Source - Destination?Target? - Status - 전파됨 하여튼 이런식임

0.0.0.0/0 → 인터넷 게이트웨이 설정을 그래서 암튼 추가해줘야 함.

아직도 안돼요 이 만들어진 라우팅 테이블을 서브넷(public)에다 연결해줘야 함.

VPC아니고 라우팅 테이블은 Subnet당 하나의 라우팅 테이블을 가지고 있어야 해!

원래 기본 라우팅 테이블 돼있는거 바꿔줘.

마지막으로 서버 설정에 방화벽에 해당하는 SG(Security Group) 설정 해보는거임.

이거까지 해주면 마 침 내 된다!!!

AWS_%E1%84%82%E1%85%A6%E1%84%90%E1%85%B3%E1%84%8B%E1%85%AF%E1%84%8F%E1%85%B3_%E1%84%80%E1%85%AE%E1%84%89%E1%85%A5%E1%86%BC%E1%84%87%E1%85%A1%E1%86%BC%E1%84%87%E1%85%A5%E1%86%B8_%E1%84%8B%E1%85%AD%E1%84%8B%E1%85%A3%E1%86%A8

이건 외부 자료. 요약임


여기서 멈추지 않고 인스턴스를 또 하나 만들어버릴거임 !

ubuntu로 만들고요 키도 일부러 다른 걸로 만들어 보고요(public, private이니까요 보안때매)

Security Group도 하나 만들어 봅시다. (Create Security Group)

퍼블릭 IP 자동 할당 필요 없고요

보안 그룹 이름은 private-subnet-sg 이렇게 써주고요

인바운드 보안 그룹 규칙으로 10.77.0.0/16을 설정할거예요.

이게 무슨 의미냐? private subnet은 VPC 안에서만 접속할 수 있다!


이제 private을 외부에서 접속하는 법? DB는 깔아야하잖아!!

키 관리하기 귀찮잖아

key 포워딩?? ssh 키 포워딩

ssh-add -k [키페어파일(.pem)]

이게 뭐 키체인처럼 조수가 키를 관리해주는거예요.

ssh -A [주소]

그럼 이제 이렇게 접속하면 접속가능가~~

  1. public로 ssh 접속
  2. 이걸 거쳐서 거기서 다시 ssh 해서 private으로 접속!

이렇게 두 단계로 접속을 하는 건데

또 이걸 안하려면 SSH 터널링이라는 방식을 이용할 수도 있음.

뭐 하여튼 ㅇㅇ

하여튼 NAT Gateway라는 걸 만들어주면 됨.

내가 보낸 게 되돌아올 때 Network Address Translation

즉 사설 IP를 공인 IP로 변환해주는 서비스임.

그러고나서 private 라우팅 테이블을 0.0.0.0/0을 NAT로 설정해주면 돼요.

결국 인터넷은 돼야하는데, 외부 인터넷이 나한테 막 들어오면 안되니까 NAT를 쓰는거임.

옛날에는 NAT가 없었어. 그래서 어떻게 했냐면

EC2 인스턴스를 NAT 역할을 해주도록 할 수도 있어요. 이걸 NAT Instance라고 함.

iptable이라고 하는 리눅스 내부에서 방화벽 관리하는 걸 설치해줘요.

그 뒤에 설정 파일을 만들어요. ip 포워딩을 해주도록요.

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2023-11-13_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_3 18 15 %E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2023-11-13_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_3 19 44

뭐 하여튼 이러쿵 저러쿵 하면 된대요. 어렵고 복잡하대요.

젤 쉬운 꼼수는 뭐냐? 그냥 인터넷 쓰고 싶을 때 일시적으로 public으로 만들어주는거예요 ㅋ 라우팅테이블 잠깐 등록해놨다가 필요할 때 빼는 식이지요~

사실 private에서 인터넷 연결할 일이 잘 없어서 초기 DB 설치할 때만 연결하고 빼면됨.

EC2 인스턴스에 보안 때문에 소스/대상 확인 변경(source-destination check)을 중지하지 않으면 뭐 NAT가 동작을 안함. 그래서 꺼줘야함.

NAT 인바운드 규칙으로 private그룹의 모든 트래픽이 NAT으로 가야하는데,

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2023-11-13_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_3 23 38

그걸 처리해주기 위해 0.0.0.0/0에 private 보안 그룹(sg) 자체를 등록해주면 됨.

마지막으로 라우팅 테이블을 또 추가해주면 된대. private subnet에.

private 내부에 있는 트래픽이 NAT쪽으로 다 갈 수 있게 NAT 인스턴스로 연결.

뭐 이것저것 했는데 잘 안됨. 인프라 엔지니어가 할 일이긴 하지만 스타트업가면 인프라 엔지니어가 누구다? 나다 ㅋ

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2023-11-13_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_3 28 56

뭐 하여튼 결론은 안돼서 돈으로 해결함 ㅋ NAT 게이트웨이 서비스 씀

인터넷 되는지 안되는지 보려면 하여튼 ping [ietf.org](http://ietf.org) 뭐 이런식으로 핑때려보면됨.

대기업에서는 돈 많으면 Redhat, 돈 없으면 CentOS씀. 근데 망했어 CentOS가 ㅋ 아직까진 Cent를 많이 쓰나봄.

스타트업에서는 Ubuntu도 좀 씀 (그리 효율적이지 않나봄)

NAT Gateway

Private Subnet 내 인스턴스에 접근하는 법

결국 Public Subnet 내 인스턴스를 통해 접근 하는 건 똑같은데 다음 두 방법이 있음.

  • SSH key forwarding
    • ssh -A 옵션을 이용해서 함
  • SSH tunneling

원래 인터넷이 안돼야 하는데, 어찌저찌 설정했더니 지금 돼더라. 퀴즈. 왜 그럴까요? 그러려면 봐야되는 것들에 대해서 쭉 살펴봄.

보안그룹(SG), 라우팅테이블 등등!

네트워크 보안장비들에 대해

모든 보안그룹은 인바운드(들어오는거), 아웃바운드(나가는거)가 따로 있는데, 대부분의 경우 아웃바운드는 모두 허용.

NACL

NACL이라는 것이 있음 (Network Access Control List)

이건 Stateless야. 들어올 때 나갈때 상관없이 다 검사해요

  • NACL은 Stateless, 보안 그룹(SG)은 Stateful이다.
    • 이거 면접에서 많이 물어봄

게임서버 같은 것들은 규칙이 엄청 복잡해서 위 네트워크 장비들로는 충분하지 않아서 OS 자체 방화벽(iptable같은거)을 많이 또 씀.

ALB

Automatic Load Balancer 이런 걸 두고 자동으로 스케일링 하는데,

이것만 가지고도 충분하지 않으면 CDN을 뭐요.

CDN으로도 충분하지 않으면 (sql injection같은 공격 많으면) 그 앞단에 WAF를 또 둬요.

  • 향로님의 “인프런이 이런 아키텍쳐를 가지고 있어” 하는 강의 꼭 들어보세요.

이런 얘기들을 바로 알아들으란 뜻이 아니고 지금 한 번씩 들어두면 좋다. 나중엔 어짜피 다 알게 된다.

Routing Table

라우팅 테이블의 인바운드 규칙을 또 봐야죠. 허용이 돼있네요. 그래서 되는거였네

https://user-images.githubusercontent.com/138586629/284130508-9fac7b21-238b-4d8e-8535-c150bdcbb7ff.png

https://user-images.githubusercontent.com/138586629/284130577-134d08f4-0647-42f7-b294-8eda49fd14d2.png

꾸준함과 멘탈 관리가 가장 중요

이제 인터넷 잘 연결됩니다. 인터넷이 막혀있는데 인터넷이 되죵~

NAT Gateway를 설정을 한거랍니닷

profile
해커 출신 개발자

0개의 댓글