네트워킹 기초 배우기
네트워크를 처음 접하는 분을 위해 OSI 계층, IP 주소 체계, 서브넷, 라우팅, 오버레이 네트워크, DNS, NAT 같은 네트워킹 기초 개념을 정리한 교육 자료예요. Calico 고유 기능이라기보다 배경 지식에 가깝지만, Calico의 네트워킹 동작을 이해하는 토대가 돼요. 네트워킹 전문가가 아니어도 Calico 설치 가이드만 따라 하면 바로 사용할 수 있으니, 부담 없이 읽어보세요.
출처: 문서
본문
SECONDARY: 이 가이드는 Calico에 국한되지 않는 선택적인 배경 교육 자료예요.
네트워킹 전문가가 아니어도 Calico 설치 가이드 중 아무거나 따라 하면 Calico를 바로 설치하고 실행할 수 있어요. Calico가 복잡한 부분을 대신 숨겨주거든요. 그래도 네트워킹을 더 공부해서 겉면 아래에서 실제로 무슨 일이 일어나는지 이해하고 싶다면, 이 가이드가 핵심 네트워킹 기초 개념 몇 가지를 짧게 소개해줘요.
이 가이드에서 배울 내용은 다음과 같아요.
- 네트워크 계층을 구분할 때 쓰는 용어
- 네트워크 패킷의 구조
- MTU가 무엇이고 왜 중요한지
- IP 주소 체계, 서브넷, IP 라우팅이 동작하는 방식
- 오버레이 네트워크란 무엇인지
- DNS와 NAT란 무엇인지
네트워크 계층 (Network layers)
네트워크에서 데이터를 주고받는 과정은 보통 7개 계층으로 나눠서 설명해요. 이걸 OSI 모델이라고 불러요. 계층은 보통 L1부터 L7까지 줄여서 표기해요. 데이터는 애플리케이션에서 보내거나 받을 때 이 계층들을 차례로 통과한다고 생각할 수 있고, 각 계층은 네트워크로 데이터를 주고받는 데 필요한 처리 중 한 부분을 담당해요.
현대의 엔터프라이즈 네트워크나 퍼블릭 클라우드 네트워크에서는 계층이 보통 다음처럼 대응돼요.
- L5-7: 애플리케이션 개발자에게 익숙한 대부분의 프로토콜이에요. 예를 들어 HTTP, FTP, SSH, SSL, DNS가 있어요.
- L4: 소스/목적지 포트를 포함하는 TCP 또는 UDP예요.
- L3: IP 패킷과 IP 라우팅이에요.
- L2: 이더넷 패킷과 이더넷 스위칭이에요.
네트워크 패킷의 구조 (Anatomy of a network packet)
네트워크로 데이터를 보낼 때 네트워크 스택의 각 계층은 패킷이 네트워크를 통과하는 동안 자기가 필요로 하는 제어 정보/메타데이터를 담은 헤더를 추가하고, 그 결과물을 스택의 다음 계층으로 넘겨요. 이렇게 완전한 패킷이 만들어지는데, 스택의 모든 계층이 필요로 하는 제어 정보/메타데이터가 모두 들어 있으면서도 어느 계층도 데이터 자체를 이해하거나 인접 계층의 메타데이터를 처리할 필요가 없어요.
IP 주소, 서브넷, IP 라우팅 (IP addressing, subnets and IP routing)
L3 네트워크 계층에서 IP 주소가 등장하는데, 보통 이 지점이 애플리케이션 개발자가 관심을 갖는 네트워킹 영역과 네트워크 엔지니어가 관심을 갖는 영역의 경계예요. 애플리케이션 개발자는 IP 주소를 네트워크 트래픽의 출발지와 목적지로 여기지만, L3 라우팅이나 그 아래 스택을 깊이 이해할 필요는 상대적으로 적어요. 그 아래는 네트워크 엔지니어의 영역에 가깝거든요.
IP 주소에는 IPv4와 IPv6 두 종류가 있어요.
- IPv4 주소는 32비트이고 가장 널리 쓰여요. 보통 점으로 구분한 4개의 10진수 바이트(각각 0-255)로 표현해요. 예를 들면
192.168.27.64죠. IP 주소 중에는 "사설(private)"로 예약된 여러 범위가 있는데, 이 주소들은 로컬 사설 네트워크 안에서만 쓸 수 있고 인터넷을 통과해서 라우팅되지 않아요. 기업은 이런 주소를 원하는 만큼 반복해서 재사용할 수 있어요. 반면 "공용(public)" IP 주소는 인터넷 전체에서 전역적으로 유일해요. 인터넷에 연결된 네트워크 장치와 네트워크 수가 늘면서 공용 IPv4 주소는 이제 부족해졌어요. - IPv6 주소는 128비트이고 IPv4 주소 공간 부족을 해결하려고 설계됐어요. 보통 4자리 16진수 8개 그룹으로 표현해요. 예를 들면
1203:8fe0:fe80:b897:8990:8a7c:99bf:323d죠. 128비트 길이 덕분에 IPv6 주소는 부족할 일이 없어요. 하지만 많은 기업이 IPv6 도입을 더디게 해왔기 때문에, 당분간은 IPv4가 여러 엔터프라이즈와 데이터센터 네트워크의 기본으로 남아 있어요.
IP 주소의 묶음은 보통 IP 주소와 유효 비트 수를 /로 구분해서 표기하는 CIDR 표기법으로 나타내요. 예를 들어 192.168.27.0/24는 192.168.27.0부터 192.168.27.255까지 256개 IP 주소의 묶음을 의미해요.
하나의 L2 네트워크 안에 있는 IP 주소 묶음을 서브넷이라고 불러요. 서브넷 안에서는 L2 헤더(및 푸터)만으로도 어떤 장치 쌍 사이든 패킷을 한 번의 네트워크 홉으로 보낼 수 있어요.
하나의 서브넷을 넘어서 패킷을 보내려면 L3 라우팅이 필요하고, 각 L3 네트워크 장치(라우터)는 L3 라우팅 규칙에 따라 패킷이 갈 경로를 결정하는 역할을 담당해요. 라우터 역할을 하는 각 네트워크 장치는 특정 CIDR로 향하는 패킷을 어디로 보낼지 결정하는 라우트를 갖고 있어요. 예를 들어 Linux 시스템에서 10.48.0.128/26 via 10.0.0.12 dev eth0라는 라우트는 목적지 IP가 10.48.0.128/26에 속한 패킷을 eth0 인터페이스를 통해 다음 홉인 10.0.0.12로 보내야 한다는 뜻이에요.
라우트는 관리자가 정적으로 설정하거나 라우팅 프로토콜로 동적으로 구성할 수 있어요. 라우팅 프로토콜을 쓸 때는 각 네트워크 장치에 어떤 다른 네트워크 장치와 라우트를 교환할지 알려줘야 하는 게 보통이에요. 그러면 라우팅 프로토콜이 장치가 추가되거나 제거되거나 네트워크 링크가 들어오고 나갈 때 전체 네트워크의 올바른 라우트를 구성해줘요.
대규모 엔터프라이즈와 데이터센터 네트워크에서 흔히 쓰이는 라우팅 프로토콜 중 하나가 BGP예요. BGP는 인터넷을 떠받치는 주요 프로토콜 중 하나라서 놀랄 만큼 잘 확장되고, 현대의 라우터 대부분이 폭넓게 지원해요.
오버레이 네트워크 (Overlay networks)
오버레이 네트워크를 쓰면 네트워크 장치들이 기반이 되는 네트워크(언더레이라고 불러요) 위에서 통신할 수 있고, 언더레이 네트워크는 오버레이에 연결된 장치에 대해 아무것도 알 필요가 없어요. 오버레이에 연결된 장치 입장에서는 그냥 평범한 네트워크처럼 보여요. 이를 구현하는 프로토콜이 서로 다른 여러 종류의 오버레이 네트워크가 있지만, 공통적으로는 이너 패킷이라고 부르는 네트워크 패킷을 아우터 패킷이라고 부르는 바깥 패킷 안에 캡슐화한다는 특징을 공유해요. 이렇게 하면 언더레이는 아우터 패킷만 보고 이너 패킷을 처리하는 방법을 몰라도 돼요.
오버레이가 패킷을 어디로 보낼지 판단하는 방식은 오버레이 종류와 프로토콜에 따라 달라요. 마찬가지로 패킷을 감싸는 방식도 오버레이 종류마다 달라요. 예를 들어 VXLAN의 경우 이너 패킷을 감싸서 아우터 패킷의 UDP로 보내요.
오버레이 네트워크는 기반 네트워크 인프라에 대한 의존성이 최소화된다는 장점이 있지만, 다음과 같은 단점도 있어요.
- 오버레이가 아닌 네트워킹에 비해 성능에 약간의 영향을 줘요. 네트워크를 많이 쓰는 워크로드를 돌린다면 피하고 싶을 수도 있어요
- 오버레이 위의 워크로드는 나머지 네트워크에서 직접 접근하기 어려워요. 그래서 오버레이로 들어가거나 나가는 모든 트래픽을 위해 오버레이와 언더레이 네트워크를 연결하는 NAT 게이트웨이나 로드밸런서가 필요해요
Calico의 네트워킹 옵션은 매우 유연해서, 오버레이 네트워크를 쓸지 오버레이가 아닌 네트워크를 쓸지 직접 선택할 수 있어요. 자세한 내용은 Calico 최적 네트워킹 방식 결정 가이드에서 읽을 수 있어요.
DNS
네트워크를 오가는 패킷의 흐름은 IP 주소로 결정되지만, 사용자와 애플리케이션은 보통 시간이 지나도 변하지 않는 잘 알려진 이름으로 네트워크 목적지를 식별하고 싶어해요. 예를 들어 google.com을 216.58.210.46에 대응시키는 식이에요. 이름을 IP 주소로 바꾸는 이 변환은 DNS가 처리해요. DNS는 지금까지 설명한 기본 네트워킹 위에서 동작해요. 네트워크에 연결된 각 장치는 보통 하나 이상의 DNS 서버 IP 주소로 구성돼 있어요. 애플리케이션이 도메인 이름으로 접속하려고 하면 DNS 메시지가 DNS 서버로 보내지고, DNS 서버는 그 도메인 이름이 어떤 IP 주소에 매핑되는지 정보로 응답해요. 그러면 애플리케이션이 선택한 IP 주소로 연결을 시작할 수 있어요.
NAT
NAT(Network Address Translation)는 패킷이 NAT를 수행하는 장치를 통과할 때 패킷의 IP 주소를 다른 IP 주소로 매핑하는 과정이에요. 사용 사례에 따라 NAT는 소스 IP 주소에 적용할 수도, 목적지 IP 주소에 적용할 수도, 둘 다에 적용할 수도 있어요.
NAT의 흔한 사용 사례 중 하나는 사설 IP 주소를 가진 장치가 인터넷을 넘어 공용 IP 주소를 가진 장치와 통신할 수 있게 하는 거예요. 예를 들어 사설 IP 주소를 가진 장치가 공용 IP 주소로 접속을 시도하면, 사설 네트워크 경계의 라우터가 보통 SNAT(Source Network Address Translation)를 사용해서 패킷의 사설 소스 IP 주소를 라우터 자신의 공용 IP 주소로 매핑한 뒤 인터넷으로 포워딩해요. 그러면 라우터가 반대 방향으로 들어오는 응답 패킷을 원래의 사설 IP 주소로 되돌려 매핑해서, 출발지와 목적지 어느 쪽도 매핑이 일어나고 있다는 사실을 모른 채 양방향으로 패킷이 흘러가요. 같은 기법이 오버레이 네트워크에 연결된 장치가 오버레이 바깥의 장치와 통신할 수 있게 하는 데도 흔히 쓰여요.
NAT의 또 다른 흔한 사용 사례는 로드밸런싱이에요. 이 경우 로드밸런서가 DNAT(Destination Network Address Translation)를 수행해서 들어오는 연결의 목적지 IP 주소를, 로드밸런싱 대상으로 선택한 장치의 IP 주소로 바꿔요. 그러고 나서 로드밸런서가 응답 패킷에 이 NAT를 되돌려 적용하기 때문에 출발지와 목적지 장치 어느 쪽도 매핑이 일어나고 있다는 사실을 몰라요.
MTU
네트워크 링크의 MTU(Maximum Transmission Unit)는 그 네트워크 링크로 보낼 수 있는 패킷의 최대 크기예요. 패킷 조각화(fragmentation)는 네트워크 성능을 크게 떨어뜨릴 수 있기 때문에, 네트워크의 모든 링크를 같은 MTU로 구성해서 조각화를 줄이는 게 일반적이에요. 또한 TCP는 경로 MTU를 학습해서 네트워크 경로에 있는 링크 중 가장 작은 MTU에 맞춰 패킷 크기를 조정해요. 애플리케이션이 하나의 패킷에 담기는 양보다 많은 데이터를 보내려고 하면, MTU를 넘지 않도록 TCP가 데이터를 여러 TCP 세그먼트로 나눠요.
대부분의 네트워크는 MTU가 1,500바이트인 링크를 쓰지만, 9,000바이트 MTU를 지원하는 네트워크도 있어요. Linux 시스템에서는 MTU를 크게 하면 같은 양의 데이터를 보낼 때 처리할 패킷 수가 줄어서 Linux 네트워킹 스택이 쓰는 CPU가 줄어들 수 있어요. 다만 사용 중인 네트워크 인터페이스 하드웨어에 따라 이 오버헤드의 일부가 네트워크 인터페이스 하드웨어로 오프로드될 수 있으니, 작은 MTU와 큰 MTU의 영향은 장치마다 달라져요.
더 알아보기 (Learn more)
네트워킹 기초는 한 번에 다 외우기보다 필요할 때마다 돌아와서 확인하는 편이 좋아요. MTU와 오버레이 개념은 Calico 네트워킹 구성 문서에서 실제 설정과 이어지니까 거기서 다시 만나게 될 거예요. 더 깊이 들어가고 싶다면 Calico의 최적 네트워킹 방식 결정 가이드를 이어서 읽어보세요.