Vérification de la connectivité ICS via un « batch planifié »

MàJ 03/2016: Cette bidouille m’a longtemps dépanné alors que j’utilisais un réseau wifi que je ne possédais pas (et que j’étais jeune et surement un peu con…). Entre-temps, je suis passé sur une bobox opérateur en mode bridge derrière laquelle j’ai collé un Shuttle dual LAN sous pfSense. Pour ceux à qui ça parle… Bientôt, j’ai bon espoir de carrément me séparer de l’équipement opérateur! La fibre direct dans pfSense! 😛

Ce script permet de vérifier l’état de la connexion Internet et de redémarrer les services si la connexion est HS… En l’occurrence, ce batch renouvelle l’IP de la connexion avec la Box, puis il redémarre le service ICS (Internet Connection Sharing), le tout sur un serveur Windows 2003.

Ça vaut pas une passerelle OpenBSD comme solution, mais ça a l’avantage d’être simple et puis c’est pour une utilisation exclusivement @home. Pour épargner le frontal vis-à-vis de certaines menaces, tous les services de la carte réseau connectée à la Box sont désactivés sauf TCPIPv4:
ncpa.cpl

Il est bien entendu fortement conseillé de travailler derrière un firewall WAN/LAN, home ou pas home…!

Exemple de mise en œuvre:
Network_Example

L’exécution des scripts est accompagnée d’inscriptions dans un journal. La vérification de la connectivité se fait en 3 étapes:
1. Le serveur lance le batch sur l’un des clients du réseau grâce à PsExec:

@echo off
%windir%\checkco\psexec.exe win1 -u username -p passwd "%windir%\checkco\checkco_google.bat"
exit

2. Le client exécute le batch. En fonction du résultat de cURL sur la requête HTTP vers Google.fr, le script lance le renouvellement de la connexion ou, quand tout va bien, il s’arrête après avoir lancé une écriture dans le journal:

@echo off
%windir%\checkco\curl\curl.exe -m 10 "http://www.google.fr" | find "text/html"
if %errorlevel% EQU 0 (goto request_ok)
if %errorlevel% EQU 1 (goto renew)
:renew
%windir%\checkco\psexec 2k3-srv -u username -p passwd "%windir%\checkco\checkco_renew.bat"
exit
:request_ok
%windir%\checkco\psexec 2k3-srv -d -u username -p passwd "%windir%\checkco\checkco_request_ok.bat"
exit

Pour exécuter la requête HTTP, télécharger cURL pour Windows et le placer dans le même répertoire que le script Client.

3A. La page d’accueil de Google.fr n’a pu être téléchargée. Une inscription est faite dans le journal avant le renouvellement de l’adresse MAC (et IP par la même occasion) grâce à MacShift. Ensuite, le batch est relancé sur le client pour vérifier que la page d’accueil de Google est à nouveau disponible:

@echo off
echo.%Date%-%Time% Google.fr unreachable... >> %windir%\checkco\SharedAccess.log
echo Google.fr unreachable...
echo -------------------------------------------------------------------------------
echo Stopping ICS...
%windir%\system32\sc.exe stop SharedAccess
%windir%\system32\ping.exe -n 1 1.1.1.1 -w 3000 >nul
echo -------------------------------------------------------------------------------
echo Renewing Wifi...
%windir%\checkco\macshift\macshift.exe -i Wifi -r
:renewing
%windir%\system32\ping.exe -n 1 1.1.1.1 -w 10000 >nul
%windir%\system32\ipconfig.exe | %windir%\system32\find.exe "192.168.1.254"
if %errorlevel% EQU 0 (goto renewed)
if %errorlevel% EQU 1 (goto renewing)
:renewed
echo Wifi renewed...
echo -------------------------------------------------------------------------------
echo Starting ICS...
%windir%\system32\sc.exe start SharedAccess
%windir%\system32\ping.exe -n 1 1.1.1.1 -w 3000 >nul
echo -------------------------------------------------------------------------------
echo ICS Status:
%windir%\system32\sc.exe query SharedAccess
echo -------------------------------------------------------------------------------
echo 2nd HTTP request...
%windir%\checkco\psexec pc-windows -d -u username -p passwd "%windir%\checkco\checkco_Google.bat"
exit

3B. La page de Google.fr est joignable. Le résultat est inscrit dans le journal:

@echo off
echo.%Date%-%Time% Google.fr Request OK! >> %windir%\checkco\SharedAccess.log
echo -------------------------------------------------------------------------------
echo Google.fr Request OK!
exit

A la ligne 9, une temporisation de 10 secondes est placée afin d’attendre le renouvellement de la connexion. ipconfig | find « 192.168.1.254 » permet d’en être sûr!

Les fichier sont placés dans %windir%\checkco\, à savoir C:\windows\checkco\. Après de nombreuses erreurs avec PsExec, je me suis rendu compte qu’en utilisant une variables d’environnement comme chemin réglait le problème… Du coup, c’est tombé sur %windir%, et ce, pour le client et le serveur.

Liste de fichiers coté Serveur:

PathToServer

Liste des fichiers coté Client:

PathToClient

Un extrait du journal:

29/08/2011-19:00:26,55 Google HTTP Request OK!
29/08/2011-20:00:01,82 Google HTTP Request OK!
29/08/2011-21:00:21,63 Google HTTP Request OK!
29/08/2011-22:00:19,13 Google HTTP Request OK!
29/08/2011-23:00:20,66 Google.fr unreachable...
29/08/2011-23:01:55,21 Google HTTP Request OK!
30/08/2011-00:00:55,79 Google HTTP Request OK!
30/08/2011-01:00:09,04 Google HTTP Request OK!
30/08/2011-02:00:02,90 Google HTTP Request OK!

Sachant qu’il y a des identifiants en clair dans les scripts, les dossiers placés dans C:\Windows possèdent des autorisations particulières afin que seul un groupe d’utilisateurs puisse accéder au fichiers qu’ils contiennent. Pour cela, cliquer-droit sur le dossier > Propriétés, Onglet Sécurité > Bouton Paramètres Avancés:
– Supprimer l’héritage, ainsi que les autorisations héritées (décocher « Permettre aux autorisations héritées » et répondre « Supprimer » à la question posée…)
– Dans la liste des autorisations, ne laisser que le groupe contenant l’utilisateur en question.
Idéalement, il faut créer un groupe contenant un utilisateur qui ne servirait qu’à exécuter les scripts sur les 2 machines et appliquer les autorisations en fonction (Lecture et exécution):

PathToBatch_SecurityParameters

En complément, System Scheduler permet d’exécuter ce script toutes les heures. Par ailleurs, la liste des services bidouillables en ligne de commande (via sc) se trouve dans l’éditeur de registre (HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/).

Pour ce qui est de la redirection des ports vers les clients situés après le frontal, il suffit d’ajouter un « paramètre de service ». Cela se fait en quelques étapes:

Dans les connexions réseau (Windows+[R], puis ncpa.cpl, puis Entrée…), cliquer-droit sur la connexion partagée:

connexions_reseau

Dans le troisième onglet des Propriétés de la connexion (Avancé), cliquer sur le bouton Paramètres… dans le deuxième cadre Partage de connexion Internet:

wifi_proprietes

Cliquer sur le bouton Ajouter… situé en bas:

wifi_parametres_avances

Enfin, créer un nouveau paramètre pour l’application qui nécessite un port « ouvert », comme Vuze ou autre… Ici il s’agit de rediriger le port TCP 4667 vers la machine qui exécute l’application. Il est possible d’utiliser le nom de la machine, tout dépend de l’infrastructure réseau (DNS & Co). Privilégier l’adresse IP de la machine, c’est plus sûr:

wifi_proprietes

wifi_parametre_de_service

Terminer en cliquant sur le bouton OK, puis à nouveau OK pour activer la redirection:

wifi_parametres_avances1

Les numéros de ports peuvent être différents entre le port d’entrée et le port de sortie au travers du pseudo-routeur ».