2023. 4. 2. 15:37ㆍ프로젝트/학습
💡 본론에 앞서...
: 최근 기존 구현했던 프로젝트 Hype을 리팩토링 & 기능 추가 구현을 하고 있는데 그러면서 개발 환경도 변경을 하고 있습니다. nginx를 was와 분리해서 따로 서버로 빼내고 nginx를 이용한 무중단 배포를 구현하고 있는데 8081 포트 상에 was가 돌아가고 있음에도 외부에서 접근이 안되는 문제가 생겼습니다. 생각해보니까 EC2의 보안 그룹에 인바운드 규칙 설정을 안해줘서 그런 문제가 발생한 것 같아서 이를 설정하려는데 CIDR 라는 것을 설정해줘야 했습니다. 그래서 이것에 대해서 알아야 설정할 수 있을 것 같아서 공부해봅니당~
CIDR(사이더) 란?
>> 위키백과
CIDR(Classless Inter-Domain Routing, 사이더)는 클래스 없는 도메인 간 라우팅 기법으로 1993년 도입되기 시작한, 최신의 IP 주소 할당 방법이다. CIDR는 기존의 IP 주소 할당 방식이었던 네트워크 클래스를 대체하였다. CIDR는 IP 주소의 영역을 여러 네트워크 영역으로 나눌 때 기존방식에 비해 유연성을 더해준다.
위키백과 따르면 CIDR는 위와 같은 의미이고 결국 IP 주소 할당 방법인 것을 이해할 수 있습니다. 그래서 먼저 IP 주소에 대해서 알아봅시다.
IP 주소 란?
>> 위키백과
IP 주소(Internet Protocol address, IP address, 인터넷규약주소)는 컴퓨터 네트워크에서 장치들이 서로를 인식하고 통신을 하기 위해서 사용하는 특수한 번호이다.
IP 주소는 위와 같은 의미이고 저희가 일상 생활에서 보기는 힘들 수 있지만 IT 관련 공부를 해봤다면 한번 쯤은 생김새를 본 적이 있을 것입니다.
127.0.0.1 이런 식으로 생겼죠? 저 숫자는 10진수로써 표현이 되어있지만 사실은 각각의 10진수는 2진수 8자리로 구성된 숫자입니다. 이 하나하나 각 자리를 Octet이라고 부르고 dot(.)을 이용해서 구분합니다. 총 4개의 Octet으로 IP 주소는 구성이 되기에 2진수 32자리로 표현이 됩니다.
IP 주소 Class
위에서 CIDR가 클래스 없는 도메인 간 라우팅 기법이라고 소개했기에 클래스에 대해서 알아보겠습니다.
>> 위키백과
네트워크 클래스는 IPv4에서 IP 주소의 첫 번째 구조 변화를 나타낸다.
이 네트워크 클래스라는 녀석이 생기기 이전에는 특정 네트워크를 가리키는 단순히 8비트의 네트워크 영역과 해당 네트워크 내에서 호스트의 주소를 가리키는 나머지 영역으로 단순하게 구분되어 있었습니다. 이런 인터넷 초기엔 연결해야 하는 모든 장치를 지원해야 하기에 IP 주소가 충분하지 않았습니다. 이를 해결하기 위해서 IP 주소 클래스가 생겼습니다. IP 주소를 클래스로 나누고 네트워크 규모에 따라 할당해서 네트워크 관리자는 IP 주소를 절약할 수 있었고 충분한 양을 확보할 수 있었습니다.
- IP 주소 클래스는 네트워크 크기에 따라 구분이 됩니다. 클래스 A 주소는 초대형 네트워크, 클래스 B 주소는 중간 규모 네트워크, 클래스 C 주소는 소규모 네트워크에 사용되었습니다. 이를 통해서 네트워크의 크기와 연결해야 하는 호스트 수에 따라 장치에 IP 주소를 할당할 수 있었습니다.
- 그림에서 보이는 것처럼 클래스 A는 0xxxxxxx(0 ~ 127)로 네트워크 address가 시작하고 그 다음 Octec부터 Host Address로 사용할 수 있습니다. 그러니까 Host Address를 총 2^24개를 쓸 수 있는 것입니다.
- 클래스 B는 10xxxxxx.xxxxxxxx(128.0 ~ 191.255)로 시작하는 네트워크 address를 사용하고 Host Address 총 2^16 개를 쓸 수 있습니다.
- 클래스 C는 110xxxxx.xxxxxxxx.xxxxxxxx(192.0.0 ~ 223.255.255)로 시작하는 네트워크 address를 사용하고 Host Address 총 2^8개를 쓸 수 있습니다.
CIDR(사이더)의 등장
IP 주소와 클래스에 대해서 공부한 것을 바탕으로 CIDR에 대해서 알아봅시다. 이 CIDR라는 친구는 클래스의 한계를 극복하기 위해서 생겼습니다. 위에서 클래스는 네트워크 크기를 고려해서 여러 크기로 나눠서 IP를 나눠주는데 크기의 차이가 상당히 큽니다. 1600만개에서 6만개 250개 이런 식으로 되게 차이가 크다 보니까 대부분이 클래스 B를 많이 할당받게 되었고 약 16000개 밖에 없는 클래스 B가 되게 빠르게 소진된 것입니다. 그래서 클래스를 대체해서 클래스 없는 새로운 할당 방법인 CIDR가 등장한 것입니다.
CIDR의 IP 할당 방법
CIDR에서는 기존 문제를 해결하기 위해서 네트워크 부분과 호스트 부분의 구분 점을 2진수의 한 자릿수(1비트) 단위까지 가능하게 할당합니다. 192.138.20.4의 IP 주소가 있다고 가정했을때 기존에는 클래스 C에 속하니까 192.138.20이 네트워크 부분이고 나머지가 호스트 부분이 되는데 CIDR은 1비트 단위로 구분하기에 이런식이 아닌 2진수로 표현해서 원하는 비트까지 네트워크 부분으로 만들고 나머지를 호스트로 사용할 수 있게 구성한 것입니다.
근데 CIDR에서는 그럼 어떻게 네트워크 부분과 호스트 부분을 구분할 수 있을까요?? 바로 서브넷 마스크라는 친구 덕분에 구분을 할 수 있게 됩니다.
서브넷 마스크는 네트워크와 호스트 부분을 구분해주는 역할로 원래 클래스 기반 할당 방식일 때도 존재했던 개념입니다. 다만 네트워크, 호스트를 아예 이친구로 나누기 때문에 역할이 더욱 중요해진 것입니다. 서브넷 마스크는 IPv4 주소와 같게 32비트로 표현합니다. 255.255.255.0 요런 식으로 표현하는 것이겠죠? 요친구를 어떻게 사용하는 것일까요?? 서브넷 마스크와 IP 주소를 2진수로 바꾸고 나란히 놓았을 때, 서브넷 마스크의 1이 연속한 자릿수를 IP 주소의 네트워크 부분 나머지 0이 있는 자릿수를 호스트 부분으로 구분할 수 있습니다. 그럼 서브넷 마스크의 1이 연속되지 않는다면 어떻게 될까요? IP의 네트워크 부분을 파악할 수 없기에 1이 연속되지 않는 경우가 발생할 수 없게 되는 것입니다.
CIDR의 간단한 표기법
서브넷 마스크는 1의 연속된 부분을 이용해서 네트워크를 파악하는데 굳이 길게 IP 주소처럼 쓸 필요가 있을까요? 이를 연속된 1의 개수가 몇 개인지만 명시하여 좀 더 단순하게 사용합니다.
이런 식으로 1의 개수를 IP 주소 뒤에 명시하여 CIDR을 표기합니다. IP 주소도 눈에 확 들어오고 편하게 서브넷 마스크도 확인할 수 있습니다.
이를 통한 AWS 인바운드 규칙 설정하기
그래서 위와 같이 인바운드 규칙을 설정했습니다. 저기 CIDR을 설정하는 부분에 192.168.1/24 이런 식으로 설정을 할 수 있는데 그렇게 되면 들어오는 요청에 대한 IP가 해당 범위 내에 있는 경우 즉 192.168.1 내에 있는 경우 허용이 되는데 저는 모든 요청을 다 받을 수 있어야 해서 이렇게 모든 요청을 받을 수 있게 설정했습니다.
마무리
기존에 계속 헷갈리고 어려웠던 개념을 활실하게 정리한 것 같아서 아주 좋고 조금 더 네트워크를 이해하게 된 것 같습니다. 추후에는 public, private ip에 대해서도 공부해봐야 할 것 같습니다~!!
Reference
- CIDR 개념
https://kim-dragon.tistory.com/9
https://dev.classmethod.jp/articles/vpc-3/
https://brunch.co.kr/@swimjiy/43
https://brunch.co.kr/@swimjiy/44
- AWS 보안 그룹
https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/security-group-rules.html
https://ch4njun.tistory.com/203
- 단어 개념
https://ko.wikipedia.org/wiki/%EB%B6%80%EB%B6%84%EB%A7%9D
https://ko.wikipedia.org/wiki/CIDR
https://ko.wikipedia.org/wiki/IP_%EC%A3%BC%EC%86%8C
'프로젝트 > 학습' 카테고리의 다른 글
[DevOps] DockerFile 사용해보기 - 고양이 이미지 API 구현 과제 (0) | 2023.04.06 |
---|---|
[DevOps] Nginx 무중단 배포 설정하기 - Hype (0) | 2023.04.04 |
[DevOps] Nginx를 이용한 무중단 배포 공부하기 - Hype (1) | 2023.04.02 |
[Log Monitoring] AWS Cloudwatch 설정하기 - InterMark (0) | 2023.02.12 |
[코드 커버리지] Jacoco에 대한 설명과 프로젝트에 설정하기 - InterMark (0) | 2023.02.12 |