2022 NDC/프로그래밍

[NDC22-프로그래밍] 라즈베리 파이로 직접 만드는 네트워크 시뮬레이터

서니션 2022. 6. 27. 13:45
728x90
반응형

● 발표분야: 프로그래밍

● 발표자: 데브시스터즈 박재현 / DEVSISTERS Jaehyeon Park

● 권장 대상: 프로그래머

● 키워드: #네트워크 #라즈베리파이 #리눅스

 

데브옵스 엔지니어

 

네트워크 시뮬레이터?

- 네트워크를 직접 조작하여 원하는 환경 아래에서 여러 가지  테스트를 할 수 있도록 해주는 도구

 

1. 네트워크 시뮬레이터를 만드는 이유

- 개발할 때는 괜찮은데 배포하니까 네트워크 오류 많이 남

- 느리고 불안정한 네트워크, 갑작스러운 네트워크 단절, 비대칭적인 전송속도

 

기존 도구들은..

- 설치하는 과정 번거로움

- 기능이 제한되어 다양한 시나리오를 재현하기 어려움

- 비 소프트웨어 직군 분들의 사용이 어려움

 

클라이언트 수정 없이 시뮬레이터에 연결하는 것만으로 다양한 환경 재현이 된다면?

- 원하는 기능을 전부 직접 구현할 수 있음

- 전문 지식이 필요하지 않기에 개발자가 아니어도 사용에 부담이 없음

 

라즈베리 파이 적합한 이유

- 하드웨어를 구하기 쉬움

- 외장 디스플레이나 버튼 등 풍부한 확장 컴포넌트들

- >> 리눅스가 돌아간다! <<

 

2. 리눅스 네트워킹을 활용한 기본적 환경 제어

2-1 트래픽의 속도 조절과 불안정한 네트워크 상황을 재현

<iproute2>

- 리눅스의 커널 네트워킹 스택과 통신할 수 있도록 해주는 유저 공간 유틸리티 모음집

- 라우팅 설정, 네트워크 인터페이스 관리, 트래픽 컨트롤 

 

<tc>

- iproute2의 tc를 사용하면 트래픽에 대한 전반적인 제어를 할 수 있음

- 대역폭 제한, 불안정한 네트워크 환경 재현, 트래픽 우선순위 매기기, 트래픽 분류

 

<tc - qdisc>

- 네트워크 인터페이스에 패킷이 쌓이는 Queue에 대한 전반적인 제어

- qdisc의 종류와 설정에 따라 다양한 종류의 제어를 할 수 있다

- HTB로 속도 제어

- netem으로 다양한 환경 제어

 

<qdisc - HTB>

- 패킷 처리를 위한 표를 발급하는 개념

  - 표가 채워지는 속도로 패킷이 나가는 속도를 조절

  - 버킷 크기는 Burst 할 수 있는 양을 결정

 

<qdisc - netem>

- 각종 네트워크 상황을 에뮬레이션 해주는 qdisc

  - Delay, Packet Loss, Corruption, Reorder (리눅스에 기본 내장)

 

<tc의 한계>

- Ingress에서는 제어가 불가능

 

<ifb>

- ifb는 여러 군데에서 패킷을 모아서 처리할 수 있게 해주는 중간 블록

- ifb의 Egress를 제어함으로서 Ingress를 제어하는 것과 같은 효과를 낼 수 있음

 

2-2 무선 AP를 만들어주고 IP 동적 할당을 통 해 기기를 연결할 수 있도록 하기

- 기기가 라즈베리파이에 접속 못하면 무의미함

- "액세스 포인트"가 필요함 이를 위한 작업 필요. IP 주소도 발급해 주어야 함

 

<무선 네트워크>

- hostapd로 무선 액세스 포인트를 만들어주고

- DHCP 서버를 돌려서 IP 동적 할당을 해준다

(이 IP주소를 발급해주고 관리해주는 역할이 DHCP 서버)

 

2-3 연결된 기기 모두 인터넷을 자유롭게 사용할 수 있도록 하기

- iptables의 Masquerading rule을 사용!

- 여러 IP들의 연결을 구분해서 각각에 대해 Source NAT를 수행해준다

 

=> 여러 기기의 IP를 잘 구분해서 외부 인터넷과 통신을 하도록 도와주고

각 기기들은 마치 라즈베리 파이를 거치지 않고 직접 인터넷과 통신하는 것처럼 느끼게 됨

 

 

3. eBPF를 활용한 도메인 별 환경 제어

- 모든 트래픽이 아닌 "특정 기준을 만족하는 트래픽"만 제어하고 싶은 경우

- 혹은 기준에 따라 다른 종류의 제어를 하고 싶은 경우

 

- Destination IP 별로 제어는 가능할까?

  - tc filter로 패킷을 분류할 수 있다!

 

- 도메인 이름은 네임서버를 통해 IP로 리졸브 후 통신

 

<eBPF> ?

- 안전한 바이트코드 프로그램을 커널에서 실행할 수 있도록 해줌

- 네트워크 인터페이스에 대해서 오고 가는 패킷에 대해 관찰할 수 있다

 

4. 편리한 유저 인터페이스 만들기

- 모든 사람들이 쉽게 사용할 수 있도록!

  - GIPO 물리 버튼, 디스플레이

 

<GPIO 물리 버튼>

- 버튼의 GPIO 신호를 읽어준다

- 리눅스 커널이 매핑해준 신호 파일을 읽고 쓰면 된다

  /sys/class/gpio

 - 버튼 각각에 자유롭게 쓰고 싶은 기능을 할당

 

<디스플레이>

- 커널이 디스플레이를 인식하면, Framebuffer로서 사용이 가능

- mmap 시스템 콜을 이용해서 Framebuffer를 메모리에 매핑

- 매핑된 메모리에 그래프 모양을 잘 그려준다

 

5. 재배포 이미지 만들기

<재배포가 필요한 이유>

- 소프트웨어뿐만이 아니라 하드웨어 솔루션

  - 여러 명이 각자의 시뮬레이터로 테스트를 할 수 있어야 함

 

<모든 것이 미리 세팅된 이미지를 준비하기>

- 시뮬레이터 프로그램

- iptables 설정

- hostapd

- DHCP 서버

 

=> systemd service를 이용해서 전원을 꽂음과 동시에 모든 컴포넌트들이 실행될 수 있도록 한다

- 미리 준비된 라즈베리 파이 SD 카드 내용물을 그대로 아카이빙하기만 하면 재배포 이미지 완성

- 이제 반대로 만들어진 재배포 이미지를 그대로 다른 SD 카드에 복사하기만 하면 기기 재배포 완료

728x90
반응형