Routage sous MacOS

Quelques commandes pour gérer son réseau, ses ips, ses routes, ses passerelles. L'objectif initial était 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). Depuis peu je dispose de la fibre. Jonglons donc entre ces 3 passerelles.

Plan du réseau

  • passerelle Fibre : 192.168.1.1
  • passerelle ADSL : 192.168.1.2
  • passerelle 4G : 192.168.1.3
  • Serveur de stream : 1.2.3.4

Ma passerelle par défaut est 192.168.1.1

Les commmandes utiles

voir son ip locale

1ip a

ou bien

1ifconfig

voir la table de routage ipv4

1netstat -nr -f inet

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

1sudo route add 1.2.3.4/32 192.168.1.3

retirer la règle

1sudo route delete 1.2.3.4/32 192.168.1.3

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

changer la route par défaut

1sudo route change default 192.168.1.2

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.1.2 va m'affecter une ip fixe dans la plage de mon FAI ADSL, et ma passerelle 192.168.1.3 m'attribuera une ip dynamique, dans la plage de mon opérateur mobile.

1ssh -t root@1.2.3.4 'who'
2// affiche mon ip publique attribuée par la passerelle 192.168.1.2 (ADSL, défaut)
3sudo route add 1.2.3.4/32 192.168.1.3
4ssh -t root@1.2.3.4 'who'
5// affiche mon ip publique attribuée par la passerelle 192.168.1.3 (clé 4G)
6sudo route delete 1.2.3.4/32 192.168.1.3
7ssh -t root@1.2.3.4 'who'
8// affiche mon ip publique attribuée par la passerelle 192.168.1.2 (ADSL, défaut)

Script de changement de passerelle par défaut

Voici mon script gtw

 1#!/usr/bin/env php
 2<?php
 3/**
 4 * Changement de passerelle
 5 */
 6
 7$gateways = [
 8    '1' => ['Fibre Orange', '192.168.1.1'],
 9    '2' => ['Freebox ADSL', '192.168.1.2'],
10    '3' => ['Clé 4G SFR',   '192.168.1.3'],
11];
12
13print_default_gateway();
14list_gateways();
15echo "Choix passerelle par défaut: ";
16if ($argc > 0 && is_numeric($argv[1])) {
17    $selected = $argv[1];
18    echo $selected . "\n";
19} else {
20    $input = fopen("php://stdin", "r");
21    $selected = trim(fgets($input));
22}
23
24if (array_key_exists($selected, $gateways)) {
25    set_default_gateway($gateways[$selected][1]);
26    echo "La passerelle par défaut est désormais \"" . $gateways[$selected][0] . "\"\n";
27} else {
28    echo "Passerelle inconnue\n";
29}
30print_default_gateway();
31
32function set_default_gateway(string $ip) {
33    echo "Votre mot de passe pour le sudo peut être demandé.\n";
34    $cmd = 'sudo route change default ' . $ip;
35    passthru($cmd);
36}
37
38function list_gateways() {
39    global $gateways;
40    echo "Liste des passerelles:\n";
41    foreach ($gateways as $idx => $gateway) {
42        echo $idx . '. ' . $gateway[0] . ' (' . $gateway[1] . ')' . "\n";
43    }
44}
45
46function print_default_gateway() {
47    echo "Passerelle par défaut:\n";
48    $cmd = 'route get default|grep gateway';
49    passthru($cmd);
50}

Rendez ce script exécutable chmod +x gtw et mettez le dans votre PATH (dans $HOME/bin pour ma part) Maintenant, je change de passerelle simplement avec la commande gtw 1|2|3 (ou juste gtw + mode interactif).

Autre cas d'usage

Le script précédent jouait sur la route par défaut. On peut aussi être plus précis et utiliser une passerelle que pour une route (ip ou plage d'ips) spécifique.

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.

1sudo route add 17.253.0.0/16 192.168.1.3

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

1sudo route delete 17.253.0.0/16 192.168.1.3

Et voilà !

Todo

comments powered by Disqus