Dans le train, qu’il peut être difficile d’envoyer un tweet… Le réseau est fluctuant dès qu’on s’éloigne d’une ville, et pour quelque chose d’aussi bref qu’envoyer un tweet, ça devient très compliqué sans 3G ou 4G !

En effet, l’envoi d’un tweet se fait sur TLS (chiffrement) et TCP (transport fiable). L’établissement d’une connexion au serveur nécessite de nombreuses communications qui doivent toutes passer en un intervalle de temps réduit, sous peine de devoir tout recommencer ! Alors qu’en principe, il suffirait d’envoyer une seule requête…

C’est sur ces pensées que m’est venue l’idée d’exploiter l’IP over DNS. Grâce à ce principe, on peut envoyer une seule requête à un serveur qui, ensuite, enverra effectivement le tweet. Le concept est d’envoyer le tweet sous forme d’un nom de domaine encodé en base64. Le serveur qui recevra finalement cette requête DNS ne répondra pas mais interprétera le sous-domaine en le décodant et le tweetant. Cela nécessite un client Twitter sur le serveur. J’ai trouvé TTYtter qui fait très bien l’affaire.

S’agissant d’une preuve de concept (en anglais POC pour Proof Of Concept), j’ai (encore) fait du code sale à l’arrache en quelques heures. Mais ça marche. La POC combine deux petits programmes en C, qui récupèrent le sous-domaine, avec un script bash qui pilote le tout. Voici les codes sources :

  • recvdns.c : écoute sur le port 53 et enregistre dans un fichier une requête DNS
  • sousdom.c : détermine le sous-domaine en lisant dans un fichier
  • tod.sh : le script shell qui reçoit une requête DNS, décode le tweet et l’envoie
  • Le code perl du client Twitter, TTYtter

Avant tout, il est nécessaire de configurer le DNS et TTYtter. Pour ce dernier, c’est simple : lancez-le une première fois et laissez-vous guider ! Pour le DNS, vous devez avoir un enregistrement de type A qui pointe vers votre serveur et un enregistrement de type NS qui pointe vers le premier. Exemple :

Nom de l’enregistrement Type Pointe vers…
xxx.vincesafe.fr A 1.2.3.4
yyy.vincesafe.fr NS xxx.vincesafe.fr

Dans cet exemple, le serveur qui lancera le script a pour adresse 1.2.3.4.

Compilez les fichiers source C et placez tous les exécutables (sousdom, recvdns, tod.sh et ttytter) dans le même répertoire. Assurez-vous que le droit d’exécution est bien présent. Il n’y a plus qu’à lancer tod.sh.

… Et maintenant ? En fait, je n’ai pas (encore) développé de client… J’ai juste testé si ça fonctionnait en encodant un tweet en base64 et en lançant une requête du style tweetencode.yyy.vincesafe.fr… Et ça a marché ! J’ai utilisé le compte Twitter de mon serveur, vinceserv, pour immortaliser le moment.

Je rappelle qu’il s’agit là d’une preuve de concept (POC) codée à la va-vite et que tout reste à faire ! On peut facilement améliorer le code (et je vous encourage à le faire et à le partager), coder un client pour Android… J’entrouvre une porte, faites-en ce que vous voulez.

Ah, un détail : s’agissant d’IP over DNS, ce « truc » fonctionne sur les hotspots Wi-Fi sans avoir à s’identifier, ainsi que sur les réseaux de données (3G…) même si on n’a plus de crédit… 😉