Passer au contenu principal

Blog de Guillaume Seznec

Routage sous MacOS

Quelques commandes pour gérer son réseau, ses ips, ses routes, ses passerelles. L’objectif initial étant de forcer le passage par ma clé 4G pour me connecter à mon serveur de stream en rtmp, et de laisser le reste du trafic internet à ma bonne vieille box ADSL. En effet l’upload en 4G est bien meilleur qu’en ADSL (20Mbps vs 1Mbps).

Plan du réseau

  • passerelle ADSL : 192.168.0.1
  • passerelle 4G : 192.168.0.3
  • Serveur de stream : 1.2.3.4

Ma passerelle par défaut est 192.168.0.1

Les commmandes utiles

voir son ip locale

ip a

ou bien

ifconfig

voir la table de routage ipv4

netstat -nr -f inet

forcer le passage par la passerelle locale 192.168.0.3 pour accéder à l’ip publique 1.2.3.4

sudo route add 1.2.3.4/32 192.168.0.3

retirer la règle

sudo route delete 1.2.3.4/32 192.168.0.3

bien préciser le masque (/32) sinon la route n’est pas bien prise en compte…

changer la route par défaut

sudo route change default 192.168.0.1

Procédure de test

On exécute la commande who sur la machine linux 1.2.3.4 dont on a défini la route, nous permettant de voir l’ip publique de provenance et voir indirectement si on passe par la bonne passerelle. Je sais que ma passerelle 192.168.0.1 va m’affecter une ip fixe dans la plage de mon FAI ADSL, et ma passerelle 192.168.0.3 m’attribuera une ip dynamique, dans la plage de mon opérateur mobile.

ssh -t root@1.2.3.4 'who'
// affiche mon ip publique attribuée par la passerelle 192.168.0.1 (ADSL, défaut)
sudo route add 1.2.3.4/32 192.168.0.3
ssh -t root@1.2.3.4 'who'
// affiche mon ip publique attribuée par la passerelle 192.168.0.3 (clé 4G)
sudo route delete 1.2.3.4/32 192.168.0.3
ssh -t root@1.2.3.4 'who'
// affiche mon ip publique attribuée par la passerelle 192.168.0.1 (ADSL, défaut)

Script sympa

pour changement de passerelle facilement à la maison

#!/usr/bin/env php
<?php
/**
 * Changement de passerelle
 */

$gateways = [
    '1' => ['Freebox ADSL', '192.168.0.1'],
    '2' => ['Clé 4G SFR', '192.168.0.3'],
];

print_default_gateway();
echo "Changer la passerelle par défaut par:\n";
foreach ($gateways as $idx => $gateway) {
  echo $idx . '. ' . $gateway[0] . ' (' . $gateway[1] . ')' . "\n";
}
echo "Votre choix: ";
$handle = fopen ("php://stdin", "r");
if ($choice = trim(fgets($handle))) {
  if (array_key_exists($choice, $gateways)) {
    set_default_gateway($gateways[$choice][1]);
    echo "La passerelle par défaut est désormais " . $gateways[$choice][0] . "\n";
  } else {
    echo "Passerelle inconnue\n";
  }
}

function set_default_gateway(string $ip) {
    $cmd = 'sudo route change default ' . $ip;
    passthru($cmd);
}

function print_default_gateway() {
    echo "Passerelle par défaut actuelle:\n";
    $cmd = 'route get default|grep gateway';
    passthru($cmd);
}

Cas d’usage

Je veux ponctuellement utiliser la clé 4G pour télécharger + rapidement la bonne grosse update MacOS qui fait mal (5Go) sur les serveurs Apple. Un coup de Wireshark et d’analyse du trafic réseau m’indiquent la/les ips utilisées. J’ai volontairement pris un masque de sous réseau grossier et je ne voulais pas changer la passerelle par défaut.

sudo route delete 17.253.0.0/16 192.168.0.3

La prise en compte est instantanée, je relance le téléchargement. Puis à la fin du téléchargement j’efface la règle :

sudo route delete 17.253.0.0/16 192.168.0.3

Et voilà !

Todo