All posts by pierre

Mise en place d’un gestionnaire de paquet centralisé (NEXUS)

Construction du gestionnaire avec Docker

Nous allons installer NEXUS via Docker. Il faut donc connaître un peu Docker, avoir installé les outils nécessaires. Nous les verrons au fur et à mesure.

De base, NEXUS n'est pas pas packagé avec la gestion des paquets pour les distribution se basant sur débian (apt). Il existe un plugin nexus-repository-apt. Attention, le plugin n'est pas supporté par NEXUS, prenez vos responsabilités. Le conteneur contenant le plugin apt se sert du conteneur de base pour ajouter le plugin.

Il va falloir construire le conteneur à partir des sources sur github.

Pour cela, se placer à l'endroit désiré:

cd /home/pierre/Documents

Cloner le dépot officiel du plugin nexus-repository-apt, n'oubliez pas la ligne 2

git clone https://github.com/sonatype-nexus-community/nexus-repository-apt.git
cd nexus-repository-apt/

Se placer sur le bon tag, le master n'est pas nécessairement celui que vous voullez

git checkout UpdateToThreeDotFourteen

Lancer le build, n'oubliez pas le point à la fin de la ligne

docker build -t nexus-repository-apt:3.14.0 .
  • nexus-repository-apt correspond au nom du conteneur construit localement
  • 3.14.0 correspond à la version

Lancer le conteneur

Directement via ligne de commande

docker run -d -p 8081:8081 --name nexus -v /media/raid5/nexus-data:/nexus-data nexus-repository-apt:3.14.0
  • -d, faire tourner le docker en tant que daemon
  • -p 8081:8081, mappe le port 8081 de l’hôte au port 8081 dans le conteneur
  • --name nexus, nom du conteneur
  • -v /media/raid5/nexus-data:/nexus-data, mappe le répertoire /media/raid5/nexus-data de l'hôte au répertoire/nexus-data du conteneur. Docker se débrouille pour créer et monter le répertoire dans le conteneur. Nous faisons cela pour la persistance des données
  • nexus-repository-apt:3.14.0 nexus-repository-apt correspond au nom du conteneur construit localement, 3.14.0, correspond à la version

Vérifier que tous fonctionne bien:

docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS                    NAMES
36be3444152e        nexus-repository-apt:3.14.0   "sh -c ${SONATYPE_DI…"   4 weeks ago         Up 4 weeks          0.0.0.0:8081->8081/tcp   nexus

Connectez-vous à votre gestionnaire de dépôt:

localhost:8081 ou ip-hote:8081

Via SystemD

Créer un service nexus à l'aide du fichier suivant (/etc/systemd/system/nexus.service)


[Unit]
Description=nexus docker service
After=syslog.target docker.service

[Service]
ExecStartPre=-/usr/bin/docker kill nexus
ExecStartPre=-/usr/bin/docker rm nexus
ExecStart=/usr/bin/docker run \
  --name nexus \
  --publish 8081:8081 \
  --volume /media/raid5/nexus-data:/nexus-data \
  nexus-repository-apt:3.14.0
ExecStop=-/usr/bin/docker stop nexus
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
  • ExecStartPre, commande à lancer avant le start
  • --name, nom du conteneur, il doit être unique
  • --publish, mappage du port 8081 au port 8081 du conteneur, seul port ouvert du conteneur
  • --volume, mappe le répertoire /media/raid5/nexus-data de l'hôte au répertoire/nexus-data du conteneur. Docker se débrouille pour créer et monter le répertoire dans le conteneur. Nous faisons cela pour la persistance des données

Mise à jour de SystemD avec le nouveau service


systemctl daemon-reload

Permettre au service de démarrer lors du démarrage de la VM ou du PC


systemctl enable nexus.service

Mise à disposition derrière Apache

Créer le fichier de configuration d'Apache:

nano /etc/apache2/sites-available/exemple.com.conf

Contenu du fichier:

Protocols http/1.1
<VirtualHost *:80>
 ServerAdmin contact@exemple.com
 ServerName exemple.com
 Redirect permanent / https://exemple.com/
 ErrorLog ${APACHE_LOG_DIR}/error.log
 CustomLog ${APACHE_LOG_DIR}/access.log combined
<virtualhost>

<virtualhost *:443="">
 ServerAdmin contact@exemple.com
 ServerName exemple.com
 Protocols h2 http/1.1

 ErrorLog ${APACHE_LOG_DIR}/error_ssl.log
 CustomLog ${APACHE_LOG_DIR}/access_ssl.log common
 LogLevel warn

 SSLEngine on
 SSLProtocol all -SSLv2 -SSLv3
 SSLHonorCipherOrder on
 SSLCertificateFile /etc/letsencrypt/live/exemple.com/fullchain.pem
 SSLCertificateKeyFile /etc/letsencrypt/live/exemple.com/privkey.pem

 AllowEncodedSlashes NoDecode
 RequestHeader set X-Forwarded-Proto "https"
 ProxyPass / http://p-nexus:8081/ nocanon
 ProxyPassReverse / http://p-nexus:8081/
<virtualhost>
  • ServerName, nom du serveur sur internet ou dans votre réseau
  • Redirect permanent met en place une redirection permanente sur une connexion sécurisé
  • Protocols définit les protocoles disponible, nous indiquons ici que nous préférons utiliser http2

Voila, nexus est fonctionnel.

PS: une fois le conteneur monté, il faut attendre un peu que Nexus démarre. Ca prend un peu de temps, entre une minute pour un Nexus vierge à 20 minutes pour un Nexus avec des données

Commande Linux en vrac

Taille d'un répertoire:

du -hs /media/raid5/
2,3T	/media/raid5/

Chercher du texte dans les fichiers d'un répertoire:

grep -rnw '/repertoire/de/recherche/du/texte' -e 'texte recherché'
  • -r or -R Recherche récursive,
  • -i ignore la casse
  • -n indique le numéro de ligne dans le fichier trouvé
  • -w pour chercher le mot entier.
  • -l (petit L) pour donner uniquement le nom des fichiers trouvés
  • --include=\*.{c,h} uniquement les fichiers .c et .h
  • --exclude=*.o exclure les fichiers .o
  • --exclude-dir={dir1,dir2,*.dst} exclut le repertoire dir1, dir2 et tous les répertoires répondant au regex *.dst

source: https://stackoverflow.com/questions/16956810/how-do-i-find-all-files-containing-specific-text-on-linux

Historique des cron

grep CRON /var/log/syslog
Jun 13 07:17:01 hostname CRON[11824]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Jun 13 08:17:01 hostname CRON[11900]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Jun 13 09:17:01 hostname CRON[11977]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Jun 13 10:17:01 hostname CRON[13108]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Jun 13 10:30:01 hostname CRON[13483]: (root) CMD (docker exec --user www-data nc php -f /var/www/html/cron.php)
Jun 13 10:45:01 hostname CRON[14134]: (root) CMD (docker exec --user www-data nc php -f /var/www/html/cron.php)
Jun 13 11:00:01 hostname CRON[15160]: (root) CMD (docker exec --user www-data nc php -f /var/www/html/cron.php)
Jun 13 11:17:01 hostname CRON[15439]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)

Ou se trouve une commande

whereis docker
docker: /usr/bin/docker /etc/docker /usr/share/man/man1/docker.1.gz

type -a docker
docker est /usr/bin/docker

redirection de port avec ssh

Vous êtes loin de vos serveur.
Vous désirez vous connecter à une ressource (hors ligne) de votre serveur exemple.fr
Nous allons utilisé un tunnel ssh

ressource désirée => https://exemple.fr:8443/maxview/manager/login.xhtml

La commande SSH à taper est la suivante:

ssh -L 8000:localhost:8443 exemple.fr -p 10145

-p 10145 correspond au port ssh d'écoute du serveur exemple.fr
-L 8000 port local redirigé ver le port 8443 du serveur

Dans votre navigateur, lancer http://localhost:8000/maxview/manager/login.xhtml

installer WordPress sous Debian

WordPress est à la base un moteur de blog qui s'est enrichi pour devenir un système de gestion de contenu (CMS).

Nous allons installer WordPress dans une Debian 7 (Wheezy). Pour faciliter la rédaction de mon document, nous réaliserons toutes les étapes en ligne de comande dans un terminal administrateur.

Prérequi WordPress

WordPress a besoin de:

  • Un Serveur HTTP, nous utiliserons Apache
  • Un serveur de base de donnée, nous utiliserons MySQL
  • PHP (language de programation pour produire des pages webs dynamiques

Apache

Normallement, si vous avez, lors de votre installation de Debian, coché la case d'installation du serveur HTTP, Apache devrait déjà être installé. Pour vérifier, lancer la commande apt-get update pour faire une mise à jour de l'état d'installation des packets, puis lancer aptitude search 'apache2'. Vous obtiendrez quelque chose comme ceci.

# aptitude search 'apache2'
i   apache2                                                      - Métapaquet pour le serveur HTTP Apache
p   apache2-dbg                                                  - symboles de débogage pour Apache
p   apache2-doc                                                  - Documentation du serveur HTTP Apache
v   apache2-mpm                                                  - 
p   apache2-mpm-event                                            - serveur HTTP Apache - modèle géré par événements
p   apache2-mpm-itk                                              - MPM multiutilisateur pour Apache&amp;amp;amp;nbsp;2.2
p   apache2-mpm-prefork                                          - serveur HTTP Apache - modèle traditionnel «&amp;amp;amp;nbsp;non-threaded&amp;amp;amp;nbsp;»
i A apache2-mpm-worker                                           - serveur HTTP Apache - modèle multi-processus
p   apache2-prefork-dev                                          - en-têtes de développement Apache - MPM sans fils d'exécution
p   apache2-suexec                                               - programme standard suexec pour le mod suexec d'Apache&amp;amp;amp;nbsp;2
p   apache2-suexec-custom                                        - programme suexec configurable pour mod_suexec de Apache&amp;amp;amp;nbsp;2
p   apache2-threaded-dev                                         - en-têtes de développement Apache - MPM avec fils d'exécution
i A apache2-utils                                                - programmes utilitaires pour serveurs web
i A apache2.2-bin                                                - fichiers binaires communs pour le serveur HTTP Apache
i A apache2.2-common                                             - serveur HTTP Apache (fichiers communs)
p   libapache2-authcassimple-perl                                - Apache2 module to authentificate trough a CAS server
....
p   libapache2-webauth                                           - Apache 2 modules for WebAuth authentication
p   libapache2-webkdc                                            - Apache 2 modules for a WebAuth authentication KDC
p   rt4-apache2                                                  - Apache 2 specific files for request-tracker4
p   torrus-apache2                                               - Universal front-end for Round-Robin Databases (for apache 2.x) (depreca

Si Apache est installé, vous devriez avoir un petit "i" en début de ligne avant 'apache2'. Donc pas besoin d'aller plus loin pour l'instant.

Si ce n'est pas le cas, lancer la commande:

#apt-get install apache2

C'est tout pour apache.

MySQL

Normallement, si vous avez, lors de votre installation de Debian, coché la case d'installation du serveur de base de données, 'MysQL-Server' devrait déjà être installé. Pour vérifier, lancer la commande apt-get update pour faire une mise à jour de l'état d'installation des packets, puis lancer aptitude search 'mysql-server'. Vous obtiendrez quelque chose comme ceci.

# aptitude search 'mysql-server'
p   mysql-server                                                 - MySQL database server (metapackage depending on the latest version)
p   mysql-server-5.5                                             - serveur de bases de données MySQL - binaires et configuration
v   mysql-server-core                                            - 
p   mysql-server-core-5.5                                        - binaires du serveur de bases de données MySQL
v   virtual-mysql-server                                         - 

Ici, nous voyons que le serveur MySQL n'est pas installé, indiqué par le 'p' devant 'mysql-server'. Nous allons donc l'installer. Si chez vous, 'mysql-server' est déjà installé, ne pas exécuter la commande d'installation suivante.

#apt-get install mysql-server

Pendant le processus d'installation, il va vous être demandé de compléter certainne information. Je vais mettre des copies d'écran pour vous accompagner dans le processus d'installation.

La première information demandée est le mot de passe administrateur de MySQL. Faire en sorte de bien le définir et ne pas le perdre.

MysqlServer

Valider et retaper le mot de passe administrateur pour vérifier qu'il n'y a pas eu d'erreur de frappe.

MySQLServeurConfirmationA la fin de l'installation de MySQL, si tout s'est bien passé, vous devriez obtenir ceci.

[ ok ] Starting MySQL database server: mysqld ..
[info] Checking for tables which need an upgrade, are corrupt or were 
not closed cleanly..
Paramétrage de libhtml-template-perl (2.91-1) ...
Paramétrage de mysql-server (5.5.38-0+wheezy1) ...

PHP

Php n'est pas sistématiquement installé. Pour vérifier, taper la commande que vous commencez à connaître: aptitude search 'php5*'. Cela donne quelque chose comme ca:

# aptitude search 'php5*'
p   cakephp                                                      - MVC rapid application development framework for PHP
p   cakephp-instaweb                                             - Development webserver for CakePHP applications
....
p   php5                                                         - langage de script côté serveur, inclus dans du HTML (méta-paquet)
....
v   php5-mssql                                                   - 
p   php5-mysql                                                   - modules MySQL pour PHP5
p   php5-mysqlnd                                                 - MySQL module for php5 (Native Driver)
....
p   suphp-common                                                 - Common files for mod suphp
p   uphpmvault                                                   - upload recovery images to HP MediaVault2 via Ethernet

Les lignes, qui nous intéressent, sont php5 et php5-mysql. Elles doivent être installé (petit 'i' au début de la ligne). Si ce n'est pas le cas, installer ces deux packets:

#apt-get install php5 php5-mysql

Voila! C'est tout pour les prérequis. Nous allons maintenant installer WordPress.

Worpess

installation de WordPress

Au jour d'aujourd'hui (18-01-2015), la version courante de WordPress est la version 4.1. Nous allons la télécharger, la décompresser, préparer la base de donnée et l'installer.

Téléchargement de WordPress

Lancer la commande suivante

#wget https://fr.wordpress.org/wordpress-4.1-fr_FR.zip

Pour vérifier que le fichier est bien téléchargé, lancer:

# ls -l
total 6896
-rw-r--r-- 1 user user      65 oct.   6 22:06 bash_profile
-rw-r--r-- 1 user user      61 oct.   6 00:08 bash_profile~
drwxr-xr-x 2 user user    4096 oct.   2 22:52 Bureau
drwxr-xr-x 2 user user    4096 oct.   2 22:52 Documents
drwxr-xr-x 2 user user    4096 oct.   2 22:52 Images
drwxrwxr-x 3 user user    4096 oct.   6 21:44 lorrainng
drwxr-xr-x 2 user user    4096 oct.   2 22:52 Modèles
drwxr-xr-x 2 user user    4096 oct.   2 22:52 Musique
drwxr-xr-x 2 user user    4096 oct.   2 22:52 Public
drwxr-xr-x 4 user user    4096 oct.  11 12:48 Téléchargements
drwxr-xr-x 2 user user    4096 oct.   2 22:52 Vidéos
-rw-r--r-- 1 root   root   7016086 sept.  4 19:05 wordpress-4.1-fr_FR.zip

Le fichier 'wordpress-4.1-fr_FR.zip' est bien présent. Nous pouvons continuer.

Si vous voullez télécharger la dernière version directement, aller sur le site de wordpress france et passer la sourie sur le bouton de téléchargement, cliquer droit et selectionner 'copier l'adresse du lien'. Puis télécharger cette dernière version en tapant:

#wget 'adresse du lien collée ici'

Décompression et autorisation de WordPress

Nous décompresserons WordPress dans le répertoire /var/www/ et lui donnerons les bonnes autorisations.

#unzip wordpress-4.1-fr_FR.zip -d /var/www

Changer le groupe des répertoires et fichier dans wordpress.

#chgrp -R www-data /var/www/

Pour pouvoir installer des modules, charger des images, faire des mises à jour, il faut changer les autorisations d'écriture du répertoire 'wp-content' dans le répertoire d'installation de WordPress.

#chmod 2775 -R /var/www/wordpress/wp-content/

Préparation de la base de donnée

WordPress lors de l'installation ne crée pas la base de donnée qu'il va utiliser. Il faut donc la créer manuellement, ainsi que l'utilisateur qui va être autorisé à s'y connecter et faire les modifications nécessaires.

Lancer le client mysql en tant que root (-u = définit l'utilisateur, -p demande le mot de passe):

# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 43
Server version: 5.5.38-0+wheezy1 (Debian)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Creation de la base de donnée 'wordpress'

mysql> CREATE DATABASE wordpress  DEFAULT CHARACTER SET utf8   DEFAULT COLLATE utf8_general_ci;
Query OK, 1 row affected (0.00 sec)

Création de l'utilisateur (wpdb) et attribution des droits sur la base de donnée (wordpress)

mysql> grant all privileges on wordpress.* to wpdb identified by 'password';
Query OK, 0 rows affected (0.00 sec)

Normallement, c'est bon. Nous allons tout de même vérifier que la connection à Mysql pour la base de donnée wordpress se fait bien. Quitons le client mysql pour nous reconnecter en tant que wpdb. Nous quitterons de nouveau le client MySQL pour revenir dans le shell.

mysql> exit
Bye
root@machine:/home/user# mysql -u wpdb -p wordpress
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 44
Server version: 5.5.38-0+wheezy1 (Debian)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> exit

La base de donnée est prête, les droits sont données, nous allons maintenant réaliser l'installation de WordPress.

Installation de WordPress

wp-config.php

Pour faire au plus rapide, nous allons d'abord copier le fichier wp-config-sample.php vers wp-config.php et donner les droits en écriture.

#cp /var/www/wordpress/wp-config-sample.php /var/www/wordpress/wp-config.php
#chown root:www-data /var/www/wordpress/wp-config.php
#chmod 2755 /var/www/wordpress/wp-config.php

Nous allons maintenant modifier le fichier pour nos besoins.

PS: navigation dans nano => avec les flèches du clavier. Possibilité de coller du texte en placant le curseur au préalable à l'endroit désiré.

#nano /var/www/wordpress/wp-config.php

Chercher les lignes suivante:

// ** Réglages MySQL - Votre hébergeur doit vous fournir ces informations. ** //
/** Nom de la base de données de WordPress. */
define('DB_NAME', 'votre_nom_de_bdd');

/** Utilisateur de la base de données MySQL. */
define('DB_USER', 'votre_utilisateur_de_bdd');

/** Mot de passe de la base de données MySQL. */
define('DB_PASSWORD', 'votre_mdp_de_bdd');

/** Adresse de l'hébergement MySQL. */
define('DB_HOST', 'localhost');

/** Jeu de caractères à utiliser par la base de données lors de la création des tables. */
define('DB_CHARSET', 'utf8');

/** Type de collation de la base de données. 
  * N'y touchez que si vous savez ce que vous faites. 
  */
define('DB_COLLATE', '');

et sles modifier en:

// ** Réglages MySQL - Votre hébergeur doit vous fournir ces informations. ** //
/** Nom de la base de données de WordPress. */
define('DB_NAME', 'wordpress');

/** Utilisateur de la base de données MySQL. */
define('DB_USER', 'wpdb');

/** Mot de passe de la base de données MySQL. */
define('DB_PASSWORD', 'password');

/** Adresse de l'hébergement MySQL. */
define('DB_HOST', 'localhost');

/** Jeu de caractères à utiliser par la base de données lors de la création des tables. */
define('DB_CHARSET', 'utf8');

/** Type de collation de la base de données. 
  * N'y touchez que si vous savez ce que vous faites. 
  */
define('DB_COLLATE', '');

Tout en restant dans nano, il faut aussi modifier les données suivantes dans le même fichier:

Supprimer les lignes suivantes:

define('AUTH_KEY',         'put your unique phrase here'); 
define('SECURE_AUTH_KEY',  'put your unique phrase here'); 
define('LOGGED_IN_KEY',    'put your unique phrase here'); 
define('NONCE_KEY',        'put your unique phrase here'); 
define('AUTH_SALT',        'put your unique phrase here'); 
define('SECURE_AUTH_SALT', 'put your unique phrase here'); 
define('LOGGED_IN_SALT',   'put your unique phrase here'); 
define('NONCE_SALT',       'put your unique phrase here'); 

et les remplacer par les lignes générées dans le lien indiqué dans le commantaire juste au dessus des lignes à modifier (à la date du 11/10/14, https://api.wordpress.org/secret-key/1.1/salt/):

saltEnregistrer le fichier avec la combinaison des touches CTRL + O et quitter nano avec CTRL + x.

Voila, nous sommes prêt à lancer l'installation.

Installation de WordPress

Pour ce faire, allé dans votre navigateur préféré et taper l'adresse suivante: localhost/wordpress/wp-admin/install.php. Vous devriez avoir la page suivante.

WordpressInstallRemplir ce qu'il faut et valider. Vous obtiendrez la page suivante:

Cliquer sur connexion.

SuccesInstallWordpressVoila! c'est fini et installé.

 

 

Failover Vpn site à site (GRE + IPSec)

Ce document fournit une configuration pour les tunnels IPsec entre deux routeurs Cisco placés dans 2 sites distincts, entre deux réseaux locaux (lien site à site). Les configurations se feront sur des routeurs C892FSP-K9, avec comme rom, la c800-universalk9-mz.SPA.152-4.M6.bin. J'ai choisi de garder les box pour bénéficier des autres services fournis (TV et téléphone), cela influera un peu sur la configuration.

Pour bien comprendre ce que nous allons faire, voici la topologie du réseau:

Topologie reseau

Du côté Free, le routeur aura pour nom, Routeur2 et du côté Bouygues-SFR, le routeur aura pour nom Routeur1.

Le but du VPN est de faire en sorte que les 2 sites communiquent exactement comme si ils étaient directement reliés entre eux, de manière à ce que les 2 réseaux puissent êtres directement routés (et non passer par du NAT).

Voici donc à quoi ressemblera là topologie du réseau final:

Topologie reseau idealise 001La liaison directe entre les 2 routeurs se fera via les 2 réseaux (172.16.1.0/30 => SFR et 172 .16.2.0/30 => Bouygues). Ils symbolisent les liens que nous souhaitons créer avec les VPNs.

La mise en place des VPNs se fera en 3 phases:

  • Mise en place des Tunnels (GRE) entre les 2 sites (définition des interfaces virtuelles)
  • Mise en place du routage entre les 2 Réseaux locaux
  • Cryptage des tunnels.

Configuration des interfaces

Pas de difficulté particulière. Je le mets pour information.

Réseau1:

Nous allons d'abord configurer les interfaces Gi8, Gi9, Vlan1:


>en
#conf t
(config)#interface gi9
(config-if)#Description Lien secondaire Bouygues
(config-if)#ip address 192.168.2.100
(config-if)#ip nat outside
(config-if)#exit
(config)#

(config)#interface gi8
(config-if)#Description Lien primaire SFR
(config-if)#ip address 192.168.1.100
(config-if)#ip nat outside
(config-if)#exit
(config)#

(config)#interface vlan1
(config-if)#Description Reseau local
(config-if)#ip address 192.168.100.254
(config-if)#ip nat inside
(config-if)#exit
(config)#

Configurons maintenant les tunnels, interfaces virtuel tunnel 0 et 1:


>en
#conf t
(config)#interface Tunnel0
(config-if)#Description Lien Tunnel SFR
(config-if)#ip address 172.16.0.1 255.255.255.252
(config-if)#tunnel source 192.168.1.100
(config-if)#tunnel destination 78.0.0.1
(config-if)#ip nat inside
(config-if)#exit
(config)#

(config)#interface Tunnel1
(config-if)#Description Lien Tunnel Bouygues
(config-if)#ip address 172.16.1.1 255.255.255.252
(config-if)#tunnel source 192.168.2.100
(config-if)#tunnel destination 78.0.0.1
(config-if)#ip nat inside
(config-if)#exit
(config)#

La configuration d'un tunnel se fait de la même manière que pour une interface normale. Il faut seulement définir la source du tunnel (ip wan du routeur, ici 192.168.1.100 et 192.168.2.100) et la destination (l'adresse ip publique du site au bout du tunnel, ici 78.0.0.1).

Attention, les commandes "tunnel source" et "tunnel destination" fonctionneront uniquement dans des interfaces de type "interface tunnel x".
Attention, nous sommes dans le réseau qui a 2 liens vers internet, nous connectons le réseau via 2 tunnels à 1 seul site distant. Donc 2 tunnels avec deux sources et une seul destination.

Réseau2:

Nous allons configurer les interfaces Gi9 et Vlan1:


>en
#conf t
(config)#interface gi9
(config-if)#Description Lien vers Internet
(config-if)#ip address 192.168.10.200
(config-if)#ip nat outside
(config-if)#exit
(config)#

(config)#interface vlan1
(config-if)#ip address 192.168.200.254
(config-if)#ip nat inside
(config-if)#exit
(config)#

Configurons maintenant les interfaces virtuel tunnel 0 et 1:

Ici, nous faisons l'inverse. Nous allons paramétrer 2 tunnels avec 1 source et 2 destinations.


>en
#conf t
(config)#interface Tunnel0
(config-if)#Description Lien Tunnel SFR
(config-if)#ip address 172.16.0.2 255.255.255.252
(config-if)#tunnel source 192.168.10.200
(config-if)#tunnel destination 109.0.0.1
(config-if)#ip nat inside
(config-if)#exit
(config)#

(config)#interface Tunnel1
(config-if)#Description Lien Tunnel Bouygues
(config-if)#ip address 172.16.1.2 255.255.255.252
(config-if)#tunnel source 192.168.10.200
(config-if)#tunnel destination 128.0.0.1
(config-if)#ip nat inside
(config-if)#exit
(config)#

Routage et accès à internet

Les interfaces sont configurées, mais pour l'instant, rien ne communique avec rien. Du fait que les routeurs sont derrières des box, les ip sur les interfaces WAN (Gi8 / Gi9) sont des ip locales non routables. Il faut donc mettre en place du nat pour que les machines derrière le routeur puissent accéder à internet. Nous allons voir ça maintenant.

Nat sur le réseau 1

Pourquoi nonat (pas de nat)? Parceque le trafique qui doit passer dans les tunnels ne doit pas être naté. Nous nous en assurerons en définissant les "deny". Tout ce qui est "permit" sera autorisé et naté (ici, l'acces à internet), le reste ne sera pas autorisé car à la fin d'une access list, il y a toujour un deny implicit.

Définition de l’access list SFR-nonat :


>en
#conf t
(config)#ip access-list extended SFR-nonat
(config-ext-nacl)#deny ip 192.168.100.0 0.0.0.255 192.168.200.0 0.0.0.255
(config-ext-nacl)#deny ip 192.168.100.0 0.0.0.255 192.168.10.0 0.0.0.255
(config-ext-nacl)#permit ip 192.168.200.0 0.0.0.255 192.168.1.0 0.0.0.255
(config-ext-nacl)#permit ip 192.168.100.0 0.0.0.255 any
(config-ext-nacl)#exit
(config)#

Le "deny ip 192.168.100.0 0.0.0.255 192.168.200.0 0.0.0.255" permet d'interdire le trafic pour les machines à destionation du réseau 192.168.200.0/24. Ce trafic passera par les tunnels et donc ne doit pas être autorisé sur cette interface. Cela revient à dire qu'il ne faut pas que le trafic soit natter.
Idem pour "deny ip 192.168.100.0 0.0.0.255 192.168.10.0 0.0.0.255".

Le "permit ip 192.168.200.0 0.0.0.255 192.168.1.0 0.0.0.255" permet au réseau 2 (192.168.200.0/24) d'être natter pour avoir accès à la box SFR (192.168.1.1)
Le "permit ip 192.168.100.0 0.0.0.255 any" met en place le NAT pour le Vlan1 pour l'accès à internet.

Définition de l’access list Bouygues-nonat :


>en
#conf t
(config)#ip access-list extended Bouygues-nonat
(config-ext-nacl)#deny ip 192.168.100.0 0.0.0.255 192.168.200.0 0.0.0.255
(config-ext-nacl)#deny ip 192.168.100.0 0.0.0.255 192.168.10.0 0.0.0.255
(config-ext-nacl)#permit ip 192.168.200.0 0.0.0.255 192.168.2.0 0.0.0.255
(config-ext-nacl)#permit ip 192.168.100.0 0.0.0.255 any
(config-ext-nacl)#exit
(config)#

Le principe reste le même que pour l'access list SFR-nonat.

Activation du nat sur chaque interface :


>en
#conf t
(config)# ip nat inside source list SFR-nonat interface gi8 overload
(config)# ip nat inside source list Bouygues-nonat interface gi9 overload

Maintenant, nous allons mettre en place le failover et les routes qui vont biens.

Nat sur le réseau 2

Définition de l’access list Free-nonat :


>en
#conf t
(config)#ip access-list extended Free-nonat
(config-ext-nacl)#deny ip 192.168.200.0 0.0.0.255 192.168.100.0 0.0.0.255
(config-ext-nacl)#deny ip 192.168.200.0 0.0.0.255 192.168.1.0 0.0.0.255
(config-ext-nacl)#deny ip 192.168.200.0 0.0.0.255 192.168.2.0 0.0.0.255
(config-ext-nacl)#permit ip 192.168.100.0 0.0.0.255 192.168.10.0 0.0.0.255
(config-ext-nacl)#permit ip 192.168.200.0 0.0.0.255 any
(config-ext-nacl)#exit
(config)#

Activation du nat :


>en
#conf t
(config)# ip nat inside source list Free-nonat interface gi9 overload

Failover (Uniquement sur le réseau 1)

Nous allons utiliser IPSla pour réaliser le failover. IPSla va permettre de pinger une ip et en fonction du résultat, activera ou désactivera la route. Pour plus de détail, voir l'article que j'ai réaliser: Cliquer ici

IPSla pour le réseau 1 (nous ne configurerons que celui-ci):

ip sla 1
icmp-echo 8.8.8.8 source-interface GigabitEthernet8
frequency 5
ip sla schedule 1 life forever start-time now
!
track 1 ip sla 1
!
ip route 8.8.8.8 255.255.255.255 192.168.1.1

Routage

Réseau 1:


>en
#conf t
(config)#ip route 0.0.0.0 0.0.0.0 192.168.1.254 track 1
(config)#ip route 0.0.0.0 0.0.0.0 192.168.2.254 2

ip route 0.0.0.0 0.0.0.0 192.168.1.254 track 1 = route par défaut tant que le track 1 sera bon (OK)
ip route 0.0.0.0 0.0.0.0 192.168.2.254 2 = si le track 1 est KO, la route par défaut disparait et celle-ci, pondérée par le 2 à la fin de la ligne, deviendra la route pour l'acces à Internet. L'instance (le 2) à la fin de la ligne définit la priorité.

Avec le changement de route vers internet, le tunnel changera.

Réseau 2:


>en
#conf t
(config)#ip route 0.0.0.0 0.0.0.0 192.168.10.254

Rien de bien difficile.

Juqu'ici, nous avons configuré les interfaces, les tunnels, les routes et le failover. Avant de commencer à mettre en place le cryptage sur les tunnels, nous allons d'abord tester que ceux-ci sont fonctionnels et que le basculement entre les deux tunnels fonctionne.

Vérification des tunnels et du failover

Tout est déjà configuré et la route par défaut passe par SFR.


routeur1#sh ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area 
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
       + - replicated route, % - next hop override

Gateway of last resort is 192.168.1.1 to network 0.0.0.0

S*    0.0.0.0/0 [1/0] via 192.168.1.1

Regardons l'état de nos interfaces:


routeur1#show ip interface brief 
Interface                  IP-Address      OK? Method Status                Protocol
GigabitEthernet0           unassigned      YES unset  up                    up
GigabitEthernet1           unassigned      YES unset  down                  down    
GigabitEthernet2           unassigned      YES unset  down                  down    
GigabitEthernet3           unassigned      YES unset  down                  down    
GigabitEthernet4           unassigned      YES unset  up                    up      
GigabitEthernet5           unassigned      YES unset  down                  down    
GigabitEthernet6           unassigned      YES unset  up                    up      
GigabitEthernet7           unassigned      YES unset  up                    up      
GigabitEthernet8           192.168.1.100   YES NVRAM  up                    up      
GigabitEthernet9           192.168.2.100   YES NVRAM  up                    up
NVI0                       unassigned      YES unset  administratively down down
Tunnel0                    172.16.0.1      YES NVRAM  up                    up
Tunnel1                    172.16.1.1      YES NVRAM  up                    down
Vlan1                      192.168.100.254 YES NVRAM  up                    up

Nous pouvons voir que les deux tunnels sont "up" au niveau du status mais que Tunnel 1 est "down" au niveau du protocole. C'est normal car la route par défaut emprunte une route via SFR. Le tunnel1 emprunte la route via Bouygues et donc ne peut pas utiliser la route par défaut. Celle-ci n'est pas active d'ou le protocol = down.

Que se passe-t-il si nous retirons le cable entre l'ONT et la box SFR (supression du lien entre la box et le fournisseur, SFR), la route SFR va tomber et celle de Bouygue va devenir up.


routeur1#sh ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area 
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
       + - replicated route, % - next hop override

Gateway of last resort is 192.168.2.254 to network 0.0.0.0

S*    0.0.0.0/0 [2/0] via 192.168.2.254

routeur1#show ip interface brief 
Interface                  IP-Address      OK? Method Status                Protocol
GigabitEthernet0           unassigned      YES unset  up                    up      
GigabitEthernet1           unassigned      YES unset  down                  down    
GigabitEthernet2           unassigned      YES unset  down                  down    
GigabitEthernet3           unassigned      YES unset  down                  down    
GigabitEthernet4           unassigned      YES unset  up                    up      
GigabitEthernet5           unassigned      YES unset  down                  down    
GigabitEthernet6           unassigned      YES unset  up                    up      
GigabitEthernet7           unassigned      YES unset  up                    up      
GigabitEthernet8           192.168.1.100   YES NVRAM  up                    up      
GigabitEthernet9           192.168.2.100   YES NVRAM  up                    up      
NVI0                       unassigned      YES unset  administratively down down    
Tunnel0                    172.16.0.1      YES NVRAM  up                    down      
Tunnel1                    172.16.1.1      YES NVRAM  up                    up    
Vlan1                      192.168.100.254 YES NVRAM  up                    up

La route et le tunnel actif ont changés. Si le status et le protocol du deuxième tunnel sont up, cela veux dire que le lien fonctionne. Pour le voir, il suffit de pinger l'autre bout du tunnel.


routeur1#ping 172.16.1.2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 172.16.1.2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max

Pour l'instant, tout ce qui passe par le tunnel n'est pas crypter. Nous allons maintenant mettre en place le cryptage.

Cryptage

Mise en place du cryptage dans le réseau 2 (Free)

Nous allons utiliser le cryptage IKE, aussi appelé ISAKMP qui est chargé de négocier les Associations de Sécurité (AS) entre deux appareils voulant communiquer.
ISAKMP sépare les négociations en deux phases: Phase 1 et Phase 2.

  • La Phase 1 crée le premier tunnel, qui protègera les futurs messages de négociation d'ISAKMP, Il s'agit de la politique IKE qui définit une méthode de chiffrement, la durée de vie, la méthode d’intégrité, etc.
  • La Phase 2 crée un tunnel qui protègera les données qui transitent entre les deux réseaux. Nous configurerons la politique de sécurité IPSec.

Phase 1: configuration de la politique IKE


(config)# crypto isakmp policy 1
(config-isakmp)# encr 3des
(config-isakmp)# authentication pre-share
(config-isakmp)# group 2
(config-isakmp)# exit

Création de clés pré-partagées

Nous définissons les clés pré-partagées : le mot de passe ainsi que les adresses IP du routeur distant avec lequel nous communiquons. Vous remarquerez ici que nous définissons 2 clés partagées car nous créons 2 tunels qui ont pour cible les adresse IP publiques du réseaux Bouygues-SFR.


(config)#  crypto isakmp key motdepasse address 128.0.0.1
(config)#  crypto isakmp key motdepasse address 109.0.0.1

Phase 2: configuration de la politique IPSEC

Nous définissons notre transform-set pour l’établissement d’une liaison IPSec SA. Elle aura pour nom "TSET".


(config)# crypto ipsec transform-set TSET esp-3des esp-md5-hmac 
(cfg-crypto-trans)# mode tunnel

 

Voila, c'est tout pour aujourd'hui.

Référence:

Documentation Cisco sur IPSEC (en anglais)
Comparaison des différentes solution VPN pour Cisco (en anglais)
Vue d'ensemble d'ISAKMP (en anglais)
Scénarios VPN Site à Site (en anglais)
Configuring IPSec Network Security (en anglais)

Autres références intéressantes:

Easy VPN Server Avec DVTI (Dynamic Vpn Tunnel Interfaces) par Bastien Migette (en français)