2023년에는 6개월간 진행되었던 카카오 클라우드 엔지니어 양성과정 2기를 수료하였다. 많은 것들을 배울 수 있었고 클라우드 직무로 나아가야겠다고 확신이 생기게 된 계기였었다. 그 중에서도 카카오에서 실제 업무를 하고 계시는 분들이 오셔서 특강을 해주셨는데 새롭게 듣는 단어들도 있고 각자의 분야에 대해 세부적인 사항까지 확실하게 알고 있는 점들이 너무 멋져보였다. 나도 저런 어른으로 성장해야지 ㅋㅋ
특강에서는 카카오의 Private Cloud 인 DKOS를 특정 권한을 부여하여 우리가 직접 경험할 수 있게끔 하였고, 쿠버네티스와 관련된 내용들을 중점으로 진행되었다. 한창 Final Project로 EKS, GKE 를 공부하는 중이었어서 재밌게 수업을 들을 수 있었다. 특강에서 배웠던 주제들을 하나씩 꺼내보며 다시 공부해보면 나에게 좋은 밑거름이 될 수 있을 것이라 생각하여 이렇게 작성해본다. 먼저 네트워크 내용을 다루고 kubernetes의 CNI 관련 내용을 가르쳐주셨는데 오셨던 실무진들 중에 제일 정감 가는 분이셨다. 나처럼 사투리를 쓰셔서 그런가 이미지가 되게 귀여우셔서 그런가 ㅋㅋㅋ 그리고 살짝 해병대 나오셨을 것 같은 느낌이었다.
주제 : Kernel Code와 Raw Socket Programming으로 알아보는 컴퓨터 네트워킹 기초
배규태 강사님 (Gyu)
쿠버네티스 네트워킹 이전 먼저 기초적인 리눅스 네트워크 설명과 커널 관련 내용 정리 후 CNI에 대해서 작성해보겠다. 이 게시물에서는 Linux interfaces for virtual networking 을 다룰 예정이다.
리눅스 네트워킹 종류
자주 사용되는 인터페이스 위주로 설명
Bridge
OSI 모델의 데이터 링크 계층에 있는 여러 개의 네트워크 세그먼트를 연결해준다. 네트워크 L2 레이어의 스위치처럼 작동한다. 물리계층에 있는 네트워크 세그먼트를 연결해주는 장치인 리피터, 네트워크 허브와 비슷하지만 브릿지를 사용하면 단순히 주변 네트워크 세그먼트로 다시 전송한다기 보다는 특정 네트워크로부터 오는 트래픽을 관리하게 된다. 브릿지는 허브나 리피터보다 더 복잡한 경향을 가진다. 브릿지는 들어오는 데이터 패킷을 분석하여 브릿지가 주어진 패킷을 다른 세그먼트의 네트워크로 전송할 수 있는지를 결정할 수 있다.
브릿지 작업이 데이터 링크 계층에서 이루어지므로 브릿지가 수신하는 각 프레임의 데이터로부터 정보를 처리한다. 이더넷 틀에서 이것은 프레임의 출발지와 도착지의 MAC 주소를 제공한다. 브릿지는 두 가지 방식을 사용하여 MAC 주소가 가지는 네트워크 세그먼트를 결정한다. (투명 브리징, 소스 루트 브리징) Docker 의 기본이 Bridge 네트워크 이다.
netns = Network Namespace - 리눅스 커널에서 제공하는 기능 중 하나로, 네트워크 리소스를 격리하고 분리하기 위해 사용
# br0 이름의 브리지 인터페이스를 생성
ip link add br0 type bridge
# eth0 네트워크 인터페이스를 br0 브리지의 멤버로 추가.
# 기존의 물리적 네트워크 인터페이스인 eth0을 가상 브리지 br0에 연결하여 브리지를 형성
ip link set eth0 master br0
# tap1 가상 네트워크 인터페이스를 br0 브리지의 멤버로 추가
# 가상 머신이나 컨테이너 등 가상화 환경에서 사용되는 인터페이스를 브리지에 연결
ip link set tap1 master br0
# tap2도 가상 네트워크 인터페이스를 br0 브리지의 멤버로 추가
ip link set tap2 master br0
# veth1 가상 이더넷 인터페이스를 br0 브리지의 멤버로 추가
# 가상 머신이나 컨테이너 등의 가상화 환경에서 사용되는 인터페이스를 브리지에 연결하는 역할
ip link set veth1 master br0
코드 결과: 브릿지를 통해 VM 1, VM 2과 network naemspace 1은 서로 통신이 가능해진다. 위의 오른쪽 그림.
Bounded interface
서로 다른 네트워크 인터페이스를 하나의 논리적 인터페이스로 묶는 것
hot-standby와 load balacing 모드가 있다. hot-standby는 Active 에서 장애 발생 시 Standby가 트래픽 처리한다. load balacing은 패킷을 여러 네트워크 인터페이스에 분배한다. Round-Robin, BroadCast와 같은 다양한 트래픽 분배 정책이 있다.
# bond0 인터페이스 추가, 모니터링 주기 100ms, active-backup 모드
ip link add bond0 type bond miimon 100 mode active-backup
# eth0을 bond0 인터페이스에 추가
ip link set eth0 master bond0
# eth1을 bond0 인터페이스에 추가
ip link set eth1 master bond0
Team device
Bonded interface와 유사하다. 결합된 인터페이스와 마찬가지로 L2 계층에서 여러 NIC (포트)를 하나의 논리적 NIC(Team device)로 그룹화하는 메커니즘 제공하는 것.
teamd -o -n -U -d -t team0 -c '{"runner": {"name": "activebackup"},"link_watch": {"name": "ethtool"}}'
ip link set eth0 down
ip link set eth1 down
teamdctl team0 port add eth0
teamdctl team0 port add eth1
VLAN
하나의 스위치에서 브로드캐스트 도메인을 논리적으로 분할하기 위해 활용. 브로드캐스트에서는 일반적으로 동일한 LAN에 포함된 모든 네트워크 단말로 패킷을 송출한다. VLAN은 네트워크 패킷에 태그를 추가하여 브로드캐스트 도메인을 구분한다. 네트워크 관리자가 호스트를 동일한 스위치 아래 또는 서로 다른 스위치 간에 그룹화할 수 있다. 이더넷 헤더에 VLAN 헤더를 넣어서 L2대역을 논리적으로 나눌 수 있다.
ip link add link eth0 name eth0.2 type vlan id 2
ip link add link eth0 name eth0.3 type vlan id 3
여기까지 리눅스 가상 인터페이스 네트워크 종류 중 몇 가지를 알아보았다. 추가적으로 Overlay Network와 이를 구축하는데 사용되는 리눅스 가상 인터페이스인 VXLAN과 VETH에 대해서 알아보자.
Overlay Network
물리적인 네트워크 위에 네트워크 가상화 기술을 사용하여 End-to-End 통신을 수행하는 기술을 정의하는 단어. 일반적으로 Tunnel 구성을 한다고 표현한다.
Overlay Network 특징
- 정보은닉
- 오버레이 기술을 사용하게 되면 새로운 헤더가 추가되어 원본 IP헤더를 감싸는 캡슐화가 수행
- 새로운 헤더 정보를 이용하여 라우팅이 수행되기 때문에 원본 헤더는 외부에 노출되지 않음 - SDN 활용
- 오버레이 네트워크는 일반적으로 SDN (Software Defined Network)를 이용하며 컨트롤러를 통해 트래픽 부하분산 수행하여 링크의 대역폭 사용율이 높음 - 독립성
- 언더레이 네트워크 위에 오버레이 네트워크가 구성되지만 서로 독립적인 서비스로 오버레이 네트워크의 구성 변경이 언더레이에 영향을 주지 않음
- 반면, 언더레이의 구성 변경은 오버레이 네트워크에 영향을 줄 수 있음 - 높은 효율성
- Network Slicing과 Segmentation을 지원하여 네트워크를 분할하여 사용할 수 있음
- 분할 된 네트워크에 자원을 할당하여 네트워크 자원의 사용을 최대로 높일 수 있음 - 높은 보안성
- 오버레이 네트워크 구성 시 암호화 알고리즘을 적용하여 End-to-End 통신에 높은 보안성을 얻을 수 있음
VXLAN (Virtual eXtensible Local Area Network)
VLAN 와 같이 네트워크를 세그먼트화할 수 있도록 지원하는 기술(네트워크를 논리적인 단위로 분할)이다. 다만 VLAN의 제한된 확장성을 해결할 뿐만 아니라 VLAN이 제공할 수 없는 다양한 이점들을 제공한다. VLAN을 확장한 개념으로 기존의 VLAN에서 만들 수 있는 네트워크보다 훨씬 더 많은 네트워크를 생성 가능하다.
L2 이더넷 프레임을 L3 UDP 패킷으로 캡슐화하여 물리적 L3 네트워크로 확장되는 가상화된 L2 서브넷 또는 세그먼트의 생성을 가능케하는 터널링 프로토콜이다. 각 L2 서브넷은 트래픽을 세그먼트 분할하는 VXLAN 네트워크 식별자 (VNI)로 식별된다. 50byte 헤더(Mac Over IP, UDP Header, 24bit VLAN ID)를 추가로 구성하여 16,000,000개 이상의 VLAN을 제공할 수 있다.
L2 Network와의 차이점
기본적인 L2 Network에서는 ARP 테이블을 수집하기 위해 브로드캐스트를 이용하며 맥 주소는 스위치에서 수집하여 관리한다.
하지만 VXLAN은 VM 들이 직접 ARP 테이블을 보유하고 vSwitch에서 테이블을 관리한다.
VXLAN에서 BUM 트래픽에 대해서 IP Multicast를 기반으로 전송한다.
멀티 캐스트로 ARP 테이블을 갱신하고 직접 해당 스위치 족에 P2P Tunnel로 통신하는 방식이다.
VETH : Virtual Ethernet
리눅스의 Virtual Ethernet Interface를 의미한다. veth는 쌍으로 만들어지며 네트워크 네임스페이스들을 터널로써 연결하거나 물리 디바이스와 다른 네트워크 네임스페이스의 장비를 연결하는 용도로 사용할 수 있다. veth pair로 서로 다른 네임스페이스를 연결하는 형식.
# 네트워크 구성도
Host
+--------------------------------------------------+
| +--------------+ |
[lo]+ [lo]+ | |
| | [Nginx] | |
[eth0]+ +-------->[veth1]+ | |
| | | direct_netns| |
[veth0]+<---------------+ +--------------+ |
| |
| Root Namespace |
+--------------------------------------------------+
리눅스 cat /proc/net/dev
네트워크 인터페이스에 대한 통계 및 상태 정보를 제공하는 가상 파일. watch -d 명령어는 변화하는 내용 흰색으로 알려준다.
추가적으로 proc/net의 정보들을 조합한 내용들은 ifconfig에서 볼 수 있다.
iptables 와 Netfilter
iptables는 netfilter에 rule을 넣을 수 있는 단순한 user space 의 실행프로그램이다.
기본 방화벽으로 사용되는 iptables의 경우 Linux 커널의 네트워크 스택에 있는 패킷 필터링 Hook과 연동되어 동작한다. 이 Hook을 netfilter framework라고 한다. 모든 패킷은 networking 시스템으로 들어오는데, 들어올 때 이러한 Hook(Netfilter)를 Trigger 하게 되고, 패킷들은 그 때 스택을 통해 통과된다. 어플리케이션들은 이러한 Hook에 등록되어 있으면 허용되어 트래픽이 흘러게게 되고 iptables는 이러한 netfilter hook들을 등록한다. 트래픽은 state를 따라 흘러가는데, 그 state들은 이러한 방화벽 규칙에 의해 구성된다.
Netfilter
리눅스 커널 모듈. 네트워크 패킷을 처리하기 위한 프레임워크. Kernel에 존재하는 Network 관련 Framework로써 원하는 지점에서 Packet 제어를 위한 다섯 가지 Hook(지점)을 제공한다.
- 주요 기능: NAT(사설 IP와 공인 IP를 변환해주거나 포트변환 등), Packet filtering(특정 패킷을 차단 또는 허용하는 기능, 서버의 접근제어 또는 방화벽 기능을 구현 가능), packet manging(필요시 패킷 헤더의 값을 변경)
- 구조
커널에서 패킷을 처리하는 과정에 필요하면 룰에 따라 처리해줄 수 있도록 5군데의 hooking 지점을 제공한다. 패킷 처리과정에 내가 원하는 지점에서 원하는 패킷처리를 할 수 있도록 지원하는 것.
- PREROUTING: 인터페이스를 통해 들어온 패킷을 가장 먼저 처리, 목적지 주소의 변경(DNAT)
- INPUT: 인터페이스를 통해 로컬 프로세스로 들어오는 패킷의 처리(즉, 패킷을 받아 처리할 프로세스가 내 시스템에서 동작할 경우), INPUT에서 패킷 퍼리(차단/허용)후 user space의 프로세스로 전달
- OUTPUT: 해당 프로세스에서 처리한 패킷을 밖으로 내보내는 패킷에 대한 처리(차단/허용)
- FORWARD: 다른 호스트로 통과시켜 보낼 때 패킷에 대한 처리(차단/허용), 방화벽이나 IPS 등과 같이 내가 수신하는 패킷이 아니고 지나
가는 패킷을 처리
- POSTROUTING: 인터페이스를 통해 나갈 패킷에 대한 처리, 출발지 주소의 변경(SNAT)
Introduction to Linux interfaces for virtual networking | Red Hat Developer
Get an introduction to Linux virtual interfaces, including commonly used interfaces, when to use them, and how to create them.
developers.redhat.com
더 자세하게 알아보고 싶으면 이 사이트를 참고하길 바란당. 참고로 싸그리 다 영어입니다 ㅎㅎ
'Network' 카테고리의 다른 글
[ Network ] Router (패킷 트레이서 & 다이나밉스) (0) | 2024.03.08 |
---|---|
[ Network ] LAN 과 Ethernet (ARP 프로토콜) (0) | 2024.03.08 |
[ Linux ] Raw socket & Scapy 실습 - kakao 실무진 특강 (3) (0) | 2024.03.04 |
[ Network ] TCP/IP (4계층) (0) | 2024.02.29 |
[ Network ] OSI 모델 (7계층) (0) | 2024.02.23 |