VPC

야구 미션 관련

  • ec2 두대로 연습후 rds로 바꿔치기해라
  • 3306 DB 포트 서버 외부에 개방하지 말자
  • 80포트만 개방하고, 8080은 외부에 개방하지 않는다고 하면, 22 80 두개만 열어두면 된다. 왜 이렇게 할까? 알아보자.
  • aws는 백엔드와 클라우드 인프라를 이해하는 것이 좋기 때문에 사용하는 것이다.

VPC

virtual private cloud이다. aws의 사설 네트워크망이다. VPN이라고 지었으면 좋았을텐데 VPN이 이미 있어서 vpc로 이름지은 것이다.

aws에서 먼저 생긴 서비스는 순서대로 1) s3 2) ec2이다. 가장 오래된 서비스가 s3인데, s3는 일종의 pas서비스로 볼 수 있어서 api로 업로드 다운로드가 가능하다. 네트워크 필요없다. ec2는 반면에 네트워크가 필요한데, 초기 ec2에는 다음과 같이 했다. 인터넷 네트워크와 유저가 있다. 유저는 인터넷 네트워크를 통해 aws 전체 망에 접속했다. aws 전체 망 안에 s3, ec2 인스턴스 등이 있었다. 모든 ec2들이 사설 네트워크 망안에 들어있는데, 그것을 우리가 지정할 수 없다.

네트워크는 항상 물리적으로 연결돼있어야한다. 와이파이는? 역시 물리적으로 연결되어 있다. 전자파도 물리이며, 연결되어있다. 진공상태에서도 연결되는데 전파는 매질이 없기 때문이다.

1. A-B-C
2. A-B
   \C/

topology, 분포도와 산포가 다른 세 개의 네트워크가 있다. 1은 a-c간 통신이 어렵고, 2는 전선을 하나 더 깔아야한다.
컴퓨터가 네개가 있다면,

a-b
|X|
c-d

식으로 매쉬 형태로 연결한다.
나중엔 이것이 어려우니,

ㅡㅡ
||||
abcd

abcd와 같이 연결해주는 허브(ㅡㅡ부분)를 등장시켰다. 얘가 abcd를 각각연결하는 선을 대신해 통신해준다. 그런데 비싼 하드웨어를 쓰기 싫으니 내부적으로는 마치 안에서 연결된 것이나 마찬가지다. 그런데 이렇게 하면 당연히 a로 보내면 bcd로 브로드캐스팅하므로, 성능이 좋지 않다. 브로드캐스팅이란, 방송을 뜻하기 때문에 (통신과 달리) 보내는 대상이 정해져있지 않고 불특정다수가 수신한다. 따라서 받는 사람이 받을때 무시할지 말지 결정할 수 있다. 그에 반해 통신은 정해진 대상에게 한다. 브로드캐스팅하는 동안은 다른애들한테 다른 메세지를 동시에 보내지 못하고, 추가적인 장비를 설치할 수록 성능이 나빠진다.
앞서 말한 허브는 더미허브로 L2디바이스이다. 더미허브에서 개선된 것이 스위칭허브이다. 브로드캐스팅하지 않고 특정 대상에게만 전송하기 때문에 다른 사람도 쓸 수가 있다. 세네대를 허브에 물리면, 느려진다. 그렇기 때문에 허브를 연결한 스위치를 연결해준다. 스위치는 A->C 메세지를 보내면 스위치가 허브에 몰려있기 때문에 스위치가 그 신호를 받는다. 스위치는 어떤 부분이 A-D, E-F, G-I 에 연결되어 있는지 알고 있다. 그렇기 때문에 A-C에 연결된 부분에....??

A->G로 보낸다 하면, 같은 허브의 BCD는 자기한테 받는게 아니라 무시한다. 스위치는 G라는 것을 알기 때문에 G가 위치한 허브로 내려보내준다. G가 소속한 허브는 허브 전체에 브로드캐스팅해주고, 허브 안의 G가 아닌 애들은 무시한다. 스위치는 L3 레이어에서 동작한다.

L3망은 좀 더 큰 L4망으로 연결되어있다. 라우터는 L3계층이고 L4는 그 위에 장비로 연결되어 있다. 라우터는 TCP/IP로 연결되어있다. L3는 목적지를 인식하는데, MAC어드레스를 통해 인식한다. 모든 하드웨어는 맥어드레스를 갖고 있고, 이것으로 통신한다. 라우터는 인터넷으로 통신한다.

일반적인 회사의 장비는 ,
Router
/ \
Switch switch

라우터는 3계층장비이고, 로드밸랜서가 tcp?를 알고 있어서 l4라고 부른다.
https://coding-chobo.tistory.com/38

스위치가 비싸던 옛날엔 스위치 아래 허브들을 연결했는데, 이젠 가격이 싸져서 스위치 아래 바로 연결한다. 스위칭 허브라고 부른다.

인트라넷은 인터넷과 반대개념으로, 사내망이다. 쪼개는 것을 서브넷이라고 부른다. 망을 쪼개는 이유가 무엇일까? 쪼개진 망은 컴퓨터에서 공유기로 연결하면 서로 컴퓨터 아이콘 pc몇번으로 보인다. 컴퓨터 망 안에서 다른 컴퓨터가 보이는 이유가 무엇일까? 누군가가 나의 존재를 알려주는 것이다. 무엇을 이용해서 알려주냐면, 공유기한테 브로드캐스팅으로 내가 있다고 신호를 보내는 것이다.

DHCP: 내 컴퓨터를 공유기에 연결하면 ip가 생긴다. 자동으로 ip를 받아오는 것을 dhcp프로토콜이라고 한다. 연결이 되었으면, ip하나 달라고 공유기한테 얘기해야하는데, 공유기가 누군지를 모른다. 그러면 ip를 하나 달라고 브로드캐스팅하고, 공유기는 이것을 받는다. 공유기는 ip를 ~번을 쓰라고 브로드캐스팅한다. 즉 공유기 안에서는 브로드캐스팅이 가능하다.
서브넷 안에서는 브로드캐스팅이 가능하다. 공유기, 인터넷망, 사내망이 있고 별도의 서브넷으로 쪼개지면, 사내망 vpn을 굳이 망을 쪼개는 이유는 보안/성능 측면에서 망분리하기 때문이다. 옛날에는 성능이 더 중요했는데 요새는 보안이 중요하다. 용도에 따라 쪼개야 필요한 것만 브로드캐스팅할 수 있다.

현대 클라우드에도 이 개념이 남아있다. 예전 데이터센터에선 라우터 아래 망을 서브넷으로 용도에 따라 쪼갰다. 사용자가 라우터를 통해 퍼블릭 네트워크 망으로 들어갔다. 퍼블릭 망 또는 dmz 존이라고 불렀다. 최전방지대, 비무장지대는 우리의 주적(유저)과 우리가 맞닿아있기 때문이다. dmz존에는 따라서 웹서버가 있어야한다.
private 망은 좀더 안전하게 관리되어 유저가 들어올 수없고, db가 온다. 그리고 web서버와db는 라우터를 통해 서로 통신이 가능하다. was는 웹서버, db에 어디에도 위치해도되는데, 3306을 열면 유저가 바로 db로 접속할 수 있기때문에 닫으라는 얘기다.
그리고 유저는 들어올 수 없는데, 나는 인터넷을 할 수 있다. 왜냐하면 db소프트웨어를 설치해야하기 때문이다. 다이렉트로 인터넷을 연결하지 않고, 웹서버에 중개자를 두어 얘를 거쳐 인터넷을 하 ㄹ수 있게 두다. NAT: network address translation이라고 부른다. 인터넷을 하기위한 조건은 1)공인 ip (사설 ip말고) 인데, db는 이게 없고, 마치 public ip가 있는 것처럼 주소 변환을 해주는 것이 nat이다. 가정용 공유기가 nat역할을 해주는데, 말만 공유기지 무선인터넷, 유선 연결, vpn, 포워딩, dinamic dns, nat등 거의 모든 기능을 갖고 있다. db에 퍼블릭 공인 ip를 부여하면 유저가 접속할 수있기에 그렇게 하지 않고, dmz 서브넷에 있는 애들만 퍼블릭 ip를 갖느다. db접속하기 위해서 다이렉트로 접속하면 안되고, 별도의 접속 서버를 이용해 들어가는 것이 일반적이며, 바스티안으로 부른다.

public | private |security
웹서버 DB(nat통해 인터넷 연결) 민감 정보(인터넷 아예 안됨)
점프인(바스티온) ISMS, PCI-dss 등에 규정된 내용
nat

security쪽 db 정보가 필요하면 vpn으로 접근한다.
그렇지만 일반적인 회사에서 이렇게까지 security로 보안 강하게 나눠놓지 않고, 유명해져서 감사들어오면 그제서야 바꾼다.

VPC

이 컨셉을 그대로 옮겨온것이다. aws 안에 전체에 ec2가 아무렇게나 막 있었다. 그런데 어떤 ec2들이 어떻게 망으로 연결될지는 정해져있지 않고, 적당히 묶여서 적당히 네트워크로 연결되어있었다. 이것이 ec2-classic이었다.
그런데 고객들이 원하는대로 네트워크 망을 구성할 수 있도록 해달라고 요쳥해서 aws에서 제공하는 서비스가 vpc이다.

vpc를 이용해 커다란 망을 하나 만든다. seoul 망 안에 bb망을 만든다. 서비스를 가지고 망을 만든다. 서비스가 3개면 vpc를 몇개 만드나? 서비스 하나당 vpc하나가 된다. 그럼 sidedish란 망이 있다. 그리고 그 안에 서브넷을 만든다. tom, mysql을 각각 넣고 둘을 연결해준다. 사용자들은 인터넷 게이트웨이를 통해 접속한다.

유저가 mysql에 3306, 22로 들어가면 안된다. ec2, rds로 만들어도되는데, rds 복제기능사용하면 돈나와서 쓰지 말아라. 원래대로라면 톰캣에 nat, bastion등도 만들어야하는데, 돈이 없으므로 우리의 하나뿐인 서버에서 엔진엑스, nat, bastion, 톰캣에서 올인원서버로 전부 다 기능하게 만들면 된다.

ARP: 단말에서 dhcp로 브로드캐스팅해서 ip를 요청하면, dhcp는 어떤 단말에서 ip를 요청했는지 알 수 있다. 단말에서 hcp로 요청을 보낼때 mac주소도 그 요청에 포함되면 dhcp는어떤 단말에서 ip요청했는지 알 수 있을 것 같다.

NAT :db가 인터넷하고 싶을때,
Jumpin: 인터넷에 ssh포트가 열려있음


210504 수업

User가 internet에 Router으로 접속, Router에서 인트라넷, 사내망을 접속. 사내망은 private network이며, 이 아래 subnet이 있다. 같은 서브넷끼리는 브로드캐스팅이 가능하다.

옛날에 aws ec2에 엄청 좋은 그래픽 카드가 꼽혀있는 경우가있다. GPGPU 인데, 연산용이다. 코인채굴을 한다. 이게 시간당 3천원으로 아주 비싼 편이다. 그런데 ec2에는 스팟 인스턴스란게 있어서, 경매 방식으로 입찰해서 놀고 있는 인스턴스를 입찰한 사람에게 나눠주는 것이다. 단점은 아무도 없으면 시간당 10센트로 아주싼데, 누군가 나보다 높은 금액으로 입찰하면 인스턴스를 1분만에 빼앗긴다. 그 안에 데이터도 같이 날라가버린다. 그렇지만 잘 쓰면 아주 저렴하게 이용 가능하다.
홍콩에 드론 장사 아저씨도 서버 4대중 1개를 스팟 인스턴스로 사용해 서버 비용을 70% 줄였다고 한다.

스팟인스턴스에 vpn클라이언트를 깔아 시간당 4백원으로 좋은 그래픽카드 사용가능하고, ebs snapshot을 바로 붙여서 사용가능하다..?

VPC 만들기

도커 등이 대세인데, 배포는 이것을 이해하기 위한 사전지식 중 하나이다.

aws는 리전마다 서버를 따로 구축한다. 각 리전 코드는 공항과 같다. 각 리전마다 아무것도 안해도 vpc가 만들어져있다. 디폴트 vpc란 것이 계정마다 있는데, 모든 게정마다 디폴트 vpc가 필요한 이유는 aws 서비스 중 vpc가 반드시 필요한 서비스들이 있다. aws서비스 중에는 vpc가 필요하거나/옵셔널하거나/필요없는 서비스가 있다.
ec2는 반드시 vpc 안에 있어야한다. 서버가 네트워크 망 없이 될리가 없다.
옵셔널한것 중 대표적인것은 lambda가 있다. 서버 없이 코드 실행 가능해서, 스프링, nodeJs 등 여기에 올릴 수 있다. 옛날에 탄핵.com 만든 아저씨가 있었는데, 1000만동접자가 있었다. 서버 아키텍쳐 잘 구성해서 한달에 1600원으로 운영했다.
S3는 vpc유저가 인터넷을 통해 접속한 aws망 위에 vpc 안에 ec2가 있고, vpc밖에 s3가 있다. aws위에 별도로 l2가 있다. vpc안에 람다를 넣을수도 있고 아니면 aws 망에서 vpc밖에 있을수도 있다. 이 두 경우의 차이는 무엇일까?
vpc안의 람다/ 밖의 람다: was는 public/private에도 넣을 수 있다. was 입장에서 같은 프라이빗 서브넷이 바깥으로 가려면 nat의 도움이 필요하다. 그래서 바깥의

vpc aws에서 만들기

ec2 인스턴스 그냥 만들면 3.인스턴스구성 네트워크 선택하는 단계에서 디폴트 vpc에서 만들어진다. vpc만드는 이유는 망분리를 위해 만든다. 서비스마다 각각 다른 서비스를 만들어야한다. 또 다른 이유는 개발환경과 베타 환경을 다른 망으로 분리하기 위해서 만든다.
플레이그라운드 같은 개발환경은 별도의 망으로 테스트하고 그 다음엔 알파 망에서 테스트하고 좀 더 정형화되어 함부로 할 수 없다. 그 다음 베타망에서 테스트하는데, 많은 경우 실제 db를 사용하기 때문에 함부로 하면 안되고, 마지막으로 프로덕션에 올리는 것이다. 이럴 경우 하나의 서비스를 위해 4개의 vpc가 필요하다.
개발망은 테스트용으로만 만들고 테스트 끝나면 삭제한다.

  1. vpc서비스 선택, 위저드도 있지만 쓰지 말고 수동 생성하자
  2. vpc 생성- 설정에서
    이름 설정,
    ipv4 cdir: 범위를 말한다. ip범위는 0.0.0.0~255까지 32비트의 범위를 갖고 이로 40억개의 ip를 표현할 수 있다. 그런데 범위를 나타낵 싶을 떄 ip200개를 일일이 표현하며 ㄴ힘드므로 side address를 표기한다. 이것은 0.0.0.0/0으로 /0으로 접미사를 붙여, 상위고정비트로 0비트를 고정한다. 즉 32-x 비트가 가변한다. 즉 전체가 다 변할 수 있다는 뜻이다. 그럼 각 자리의 0이 0~255의 값을 가질 수 있다. 가변비트는 무조건 0으로 채워줘야한다. 다시 말해 0.0.0.0/0는 any address를 뜻한다. 보안 그룹에서 범위 지정할 때 이는 보안 그룹 포트를 전세계 모두에게 열어주겠다는 뜻이다. 아이디패스워드 만들었거나 3306 열어두면 며칠 안에 탈취당할 수 있다.
    152.68.0.5/32면 가변비트가 32이므로 변할수있는 비트가 0개, 하나의 ip이다. 10.5.0.0/16이면 앞 두개는 고정, 뒤 두개는 가변이다. 따라서 2^8*2^8개의 주소를 뜻한다. (2^8=256)

B: 10.5.1.0/24면 2^8이므로 256개의 주소를 뜻한다. 얘는 A: 10.5.0.0/16 안에 포함된다. ip범위가 포함되는 범위이므로, B는 A의 서브넷이다. 10.5.2.0/24는c라고 하면, b와 겹치지 않는다. b와 c는 둘다 a의 서브넷이면서 서로 겹치지 않는다. exclusive하다.겹치게 구성하면 에러난다.

이것을 가지고 vpc를 똑같이 만들수있다.
2. ipv4 cdir블록에서
8.1.0.0/16은 2^16개의 주소를 만들겠다는 뜻이다. (/뒤에 올수있는 숫자는 최대 16, 최소 28인데 28개면 4비트이므로 16개가 필요하단 뜻이다.) 사설 ip이기 때문에 아무 ip나 써도 되지만, ip표준이 있기 때문에 정해진 사설 ip규격을 지키는 것이 중요하다. resolved ip를 써야한다. 127.0.0은 로컬호스트를 뜻하고, 192.168.~은 공유기가 사용하는 ip이다.

https://ko.wikipedia.org/wiki/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC_%ED%81%B4%EB%9E%98%EC%8A%A4

아무 ip나 써도 되지만 그러면 안되는 이유가 있다. 예전에 농협 장애가 난 적이 있는데, 회사 ip 접속이 안된 이유가 ibm ip를 농협 내부망 ip로 썼기 때문이다. 퍼블릭 ip로 같은 사설망 ip로 접속못한다. 라우터는 l3라 ip로 트래픽을 제어하는데, 우리가 사용하는 ip니까 라우터가 우리 ip라고 생각해서 패킷을 바깥으로 보내주지 않기 때문이다. ip는 규칙을 반드시 지켜야한다!! 사설망은 10으로 시작하는 것이 관행, 규격, 습관이다.

  1. ipv4 cdir블록에서 10.1.0.0/16만들고,
    태그도 Name,으로 정해준다.
  2. 디폴트 vpc가 아니라 우리가 만든 vpc라는 것을 표현하기 위해 10으로 시작하는 ip숫자를 적어준다. vpc 목록에서 확인해보면, 디폴트와 시작하는 숫자가 서로 다름을 확인할 수 있다.
  3. vpc에 인터넷이 안되면 소용이 없으므로, 인터넷 게이트웨이를 하나 만들어서 붙여줘야한다. 무조건 만들어줘야하고, 다른 옵션 없으므로 단순히 생성해준다.
  4. 인터넷 게이트웨잉에 생성된 게이트웨이가 detatched상태이므로,얘를 우리가 만든 vpc에 연결해준다. 이제 vpc에 인터넷 게이트웨이가 하나 붙어서 인터넷을 하기 위해선 반드시 필요하다. 사용자가 게이트웨잉를 통해서 접속할 숭 ㅣㅆ다.
  5. 서브넷을 확인하면 ipv4에 디폴트 vpc에 붙은 서브넷이 3개가 있다.
    서브넷 설정 - 우리가 만든 vpc에 속하는 서브넷을 생성해준다.
    가용 영역 - 서브넷은 반드시 데이터센터를 선택해야한다. (vpc는 리전 전체) 서브넷이 3개였던 이유는, 디폴트 vpc의 az가 세개여서 az별로 기본생성이되었기 떄문이다. 1-b 서브넷은 aws 내부적으로 사용해서 외부에서 안보인다ㅏ.
    서브넷

vpc에는 라우터역할 해주는 라우팅 테이블이 있다. 라우팅 테이블의 규칙은 10.1.0.0/16 은 목적지, local은 target. 타겟에 해당하는 ip를 destination목적지로 보낸다. 이 라우팅 테이블에 해당 데이터는 local에만 쓰이지 바깥으로 절대 나갈 수 없다. 농협 사태도 어떤 ip를 바깥으로 나갈 수 없게 설정해서 발생했었다.

라우팅 규칙을 보면 똑같이 생기는데, 새 규칙을 만들 수 있다
Destination을 0.0.0.0/0으로 설정한다. target을 인터넷게이트웨이로 설정한다. 타겟을 인터넷 게이트웨이로 설정해서 인터넷이 되는 라우팅테이블이 된다.

  1. 나중에 db만들면 nat을 통해서 (bastion은 접속서버로, 유저가 db를 통해서 하고 nat은 db가 인터넷용)
    target에 nat를 설정해주면 db가 인터넷을 설정해주면 된다.

인터넷과 인터넷게이트웨이.
퍼블릭 서브넷에 붙은 라우팅 테이블. 우리가 ec2를 만들면 통신을 하는데 퍼블릿 서브넷의 목적지가 바깥세상을 향하는게 있다면 인터넷 게이트웨이를 통해 양방향으로 연결 가능. 바깥 세상의 스누피도 인터넷게이트웨이를 통해서 들어올 수있다. 인터넷 게이트웨이는 말그대로 게이트이다.
프라이빗 서브넷에는 보통 DB가 있다. 얘의 라우팅 테이블 룰은 10.0.0/local, 0.0./0 nat 가 있을 것으로, db가 nat로 갈 수 있고 nat를 거쳐 인터넷을 할수있다. 그렇지만 user가 nat로 갈 수 있어도 nat를 통해 db를 접속할수가 없다.
공유기가 nat역할을 해주는데, 우리는 인터넷 접속이 되지만 인터넷에선 우리 컴으로 접속 못한다.

nat인스턴스 만드는 것이 쉽지 않다. 리스폰스 받으려면 nat에서 프라이빗 서브넷?으로도 갈 수 있어야한다.

인스턴스 생성하기 - 퍼블릭 서브넷에 하나, 프라이빗 서브넷에 하나.
퍼블릭 서브넷에도 인터넷을 하려면 퍼블릭 ip를 붙여줘야한다. 유동 ip있는 것 디폴트로 만들어진 것 쓰고...?
단계6: 보안 그룹: http는 전부 다 열어주는 것이 좋다. 다른 나라 사람들도 접속할 수 있게 만드는게 맞으니까.
프라이빗 서브넷 설정해서 만들어주고, 보안 그룹 설정할때 ssh는 웹서버인스턴스의 ip에 열어줘야한다. 두가지 방법이 있는데, 소스 부분에 10.1.1.0/24, 또는 sg-~~로 웹서버 보안 그룹에 소속된 인스턴스들에게만 허용해주겠다는 것이다.


그리고 mysql 소스도 같은 웹서버 그룹들만 db를 쓸수있게해준다.

퍼블릭 ip안만들었담녀 elasticip를 생성해서 서버에 연결해주면 된다.

웹서버 만들고, elastic ip붙였고, 웹서버에 db연결했다. 웹서버는 web-sg에 속하고, db는 db-sg에 속한다. 후자는 전자에 열려있다.

로컬의 key를 ssh-add -K starve.pem을 하면 key forwarding할 수 있다. ssh -A ec2-user@아이피주소 하면 key를 들고 접속을 한 것이다. db접속했으니
sudo yum install mysql-server 오라클에 마리아db가 디폴트 세팅이라 mysql설치하려면 설정변경해야한다.

nat 게이트웨이가 있는 이유는, nat인스턴스가 나쁘기 때문이다.
s3는 우리 망이 아니라 바깥에 있다. was가 프라이빗 서브넷에 있다고 하면 was가 s3 쓴다. 우리의 이미지, 동영상 파일들이 s3에 들어있다. 문제는 s3데이터 쓰려면 was는 항상 nat를 거쳐야한다. 이것의 문제는, 백대의 was가 전부nat를 거쳐 s3로 접속해야하면, 부하가 nat에 몰리게 되어 좋지 않다. nat가 장애가 나면 서비스가 죽어버린다. 이것을 spof, single point of failure, 단일장애지점, 으로 부른다. spof에는 nat 두개만들면 될 것 같은데, 너무 어렵고 거의 불가능하다.

이래서 넷플릭스에서 비슷한 것 만들었는데 아주 어렵고 삼성전자가 이런거 너무 불편하니까 aws에 나트 게이트웨이 만들어달라고 해서 만들어줬다.
나트게이트웨이는, 사용자가 많으면 늘어났다가, 사용자 없으면 줄어든다. 단점은 가격이다. 절대 만들면 안된다. 기본사용료가 한달 5만원이다.

나트게이트웨이 만든다면 웹서버 서브넷에 넣어야하고, 탄력적 ip무조건 할당해야한다. 만들면 끝이다. 만들어줬으면 라우팅 테이블 중에 하나를 더 만들어줘야한다. 라우팅 테이블에 프라이빗 테이블 설정을 nat gateway로 연결해주면 된다.

나트게이트웨이 삭제하면 돈이 나온다. 탄력 ip를 반드시 삭제해줘야한다.
default vpc 삭제하면 알아서 다시 생성해주면된다.

워크벤치에서 db연결하고 싶으면 ssh터널링하면된다.

좋은 웹페이지 즐겨찾기