지피지기 백전백퇴

실패 - transparent proxy setup


문제

요새 중국산 IOT 디바이스라고 해야하나… 하여튼 카메라 달린 귀파개, 카메라 달린 드론 등등을 조작하는데 대개 모바일 앱으로 통신을 한다. 디바이스가 WiFi AP를 제공하고, 핸드폰을 해당 WiFi 네트워크에 연결시킨 다음 앱을 켜면 기능이 동작하는 방식.

다만 모바일 앱이 내 핸드폰/태블릿에서 무슨 짓을 할 지 모르겠으니, 얘네들 통신하는것을 적당히 캡쳐해서 PC에서 조작하도록 하고 싶다는게 오늘의 문제다.

접근 1 - 모바일 앱이 보내는 패킷 읽기

모바일 앱이 보내는 패킷을 보고싶으면 내 컴퓨터가 WiFi AP를 제공하고, 모바일 앱을 접속시키면 될 것 아닌가?

  1. hostapd라는 툴을 써서 AP를 설정할 수 있다.
  2. dnsmasq를 이용하면 dhcp 서버 역할을 한다?
  3. tcpdump를 써서 클라이언트가 보내는 패킷을 캡쳐할 수 있다.

접근 2 - 디바이스의 응답 읽기

어찌어찌 초기 패킷을 몇개 읽은 다음, 이걸 디바이스에게 보내면 적절한 답을 주겠지? 다만 이럴려면 WiFi AP를 끄고, WiFi iface가 디바이스에 client로 접속하도록 해야하니 번거로움이 좀 있다.

아 그냥 1과 2를 합쳐볼까?

앗싸리 WiFi iface가 두개 달린 컴퓨터가 있다면 이야기가 간편한데, 안타깝게도 그런 장비는 없다. 그렇다고 이거 한답시고 WiFi 확장카드를 사고싶지는 않으니, 차선책으로 다음과 같은 시스템을 생각해봤다.

  1. 맥미니의 WiFi를 AP로 설정한다.
  2. 데스크탑의 WiFi를 클라이언트로 설정, 디바이스에 연결시킨다.
  3. 모바일 앱에서 보내는 패킷을 맥미니에서 받은다음, 데스크탑을 통해 디바이스로 보낸다.
  4. 응답을 받아 모바일 앱으로 돌려보낸다.

즉, 호스트 2대를 이용한 핸드폰-(무선)-프록시-(유선)-프록시-(무선)-디바이스 설정!

성공…?

UDP 패킷을 주고받는 포트에 프록시 서버를 띄워서 패킷들을 정상적으로 라우팅하는 데 성공했다. 만세!

하지만 기쁨도 잠시, 화면이 나오질 않는다.

문제의 원인은?

모바일 앱에서 보내는 패킷을 자세히 읽어보면, 종종 443 포트로 TCP 연결을 시도하는 것을 발견할 수 있었다.

처음에는 애플의 연결 확인 서버로 접속하는 것인가 했는데, 그중에 일부 다른 패킷이 익숙한 이름의 중국 서버로 연결을 시도하고 있더라.

추측컨데 디바이스가 AP 모드로 동작하기 때문에 해당 패킷들을 자연스럽게 낚아채서 연결이 된 것처럼 동작하는 것이 아닌가, 따라서 UDP 연결 말고도 TCP 연결을 이용해서 RTSP 등의 기능을 이용하는 것 같다…는 가설이다.

이제 어쩌지?

다만 현재의 2호스트 셋업에서 TCP 패킷의 포워딩은 조금 번거로워진다.

  1. 맥미니에서 WiFi AP를 통해 받은 모든 패킷을 적절히 데스크탑으로 보내야 하고,
  2. 데스크탑에선 맥미니로부터 받은 모든 패킷을 적절히 디바이스에게 전달해줘야 한다.
  3. 이 과정에서 패킷의 source/dest를 적절히 수정해서 딱히 디바이스를 목적지로 하지 않은 패킷들도 보내도록 해야 한다는 건데… 흠… 뭐 이런거 해주는 툴 없나?

결론

삽질은 끝나지 않았다…