현재 진행중인 프로젝트에서 네트워크가 불안정한 제3국에서 한국까지 데이터를 안정적으로 받아올 필요가 생겼다. 그래서 다음 두가지 방법을 이용해서 데이터를 주고 받아야 하는 상황이 됐다:

기존 프로그램에 위의 기능을 집어넣는것은 사실 불가능에 가깝다. 그래서 네트워크 계층을 레이어화 해서 처리하려는 시도를 하였다.

이것을 지원하는 서버 프로그램이 존재하지 않아서 (깃허브 기준), 직접 만들 각을 보았다.

현실적인 선에서 처리하기 위해, 이미 커널속에 존재하는 TUN/TAP 모듈을 활용하기로 했다. 우선 생각해야 하는것은 TUN/TAP중 어느것을 선택해야 하는가? 이다. 어느 수준의 패킷을 처리하는지가 메인 포인트이다. ethernet(L2)급의 프레임을 처리하려면 TAP을 써야 한다. 근데 왠만해서는 그정도 까지 필요없이, L3만 해도 충분하다 (나의 경우)

Untitled

일단… 리눅스에서 패킷을 처리하려면 (일반 프로그램이 접근 가능하게) iface를 하나 붙여야 한다. 그리고 route 정보를 집어넣어야 한다. 그러면 나머지는 리눅스가 알아서 잘 해준다.

그래서 만든 esukmean0 interface

Untitled

Untitled

어짜피 route 영역은 리눅스에서 다 해주기 때문에, 우리는 장치 등록후 → 적절한 세팅 (ip + subnet) → route 확인만 해주면 된다.

tun을 읽으면 (일반 프로그램 → linux → iface쪽에 패킷 전송)의 데이터(패킷)을 읽을수 있고, tun에 쓰면 반대로 (iface → kernel로 전송, 이후는 kernel 영역) 커널로 패킷을 보낼 수 있다.

Untitled