● 발표분야: 프로그래밍
● 발표자: 데브시스터즈 박재현 / 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 카드에 복사하기만 하면 기기 재배포 완료
'2022 NDC > 프로그래밍' 카테고리의 다른 글
[NDC22-프로그래밍] 테스트자동화 도구 개발 생존전략 (0) | 2022.08.26 |
---|---|
[NDC22-프로그래밍] 리니지: 거울전쟁 (0) | 2022.07.18 |
[NDC22-프로그래밍] 'New State Mobile' 글로벌 서비스 도전기 (0) | 2022.07.04 |
[NDC22-프로그래밍] Walk Lizzie, walk! (0) | 2022.07.03 |
[NDC22-프로그래밍] 프라시아 전기에 멋진 탈것 만들기 (0) | 2022.06.26 |