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
- Comment rendre ces règles permanentes ? tester la méthode suivante : https://apple.stackexchange.com/questions/307221/add-a-permanent-static-route-in-high-sierra
- Comment faire pour que si la passerelle
192.168.1.3
ne répond pas, l'ip1.2.3.4
reste routable ? Elle ne semble pas passer par la passerelle par défaut...