8비트 마이크로컨트롤러에서 웹사이트 호스팅하기

3 weeks ago 13
  • AVR64DD32 8비트 MCU만으로 웹사이트를 호스팅했으며, 24MHz CPU·8KB RAM·64KB Flash의 작은 환경에서 동작함
  • 직접 Ethernet 신호를 만들기에는 10BASE-T도 너무 빨라, Linux가 지원하는 SLIP으로 USB-Serial 링크를 네트워크 인터페이스처럼 사용함
  • SLIP은 패킷을 0xC0으로 감싸고 특수 바이트를 이스케이프하는 단순한 방식이라 MCU와 현대 Linux 연결에 적합함
  • IP는 단편화 비활성화 덕분에 단순해졌지만, TCP 구현은 연결 상태·재전송·예외 처리가 필요해 며칠이 걸렸고 버그도 남아 있음
  • 외부 접속은 VPS·WireGuard·프록시로 /mcu 요청만 전달하는 우회 구조이며, 공개 IPv4 비용과 IPv6 부재가 핵심 제약으로 드러남

8비트 AVR로 웹사이트를 호스팅한 구성

  • AVR64DD32는 Arduino로 알려진 Atmega328과 비슷한 8비트 AVR 계열 MCU이며, 같은 메모리 기준으로 더 저렴하고 단일 프로그래밍 핀과 더 나은 주변장치를 제공함
    • 최대 24MHz 단일 8비트 AVR 코어
    • 8KB 정적 RAM, 64KB Flash, 256바이트 EEPROM
    • 1.8~5.5V 전압 범위, $1~$2 가격대
  • MCU만으로 인터넷에 직접 연결하려면 Ethernet 신호를 만들어야 하지만, 가장 느린 10BASE-T도 이 환경에는 너무 빠름
    • 10BASE-T는 10Mbit/s로 동작하고, Manchester 인코딩 때문에 실제 선로에서는 20Mbit가 됨
    • AVR64DD32의 CPU는 24MHz까지 가능하지만 주변장치와 IO 핀은 12MHz 클록이 최대라 직접 신호 생성이 어려움
    • 전용 Ethernet 칩을 쓰는 방법이 정석이지만, 프로젝트 완성을 위해 몇 주 기다려야 했음
  • 대안으로 SLIP(Serial Line Internet Protocol, RFC 1055) 을 사용해 직렬 링크 위에 네트워크를 올림
    • 패킷 앞뒤를 0xC0 바이트로 감쌈
    • 패킷 안의 0xC0은 0xDB 0xDC로, 기존 0xDB는 0xDB 0xDD로 바꿔 모호성을 피함
    • 과거 다이얼업 모뎀이 전화선 위에 직렬 링크를 만들고 컴퓨터가 그 위에서 네트워킹을 처리하던 방식과 이어짐
    • 현대 Linux도 SLIP을 지원해 USB-Serial 어댑터를 네트워크 인터페이스로 만들 수 있음
    • 사용 예시는 stty -F /dev/ttyUSB0 115200 raw cs8, slattach -m -F -L -p slip /dev/ttyUSB0 형태임
  • MCU 쪽 하드웨어는 단순하며, 외부 부품 없이도 동작함
    • www.c: 소스 코드
    • www.elf: 미리 빌드된 바이너리
    • LED와 전원 역연결 방지용 다이오드를 추가함
    • 소비 전력이 몇 mW 수준이라 USB-Serial 어댑터의 5V 레일만으로 서버 구동이 가능함

프로토콜 구현과 공개 접속 처리

  • IP 구현은 현대 환경의 제약 덕분에 단순해짐
    • 웹페이지가 사용자 컴퓨터에 도달하려면 패킷이 여러 네트워크를 지나야 하며, 각 패킷에는 출발지와 목적지 주소 등을 담은 40바이트 IP 헤더가 필요함
    • 예전 IP는 패킷 단편화 같은 기능 때문에 올바르게 처리하려면 많은 메모리가 필요했음
    • 현대 운영체제는 단편화를 비활성화하고, IPv6는 단편화를 제거했기 때문에 직접 처리하지 않아도 됨
    • 받은 패킷의 출발지와 목적지를 바꾸고 TTL 카운터를 재설정하면 응답 헤더를 만들 수 있음
  • TCP 구현은 연결 상태 추적, 손실 패킷 재전송, 여러 예외 상황 처리가 필요해 훨씬 어려움
    • 커스텀 TCP 구현이 충분히 동작하기까지 며칠이 걸렸고, 아직 몇 가지 버그가 남아 있음
    • HTTP는 별도로 구현하지 않고 서버가 항상 하드코딩된 “응답”을 클라이언트에 보냄
    • URL이 하나뿐인 사이트라면 이 방식으로 충분히 동작함
    • 로딩 과정은 Video 3에서 볼 수 있음
  • 외부 접속에는 공개 라우팅 가능한 IPv4 주소가 필요하지만, 비용과 집 인터넷 연결 품질이 걸림돌이 됨
    • 공개 라우팅 가능한 주소가 있는 머신은 Helsinki 근처 데이터센터의 VPS에 있음
    • Linux의 WireGuard로 인터넷 위에 가상 네트워크 링크를 만들고, 한쪽이 CGNAT 뒤에 있어도 동작하게 함
    • Linux 라우터 박스가 VPS에 연결되어 더 적절한 인터넷 연결을 얻는 구조가 됨
  • MCU에는 여전히 자체 공개 IP가 없기 때문에 VPS 주소의 모든 요청을 넘기면 기존 웹사이트가 깨짐
    • 대신 서버가 /mcu 아래 요청만 로컬 주소 블록을 사용해 MCU 서버로 프록시하도록 구성함
    • 방문자가 MCU의 TCP/IP 스택에 직접 연결하는 구조는 아니지만, Vape Server와 같은 방식임
    • SYN 패킷으로 망가뜨리기는 약간 더 어려워지지만, 사실상 다이얼업에 가까운 연결 위의 서버라 DDoS에는 취약함
  • IPv6 부재가 전체 우회 구성의 근본 원인으로 남음
Read Entire Article