Prologue

지금까지 10년여간 BoB, 대학교, 정보보호 영재교육원 등 학생들을 가르치면서 스스로 구현해 보라고 하는 것이 있다. 바로 LTE 환경에서 데이터 사용을 무료로 사용할 수 있는 프로그램 개발.

이걸 과제로 내고 싶어도 구현 과정이 쉽지 않고 시간도 오래 걸리기 때문에 과제로 내지는 못하고, 혹시라도 나중에 시간이 남으면 구현을 해보라고 얘기를 한다. 그런데 매번 강의하면 관심을 두는 친구들은 많이 있었는데 실제로 구현에 성공한 친구들은 별로 없다. 그 이유는 구현도 어렵고 시간도 많이 걸리고 투자하는 시간과 노력 만큼 얻어가는 것이 많지 않다는 판단 때문일 것이다.


구현에 알아야 할 지식들

이 프로그램 개발을 위해 알고 있어야 할 지식들을 정리해 본다.

  • C/C++ 프로그래밍 개발 능력은 기본.

  • Tunneling을 위해 Header를 붙이고 떼고 하는 기본적인 작동 방식을 이해할 줄 알아야 한다. 대부분 여기에서 포기하게 되는데 이걸 알지 못하면 말짱 도루묵.

  • Client 및 Proxy에서 패킷을 Modify 할 수 있는 In-path 방식을 이용해야 한다. Linux의 경우 NetFilter, Windows의 경우 WinDivert를 사용하면 된다. 혹은 Virtual Network Interface를 추가하고 Routing Table 추가를 해서 In-path로 작동하게끔 할 수도 있다.

  • 패킷이 라우터(공유기)를 거쳐 갈 때 IP, TCP, UDP 및 ICMP Header의 Checksum이 잘못되는 경우 라우팅을 하지 않는 경우도 있더라. 이를 위해서 각종 헤더의 Checksum을 계산하는 로직을 구현해야 한다.

  • LTE 환경에서는 IPv6 패킷이 자주 발생한다. 그런데 IPv4만 지원하는 Proxy에게 이 패킷을 전달하게 되면 Proxying를 하지 못하게 된다. 따라서 LTE 환경에서 작동하는 Client에서 IPv6를 disable 해야 한다.

  • 대부분의 VPN 프로그램이 그러하듯 Tunneling 패킷이 MTU를 넘기지 않기 위해 일종의 편법(?)을 써야 한다. 이를 위해서 Client 레벨에서 특정 명령어로 MTU 값을 조절할 수도 있고 패킷 안의 TCP.MSS 값을 변경해서 통신하게끔 하는 기법도 있다. 제대로 구현했는지 확인하기 위해 TCO, RSO, GSO, GRO도 이해해야 함.

  • Client와 Proxy간의 연결이 불안정한 경우 인터넷 통신이 제대로 안되는 경우가 많다. 이를 위해 KeepAlive를 통해 서로간의 연결을 지속적으로 확인하는 로직을 구현해야 한다.

  • 계속해서 디버깅하다 보면 나중에 가서는 Wireshark 도사가 됨.

Zero-day가 아니기 때문에 큰 자랑거리는 아니겠지만, 구현에 성공하게 되면 얻게 되는 성취감은 꽤 높다.


구현에 성공한 사람들

아무튼 지금까지 구현에 성공한 친구들은 다음과 같다(이외에 성공까지는 아니고 중간까지 하다가 포기하는 경우도 몇 있음).

BoB 5기 강진오

BoB 7기 장한빈

BoB 8기 최병준

BoB 13기 박철준

이중 자신의 블로그를 통해서 공개를 한 링크 URL 몇개 남긴다.

https://blog.dork94.com/26

https://goka2052.tistory.com/1


구현에 성공한 사람들의 공통점

구현에 성공한 이들의 공통점은 다음과 같다.

  • 강제성이 없는데도 불구하고 개발에 임했다. 즉 프로그램 개발에 관심과 자질을 가지고 있다고 볼 수 있음.

  • 구현에 성공하면 ‘임금님 귀는 당나귀 귀’라는 심정을 가지게 됨. 누구에게 자랑은 하고 싶은데 막상 얘기한 상대방이 없어서 정작 나에게 와서 자랑(?)을 함. 내가 해 잘 수 있는 것은 잘했다 토닥토닥 해주는 것뿐.

  • 구현 과정에서 보통 몇십 GByte 정도 사용하면서 디버깅을 수도 없이 하게 됨(삽질의 연속).

  • 이들의 궁극적인 목적은 LTE 무료로 사용하는 것이 아니라 프로그램 개발 과정에서 얻게 되는 네트워크에 대한 지식과, 하나하나 구현 과정에서 얻을 수 있는 성취감임.


나도 개발했음

지금까지 학생들에게 구현해 보라고 얘기만 했지 정작 내가 스스로 구현하지는 않고 있다가 시간이 나서 나도 구현을 해 보았다. 데모 동영상 링크 남긴다(Android 환경에서 삽질 제대로 함).


Epilogue

마지막으로 얘기하자면 이 글을 공개하는 이유는 LTE를 무료로 사용할 수 있다는 것을 강조하는 것이 아니라 프로그램 구현 과정에서 느낄 수 있는 성취감을 스스로 느껴 보라는 것이다.

그러다가 구현에 성공을 했다는 것이 스스로 입증되면 Client Device도, Proxy를 운영하기 위한 네트워크 설정 등은 사라지고 결국에는 자신만이 볼 수 있는 git repository에 코드를 남기고 해당 솔루션은 사라지게 된다.

구현에 성공한 친구들은 전부 좋은 학교나 회사에 가서 자기 밥벌이 역할을 충분히 하면서 잘 살고 있다.