본문 바로가기
가치관 쌓기/개발 돌아보기

[우아한테크코스Pro] 그럴듯한 서비스 만들기(network) - 1 [4/9]

by simplify-len 2021. 6. 17.

이번 4주차에서는그럴듯한 서비스 만들기 라는 주제를 가지고 미션에 참여했습니다.

AWS 를 활용해 네트워크를 구성하며, 네트워크 기본 개념을 학습했습니다.

image-20210617141136646

위와 같은 네트워크 망을 구축하기 위해서 네트워크 지식으로, OSI 7 Layer Router, Internet gateway subnet Swich 에 대한 이해가 필요합니다.

L2 Switch

Multiple Access 를 위한 장비로서, 서버에는 Network Interface Card 가 있습니다. 그 Card에는 각 장비의 주소를 나타내는 MAC 주소가 담겨져있습니다.

담겨져 있는 주소를 보고, 패킷의 충돌이 일어나지 않도록 패킷의 목적지로 지정할 포트를 직접 전송합니다. 스위치에서 패킷의 목적지 주소를 기준으로 보내는 곳과 받는 곳을 계산하여 해당 포트로 1대1로 연결합니다.

내용에서는 L2 라고 했지만, L3 프로토콜 주소, L4 세션 프로토콜을 이용하여 스위칭 할 수 있습니다

SwitchNetwork Interface Card 에 있는 Mac 정보가 있을 경우 Forwarding 하고, 없을 경우 Flooding(들어오온 포트를 제외한 모든 포트로 퍼뜨리는 것)을 합니다(응답하는 장비가 있으면 그 포트에 장비가 있다고 인지하고 MAC테이블에 등록합니다.)

Mac 주소는 eh0 > ether 에 해당하는 내용

image-20210617150601924

L3 Router

서로다른 네트워크간의 통신을 중계합니다.

  • Mac 테이블에 정보가 있을 경우 Forwarding 합니다. 없을 경우에는 Drop 합니다.

Switch 와 다르게, Router 는 IP 주소를 사용하여 네트워크 간의 데이터 전송을 수행하며, 이를 '라우팅'이라고 한다. 이때 라우팅을 한다는 것은 어떤 대역으로 패킷을 보내는 것이 최적의 경로인지 학습하기 위해서입니다.

위에서는 Mac 정보라고 했는데, 왜 IP로 라우팅 하는가에 대해서 궁금하실 수 있습니다. 이는 ARP(address resolution protocal) 때문입니다. ARP 테이블에 자신이 속한 서브넷 마스크 영역(브로드케이스 영역 or 하나의 라우터를 거치기 전 로컬 영역) 에 있는 호스트 혹은 라우터들의 IP주소와 MAC 주소가 적혀있습니다.

좀더 자세한 내용은 참조 하시면 될 것 같습니다.

간단히 SwitchRouter 의 차이를 정리하면 아래와 같습니다.

라우터는 '네트워크 사이'에 데이터를 전송하는 기기이며,

  • 라우터에 의해 네트워크를 상호 연결할 수 있습니다.
  • IP주소를 사용하여 네트워크 간에 데이터 전송을 수행하며, 이를 라우팅 이라고 합니다.
  • 라우팅을 수행하기 위해서는 미리 라우팅 테이블에 네트워크 정보를 등록해야 합니다.
  • 라우팅 테이블에 등록되지 않은 네트워크가 목적지인 데이터는 라우터에 의해 파기됩니다.

스위치 는 '같은 네트워크 내부'에서 데이터 전송을 수행하는 기기

  • 스위치는 PC나 서버에 있어서 네트워크 입구에 해당하는 네트워크 기기입니다.
  • 스위치는 MAC주소를 사용하여 같은 네트워크의 LAN 포트 간 데이터 전송을 수행합니다.

Internet Gateway

외부 네트워크와 통신하기 위해서는 Public IP 가 있어야 합니다.

  • 라우터는 Private IP가 목적지일 경우에는 InternetGateway 로 보내지 않고, Private IP를 Public IP로 변환해주어야 합니다.
  • 자신이 속한 Subnet 의 서버는 가상 스위치(L2)를 통해 직접 통신합니다.
  • 자신이 속하지 않은 Subnet 은 가상 라우터(L3)를 통해 직접 통신합니다.
  • 그 외에 0.0.0.0/0 (전체 대역)은 Internet Gateway로 통신을 보내도록 등록합니다.

[참고]

https://grapherstory.tistory.com/104

Collision Domain & Broadcast Domain - https://byeong9935.tistory.com/35

Router와 Switch 차이점 - https://server-engineer.tistory.com/582

위 개념을 자고, AWS 에서 네트워크 망을 구성하는 실습을 진행합니다.

그외 Server 기기에서 활용 될 수 있는 유용팁을 설명합니다.

  1. Wireshark 패킷 분석하기
  2. Ping Check 해보기Ping 은 ICMP 프로토콜을 사용합니다. ICMP는 IP가 신뢰성을 보장하지 않아 네트워크 장애나 중계 라우터 등에 에러에 대처할 수 없는데, 오류정보 발견 및 보고 기능을 담당하는 프로토콜입니다.
  3. image-20210617160922365
  4. image-20210617160658271
  5. IP 정보만으로 서버에 요청이 가능한지를 확인

RTT(Round-trop Time) 이란, 한 패킷이 왕복한 시간을 의미합니다. 네트워크 시간은 연결 시간, 요청 시간, 응답 시간 등으로 구성합니다.

traceroute 명령

traceroute 명령은 목적지로 이동할 때 패킷이 실제로 사용하는 경로를 검색하는 데 사용됩니다.디바이스(예: 라우터 또는 PC)는 UDP(User Datagram Protocol) 데이터그램의 시퀀스를 원격 호스트의 잘못된 포트 주소로 전송합니다.

image-20210617161704531

자세한 내용 - https://www.cisco.com/c/ko_kr/support/docs/ios-nx-os-software/ios-software-releases-121-mainline/12778-ping-traceroute.html

  1. Port Check 해보기서버는 서비스에 하나의 포트번호를 오픈해두고는 많은 사용자와 연결을 맺을 수 있습니다. 그 이유는 소켓이 이용하는 정보를 확인해보면 알 수 있습니다.
    • 소켓은 소프트웨어로 작성된 통신 접속점이라고 할 수 있는데, 네트웤 응용 프로그램은 소켓을 통하여 통신망으로 데이터를 송수신하게 됩니다.
    • 소켓은 응용 프로그램에서 TCP/IP를 이용하는 창구 역할을 하며 응용 프로그램과 소켓 사이의 인터페이스를 소켓 인터페이스라고 합니다.
    • 한 컴퓨터내에는 보통 한 세트의 TCP/IP가 수행되고 있으며, 네트웍 드라이버는 LAN 카드와 같은 네트웍 접속 장치(NIU: Network Interface Unit)를 구동하는 소프트웨어를 말합니다.
    • img
참고 - [http://jkkang.net/unix/netprg/chap2/net2\_1.html](http://jkkang.net/unix/netprg/chap2/net2_1.html)
  1. 소켓이 이용하는 정보 란?
  2. telnet [Target Server IP] [Target Service Port]

현재의 서비스에 몇 개의 연결이 가능한지? 즉 몇개의 소켓파일을 생성할 수 있을지 생각해보면?

image-20210617165037920

참고 - https://woowabros.github.io/experience/2018/04/17/linux-maxuserprocess-openfiles.html

Port forwarding?

   ## 원격지 서버에서 8080 포트로 소켓을 열어봅니다.
   $ sudo socket -s 8080

   ## iptables 를 활용하여 port forwarding 설정을 합니다. 
   ## 아래의 설정은 80번 포트로 서버에 요청을 하면 서버의 8080번 포트와 연결해준다는 내용을 담고 있어요
   $ sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

   ## 서버의 공인 IP 확인해봅니다., 
   $ curl wgetip.com

   ## 자신의 로컬에서 연결해봅니다.
   $ telnet [서버의 공인 IP] 80

   ## 설정 삭제 
   $ sudo iptables -t nat -L --line-numbers
   $ sudo iptables -t nat -D PREROUTING [라인 넘버]

Port 오픈 확인 명령어

  1. nc (netcat) 사용
  2. telnet 사용
  3. Bash 의 build-in 기능 - 위 두가지 방법을 사용하지 못할 경우
  4. 특정 포트를 여러 프로세스에 점유하고 있을 때, 열려진 파일정보 확인 명령어
    lsof (list open files) 열려진 파일들을 보는 명령어

Lost -l :{port} - 특정 포트를 열고 있는 프로세스 확인 명령어

참고 - https://pearlluck.tistory.com/106

Reverse Proxy와 Load Balance는 어떤 차이가 있을까요?

  • Reverse Proxy : 보안성 향상, 확장성 향상, 웹 가속(압축/SSL 처리로 백엔드 리소스 확보/캐싱)
  • Load Balancer : 부하분산, 서버상태 체크, 세션 관리

nginx는 Reverse Proxy, Load Balancer 두가지 역할을 수행할 수 있는건지요.

Ngnix 학습하기

https://opentutorials.org/module/384/3462

https://hohshho.github.io/phpNginxCI_2/


AWS 실습하기

클라우드 컴퓨팅이랑?

서버, 데이터베이스, 네트워킹 등 컴퓨팅 리소스를 인터넷을 통해 관리하는 것을 의미한다.

통신망

  • 노드들과 이들 노드들을 연결하는 링크들로 구성된 하나의 시스템
  • 노드란? IP로 식별할 수 있는 대상
  • 링크란? 물리적 회선

즉, 하나의 Subnet을 하나의 망이라고 칭할 수 있겠다.

image-20210611104747173

AWS 에서의 망

  • Region: 국가/지역
  • Availability Zone 데이터 센트
  • VPC
    • 하나의 Region 에 종속
    • 다수의 AZ 설정 가능
    • VPC IP 대역내에서 망 구성

L2 Switch

  • Multiple Access를 위한 장비
  • 서버에는 Network Interface Card가 있음
  • Network Interface Card에는 MAC 주소가 있음
    • 3c:22:fb:78:4a:c0 (앞 6자리는 제조사, 뒤는 식별자)
    • image-20210611105043150
  • MAC 테이블에 정보가 있을 때 - Forwarding
  • MAC 테이블에 정보가 없을 때 - Flooding
    • 응답하는 장비가 있으면 그 포트에 장비가 있다고 인지하고 MAC테이블에 등록

Router

  • 서로 다른 네트워크간의 통신을 중계
  • MAC 테이블에 정보가 있을 떄: Forwarding
  • MAC 테이블에 정보가 없을 떄: Drop
  • 라우팅 프로토콜을 활용해 어떤 대역으로 패킷을 보내는 것이 최적 경록인지 확습

인터넷 통신

  • 외부 네트워크와 통신하기 위해서는 Public IP가 있어야 함..
  • 라우터는 Private IP가 목적지일 경우 인터넷 구간으로 보내지 않음, 따라서 Private IP를 Public IP로 변환해주어야 함(NAT)
  • 자신이 속한 subnet(172.16.0.0/24) 의 서버는 가상 스위치를 통해 직접 통신
  • 자신이 속하지 않은 Subnet(172.16.1.0/24)은 가상 리우터를 통해 직접 통신
  • 그 외의 0.0.0.0/0(전체 대역)은 Internet Gateway로 통신을 보내도록 학습

목표로 만들고자 하는 것

image-20210611105702737


1. 망 분리하기

왜 네트워크를 학습하는가?

개인정보를 다루는 DB 서버 등을 위한 내부망, 사용자가 접근하는 웹 서버를 위한 외부망을 구성

https://en.wikipedia.org/wiki/Defense_in_depth_%28computing%29

2. 네트워크 장비

  • Collision Domain & Broadcast Domain(충돌 도메인 & 브로드케이스 도메인)

참조 사이트

https://www.guru99.com/collision-broadcast-domain.html

1. 충돌 도메인 – 
충돌 도메인은 장치가 네트워크에 메시지를 보낼 때 충돌 도메인에 포함 된 다른 모든 장치가 대상인지 여부에 관계없이주의를 기울여야하는 시나리오입니다. 두 장치가 동시에 메시지를 보내는 상황에서 충돌이 발생하여 한 번에 하나씩 각 메시지를 기다렸다가 다시 전송하기 때문에 문제가 발생합니다. 반이중 모드의 경우에만 발생합니다.

2. 브로드 캐스트 도메인 – 
브로드 캐스트 도메인은 장치가 브로드 캐스트 메시지를 보낼 때 브로드 캐스트 도메인에있는 모든 장치가주의를 기울여야하는 시나리오입니다. 이로 인해 일반적으로 LAN 정체라고하는 네트워크에 많은 정체가 발생하여 해당 네트워크에있는 사용자의 대역폭에 영향을줍니다. 
이를 통해 충돌 도메인 수가 많고 브로드 캐스트 도메인 수가 많을수록 모든 사용자에게 더 나은 대역폭을 제공하는 네트워크가 더 효율적이라는 것을 알 수 있습니다.

일단 Domain 이라는 것은 컴퓨터 네트워크를 의미한다. Collision Domain은 충돌발생이 일어나는 컴퓨터는 네트워크의 범위

3. VPC 생성

하나의 서비스를 위한 네트워크를 다루는 단위.

  • VPC에서는 서브넷과 라우팅 테이블, 인터넷 게이트웨이 등을 설정할 수 있습니다. 서브넷 VPC에 설정한 네트워크 대역을 더 세부적으로 나눈 네트워크입니다.
  • 라우팅 테이블 서브넷이 다른 서브넷 혹은 외부막와 통신하기 위한 정보를 가졌습니다.
  • 인터넷 게이트웨이 외부망과의 연결을 담당하고 있습니다.
  • VPC 에서는 사설 IP 대역 으로 CIDR 을 설정하고 생성.
CIDR 이란 무슨말인가?

참고자료

CIDR(Classless Inter-Domain Routing)는 클래스 없는 도메인 간 라우팅 기법으로 1993년 도입되기 시작한 최신의 IP주소 할당 방법

결국 주소 할당 방법..

4. 서브네팅

서브넷 마스크 표 .JPG

외부망 대역에 64개씩 2개, 내부망 대역에 32개씩 2개로 구성

5. 외부 네트워크와 연결

EC2는 Internet Gateway 를 통해 외부 인터넷과 연결될 수 있습니다. Internet Gateway를 생성.

서브넷에 속한 EC2가 외부와 통신을 하기 위해서는 자신의 라우팅 테이블에 설정된 정보를 제외한 모든 대역(0.0.0.0/0)에 대한 통신을 Internet Gateway로 요청하게끔 설정해두어야 합니다. 라우팅 테이블을 생성하고 0.0.0.0/0 대역을 앞에서 생성한 Internet Gateway로 매핑합니다.

6. 접근 제어하기

Public Cloud의 Official OS image, Spring Framework 를 사용한다면 많은 부분 보안성을 보장

AWS에서 실습하기

  • VPC 생성
    • CIDR은 C class(x.x.x.x/24)로 생성. 이 때, 다른 사람과 겹치지 않게 생성
      image-20210611115150596
    • image-20210611115646593
  • Subnet 생성
    • 외부망으로 사용할 Subnet : 64개씩 2개 (AZ를 다르게 구성)
    • image-20210611120928884
    • image-20210611121000717
    • 내부망으로 사용할 Subnet : 32개씩 1개
    • 관리용으로 사용할 Subnet : 32개씩 1개

image-20210611121149005

  • Internet Gateway 연결

image-20210611121626553

  • Route Table 생성

image-20210611121346054

  • 만든 라우팅 테이블에 학습을 시킵니다(연결을 맵핑한다).
    맨 처음에는 우리가 만든 서브넷 테이블을 받을 수 있도록 설정되어있음

image-20210611122537398

  • 서브넷을 라우팅 테이블에 연결합니다.

image-20210611122709723

  • EC2 할당받고, Public IP 를 확인 후 접속

image-20210611123814553

  • Security Group 설정
    • 외부망
      • 전체 대역 : 8080 포트 오픈
      • 관리망 : 22번 포트 오픈
    • 내부망
      • 외부망 : 3306 포트 오픈
      • 관리망 : 22번 포트 오픈
    • 관리망
      • 자신의 공인 IP : 22번 포트 오픈

image-20210611124615252

  • 서버 생성
    • 외부망에 웹 서비스용도의 EC2 생성
    • 내부망에 데이터베이스용도의 EC2 생성
    • 관리망에 베스쳔 서버용도의 EC2 생성
    • 베스쳔 서버에 Session Timeout 600s 설정
    • 베스쳔 서버에 Command 감사로그 설정

SSH 연결이 안될때

맥 사용시

# 터미널 접속한 후 앞 단계에서 생성한 key가 위치한 곳으로 이동한다.
$ chmod 400 [pem파일명]
$ ssh -i [pem파일명] ubuntu@[SERVER_IP]

2. 접근통제

베스션서버를 설정하는 것!

Bastion 이란, 성 외곽을 보호하기 위해 돌출된 부분으로 적으로부터 효과적으로 방어하기 위한 수단입니다. 이를 우리의 아키텍쳐에도 적용해볼 수 있습니다.

가령, 우리가 터미널에 접속하기 위해 사용하는 22번 포트를 한번 생각해보아요. 22번 포트의 경우 보안이 뚫린다면 서비스에 심각한 문제를 일으킬 수 있습니다. 그렇다고, 모든 서버에 동일 수준의 보안을 설정하고자 한다면, Auto-Scaling 등 확장성을 고려한 구성과 배치됩니다. 이 경우 관리 포인트가 늘어나기에 일반적으로는 보안 설정을 일정 부분을 포기하는 결정을 하게 됩니다. 만약 Bastion Server가 있다면, 악성 루트킷, 랜섬웨어 등으로 피해를 보더라도 Bastion Server만 재구성하면 되므로, 서비스에 영향을 최소화할 수 있습니다.
추가적으로, 서비스 정상 트래픽과 관리자용 트래픽을 구분할 수 있다는 이점이 있습니다. 가령, 서비스가 DDos 공격을 받아 대역폭을 모두 차지하고 있다면 일반적인 방법으로 서비스용 서버에 접속하기는 어렵기 때문에 별도의 경로를 확보해둘 필요가 있습니다.

따라서, 22번 Port 접속을 Bastion 서버에 오픈하고 그 서버에 보안을 집중하는 것이 효율적입니다.

📌 Bastion Server로 사용할 별도의 EC2를 생성하고, Bastion Server에서 서비스용 서버에 ssh 연결을 설정해봅시다.

## Bastion Server에서 공개키를 생성합니다.
bastion $ ssh-keygen -t rsa
bastion $ cat ~/.ssh/id_rsa.pub

## 접속하려는 서비스용 서버에 키를 추가합니다.
$ vi ~/.ssh/authorized_keys

## Bastion Server에서 접속을 해봅니다.
bastion $ ssh ubuntu@[서비스용 서버 IP]

주의!!

bastion 서버에서 타 EC2로 접근할 때 공인 IP로 접근하는 것이 아니라, Private IP로 접근해야 한다. 인터넷게이트웨이로 연결되어 라우터에게 학습해놨기 때문에 같은 망에 있기 때문이다.

이 부분에서 헷갈렸음..

환경변수 적용하기(타임아웃 설정)

$ sudo vi ~/.profile
  HISTTIMEFORMAT="%F %T -- "    ## history 명령 결과에 시간값 추가
  export HISTTIMEFORMAT
  export TMOUT=600              ## 세션 타임아웃 설정 

$ source ~/.profile
$ env

shell prompty 변경하기

image-20210611145919945

VIMRC에서 아래와 같이 설정 함

image-20210611150016712

logger를 사용하여 감사로그 남기기

서버에 직접 접속하여 작업할 경우, 작업 이력 히스토리를 기록해두어야 장애 발생시 원인을 분석할 수 있습니다. 감사로그를 기록하고 수집해봅니다.

$ sudo vi ~/.bashrc
  tty=`tty | awk -F"/dev/" '{print $2}'`
  IP=`w | grep "$tty" | awk '{print $3}'`
  export PROMPT_COMMAND='logger -p local0.debug "[USER]$(whoami) [IP]$IP [PID]$$ [PWD]`pwd` [COMMAND] $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" )"'

$ source  ~/.bashrc
$ sudo vi /etc/rsyslog.d/50-default.conf
  local0.*                        /var/log/command.log

$ sudo service rsyslog restart
$ tail -f /var/log/command.log

최종 VIM

image-20210611150636292

댓글