Affichage des articles dont le libellé est XBOX. Afficher tous les articles
Affichage des articles dont le libellé est XBOX. Afficher tous les articles

vendredi 5 juin 2020

Sécurité: Se protéger du "boot" sur nos XBOX one ! (Suite ;-)

En fait, suite à un retour d'un collègue (Merci Daniel ;-) et vu que j'utilise NordVPN, je peux maintenant utiliser NordLynx de NordVPN qui utilise le protocole basé sur WireGuard au lieu d'utiliser OpenVPN comme je l'avais fait dans le tuto précédent.




Cette fois, je vous propose de partager avec vous comment passer de OpenVPN à NordLynx et on verra comment avoir un fonctionnement en mode service si on passe par une app comme cell de NordVPN.

Donc repartons donc à partir du rapsberry pi déjà configurer en tant de Gateway VPN avec OpenVPN.

1) Arrêter OpenVPN et désactiver en mode service pour ne pas perturber NordLynx.

pi@raspberrypi:~ $ sudo service openvpn stop
pi@raspberrypi:~ $ sudo systemctl disable openvpn
Synchronizing state of openvpn.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable openvpn
Removed /etc/systemd/system/multi-user.target.wants/openvpn.service.
pi@raspberrypi:~ $ 

2) Installation de l'app NordVPN :

En 4 commandes finalement....

pi@raspberrypi:~ $ sudo wget -qnc https://repo.nordvpn.com/deb/nordvpn/debian/pool/main/nordvpn-release_1.0.0_all.deb
pi@raspberrypi:~ $ sudo dpkg -i nordvpn-release_1.0.0_all.deb
Selecting previously unselected package nordvpn-release.
(Reading database ... 40158 files and directories currently installed.)
Preparing to unpack nordvpn-release_1.0.0_all.deb ...
Unpacking nordvpn-release (1.0.0) ...
Setting up nordvpn-release (1.0.0) ...
pi@raspberrypi:~ $ sudo apt update
Get:1 http://archive.raspberrypi.org/debian buster InRelease [32.6 kB]
Get:2 http://raspbian.raspberrypi.org/raspbian buster InRelease [15.0 kB]
Get:3 https://repo.nordvpn.com/deb/nordvpn/debian stable InRelease [6,174 B]
Get:4 http://archive.raspberrypi.org/debian buster/main armhf Packages [330 kB]
Get:5 https://repo.nordvpn.com/deb/nordvpn/debian stable/main armhf Packages [3,459 B]
Fetched 387 kB in 3s (130 kB/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
9 packages can be upgraded. Run 'apt list --upgradable' to see them.
pi@raspberrypi:~ $ sudo apt install nordvpn
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  ipset libipset11 libxslt1.1 xsltproc
The following NEW packages will be installed:
  ipset libipset11 libxslt1.1 nordvpn xsltproc
0 upgraded, 5 newly installed, 0 to remove and 9 not upgraded.
Need to get 7,460 kB of archives.
After this operation, 26.0 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Get:1 http://mirrors.ircam.fr/pub/raspbian/raspbian buster/main armhf libipset11 armhf 6.38-1.2 [48.8 kB]
Get:2 http://mirrors.ircam.fr/pub/raspbian/raspbian buster/main armhf ipset armhf 6.38-1.2 [49.1 kB]
Get:3 http://ftp.igh.cnrs.fr/pub/os/linux/raspbian/raspbian buster/main armhf libxslt1.1 armhf 1.1.32-2.2~deb10u1 [215 kB]
Get:4 http://ftp.igh.cnrs.fr/pub/os/linux/raspbian/raspbian buster/main armhf xsltproc armhf 1.1.32-2.2~deb10u1 [121 kB]
Get:5 https://repo.nordvpn.com/deb/nordvpn/debian stable/main armhf nordvpn armhf 3.7.3 [7,026 kB]
Fetched 7,460 kB in 4s (1,826 kB/s)
Selecting previously unselected package libipset11:armhf.
(Reading database ... 40160 files and directories currently installed.)
Preparing to unpack .../libipset11_6.38-1.2_armhf.deb ...
Unpacking libipset11:armhf (6.38-1.2) ...
Selecting previously unselected package ipset.
Preparing to unpack .../ipset_6.38-1.2_armhf.deb ...
Unpacking ipset (6.38-1.2) ...
Selecting previously unselected package libxslt1.1:armhf.
Preparing to unpack .../libxslt1.1_1.1.32-2.2~deb10u1_armhf.deb ...
Unpacking libxslt1.1:armhf (1.1.32-2.2~deb10u1) ...
Selecting previously unselected package xsltproc.
Preparing to unpack .../xsltproc_1.1.32-2.2~deb10u1_armhf.deb ...
Unpacking xsltproc (1.1.32-2.2~deb10u1) ...
Selecting previously unselected package nordvpn.
Preparing to unpack .../nordvpn_3.7.3_armhf.deb ...
Unpacking nordvpn (3.7.3) ...
Setting up libxslt1.1:armhf (1.1.32-2.2~deb10u1) ...
Setting up libipset11:armhf (6.38-1.2) ...
Setting up ipset (6.38-1.2) ...
Setting up xsltproc (1.1.32-2.2~deb10u1) ...
Setting up nordvpn (3.7.3) ...
NordVPN for Linux successfully installed!
To get started, type 'nordvpn login' and enter your NordVPN account details. Then type 'nordvpn connect' and you’re all set! If you need help using the app, use the command 'nordvpn --help'.
Processing triggers for systemd (241-7~deb10u4+rpi1) ...
Processing triggers for man-db (2.8.5-2) ...
Processing triggers for libc-bin (2.28-10+rpi1) ...
pi@raspberrypi:~ $

Quand c'est installé, on peut voir que l'appli propose pas mal d'option en tapant juste la commande "nordvpn" :


pi@raspberrypi:~ $ nordvpn
Welcome to NordVPN Linux client app!
Version 3.7.3
Website: https://nordvpn.com

Usage: nordvpn [global options] command [command options] [arguments...]

Commands:
     account        Shows account information
     cities         Shows a list of cities where servers are available
     connect, c     Connects you to VPN
     countries      Shows a list of countries where servers are available
     disconnect, d  Disconnects you from VPN
     groups         Shows a list of available server groups
     login          Logs you in
     logout         Logs you out
     rate           Rate your last connection quality (1-5)
     register       Registers a new user account
     set, s         Sets a configuration option
     settings       Shows current settings
     status         Shows connection status
     whitelist      Adds or removes an option from a whitelist
     help, h        Shows a list of commands or help for one command

Global options:
   --help, -h     show help
   --version, -v  print the version

For more detailed information, please check manual page.

Our customer support works 24/7 so if you have any questions or issues, drop us a line at https://support.nordvpn.com/
pi@raspberrypi:~ $

3) Configuration de la connexion

On va donc pouvoir sauvegarder d'abord nos information de compte (login/password) avec la commande "nordvpn login" :
(sauvegardé dans le fichier /.config/nordvpn/nordvpn.conf)

pi@raspberrypi:~ $ nordvpn login
Please enter your login details.
Email / Username: email.bidon@gmail.com
Password:
Welcome to NordVPN! You can now connect to VPN by using 'nordvpn connect'.
pi@raspberrypi:~ $

4) Configuration du protocole pour utiliser NordLynx (basé sur WireGuard pour rappel) et pas OpenVPN


pi@raspberrypi:~ $ nordvpn set technology nordlynx
Technology is successfully set to 'NordLynx'.
pi@raspberrypi:~ $

4) Pour se connecter en 'France' et vérifier ensuite son l'IP

pi@raspberrypi:~ $ nordvpn connect fr
Connecting to France #587 (fr587.nordvpn.com)
You are connected to France #587 (fr587.nordvpn.com)!
pi@raspberrypi:~ $


pi@raspberrypi:~ $ wget  http://ipinfo.io/ip  -qO -
212.83.161.152
pi@raspberrypi:~ $

5) Un petit speed test en CLI au passage ;-)
(besoin d'installer des choses aussi ;-)


pi@raspberrypi:~ $ sudo apt-get install gnupg1 apt-transport-https dirmngr
Reading package lists... Done
Building dependency tree
Reading state information... Done
dirmngr is already the newest version (2.2.12-1+rpi1+deb10u1).
The following additional packages will be installed:
  gnupg1-l10n libcurl3-gnutls
Suggested packages:
  parcimonie xloadimage | imagemagick | eog
The following NEW packages will be installed:
  apt-transport-https gnupg1 gnupg1-l10n libcurl3-gnutls
0 upgraded, 4 newly installed, 0 to remove and 9 not upgraded.
Need to get 1,517 kB of archives.
After this operation, 5,553 kB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Get:1 http://mirrors.ircam.fr/pub/raspbian/raspbian buster/main armhf apt-transport-https all 1.8.2.1 [149 kB]
Get:2 http://mirrors.ircam.fr/pub/raspbian/raspbian buster/main armhf libcurl3-gnutls armhf 7.64.0-4+deb10u1 [292 kB]
Get:3 http://mirrors.ircam.fr/pub/raspbian/raspbian buster/main armhf gnupg1 armhf 1.4.23-1 [524 kB]
Get:4 http://mirrors.ircam.fr/pub/raspbian/raspbian buster/main armhf gnupg1-l10n all 1.4.23-1 [552 kB]
Fetched 1,517 kB in 2s (804 kB/s)
Selecting previously unselected package apt-transport-https.
(Reading database ... 40227 files and directories currently installed.)
Preparing to unpack .../apt-transport-https_1.8.2.1_all.deb ...
Unpacking apt-transport-https (1.8.2.1) ...
Selecting previously unselected package libcurl3-gnutls:armhf.
Preparing to unpack .../libcurl3-gnutls_7.64.0-4+deb10u1_armhf.deb ...
Unpacking libcurl3-gnutls:armhf (7.64.0-4+deb10u1) ...
Selecting previously unselected package gnupg1.
Preparing to unpack .../gnupg1_1.4.23-1_armhf.deb ...
Unpacking gnupg1 (1.4.23-1) ...
Selecting previously unselected package gnupg1-l10n.
Preparing to unpack .../gnupg1-l10n_1.4.23-1_all.deb ...
Unpacking gnupg1-l10n (1.4.23-1) ...
Setting up apt-transport-https (1.8.2.1) ...
Setting up gnupg1-l10n (1.4.23-1) ...
Setting up libcurl3-gnutls:armhf (7.64.0-4+deb10u1) ...
Setting up gnupg1 (1.4.23-1) ...
Processing triggers for install-info (6.5.0.dfsg.1-4+b1) ...
Processing triggers for libc-bin (2.28-10+rpi1) ...
Processing triggers for man-db (2.8.5-2) ...
pi@raspberrypi:~ $ export INSTALL_KEY=379CE192D401AB61
pi@raspberrypi:~ $ export DEB_DISTRO=$(lsb_release -sc)
pi@raspberrypi:~ $ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys $INSTALL_KEY
Executing: /tmp/apt-key-gpghome.l9IaWIYstj/gpg.1.sh --keyserver keyserver.ubuntu.com --recv-keys 379CE192D401AB61
gpg: key 379CE192D401AB61: public key "Bintray (by JFrog) <bintray@bintray.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1
pi@raspberrypi:~ $ echo "deb https://ookla.bintray.com/debian ${DEB_DISTRO} main" | sudo tee  /etc/apt/sources.list.d/speedtest.list
deb https://ookla.bintray.com/debian buster main
pi@raspberrypi:~ $ sudo apt-get update
Hit:1 http://raspbian.raspberrypi.org/raspbian buster InRelease
Hit:2 http://archive.raspberrypi.org/debian buster InRelease
Ign:3 https://ookla.bintray.com/debian buster InRelease
Get:4 https://ookla.bintray.com/debian buster Release [4,387 B]
Get:5 https://ookla.bintray.com/debian buster Release.gpg [821 B]
Hit:6 https://repo.nordvpn.com/deb/nordvpn/debian stable InRelease
Get:7 https://ookla.bintray.com/debian buster/main armhf Packages [398 B]
Fetched 5,606 B in 3s (1,816 B/s)
Reading package lists... Done
pi@raspberrypi:~ $ sudo apt-get install speedtest
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
  speedtest
0 upgraded, 1 newly installed, 0 to remove and 9 not upgraded.
Need to get 836 kB of archives.
After this operation, 1,891 kB of additional disk space will be used.
Get:1 https://ookla.bintray.com/debian buster/main armhf speedtest armhf 1.0.0.2-1.5ae238b [836 kB]
Fetched 836 kB in 1s (1,385 kB/s)
Selecting previously unselected package speedtest.
(Reading database ... 40304 files and directories currently installed.)
Preparing to unpack .../speedtest_1.0.0.2-1.5ae238b_armhf.deb ...
Unpacking speedtest (1.0.0.2-1.5ae238b) ...
Setting up speedtest (1.0.0.2-1.5ae238b) ...
Processing triggers for man-db (2.8.5-2) ...

Et pour lancer le test finalement:


pi@raspberrypi:~ $ speedtest
==============================================================================

You may only use this Speedtest software and information generated
from it for personal, non-commercial use, through a command line
interface on a personal computer. Your use of this software is subject
to the End User License Agreement, Terms of Use and Privacy Policy at
these URLs:

        https://www.speedtest.net/about/eula
        https://www.speedtest.net/about/terms
        https://www.speedtest.net/about/privacy

==============================================================================

Do you accept the license? [type YES to accept]: YES
License acceptance recorded. Continuing.

==============================================================================

Ookla collects certain data through Speedtest that may be considered
personally identifiable, such as your IP address, unique device
identifiers or location. Ookla believes it has a legitimate interest
to share this data with internet providers, hardware manufacturers and
industry regulators to help them understand and create a better and
faster internet. For further information including how the data may be
shared, where the data may be transferred and Ookla's contact details,
please see our Privacy Policy at:

       http://www.speedtest.net/privacy

==============================================================================

Do you accept the license? [type YES to accept]: YES
License acceptance recorded. Continuing.


   Speedtest by Ookla

     Server: ORANGE FRANCE - Paris (id = 24215)
        ISP: Dedibox SAS
    Latency:     8.98 ms   (0.80 ms jitter)
   Download:    19.58 Mbps (data used: 17.6 MB)
     Upload:     1.66 Mbps (data used: 1.8 MB)
Packet Loss:     0.7%
 Result URL: https://www.speedtest.net/result/c/9af7696b-a77b-4531-bd67-34d0c0446dc9

Résultat:

- Nordlynx: 19.59 Mbps en download / 1.64 Mbps en upload / 8.40 ms de ping
- OpenVPN: 19.15 Mbps en download / 1.61 Mbps en upload / 9.93 ms de ping

Franchement.. ce n'est pas vraiment différent voir pas du tout, déçu :-( !!! on verra en heure de pointe peut être que c'est différent !!!

6) Pour démarrer en auto comme un service pour les prochains démarrages (optionel parce que contraignant finalement!) :


pi@raspberrypi:~ $ nordvpn set autoconnect on fr
Auto-connect is set to 'enabled' successfully.


Attention, il y a un bug dans le deamon de NordVPN, l'autoconnect ne va rien faire finalement, il faut rajouter la ligne 'Wants=network-online.target' dans la section [Unit] du fichier /etc/systemd/system/nordvpnd.service ainsi:



Et il faudra aussi activer via "sudo raspi-config" la fonctionalité de wait network au boot :




Contrainte: l'autoconnect a ses limites, par exemple, si on laisse NordVPN se lancer sans modifier l'iptable dans la foulé, on n'a plus d'accès SSH, je comprends pourquoi pour des raisons de sécurité mais on ne peut plus administrer à distance, il faut clavier et ecran dispo pour le faire en local. C'est un choix à prendre, je ferais un article dans le futur pour faire autrement et pour avoir un pilotage par la domotique.

Edit 12/06/2020: Une des solutions consiste à autoriser le SSH via whitelist avec la commande suivante :

nordvpn whitelist add port 22

7) Attention pour le NAT... le nom de l'interface virtuel change :
(au lieu de tun0, c'est nordlynx maintenant comme vous pouvez le voir ci-après)


pi@raspberrypi:~ $ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.150  netmask 255.255.255.0  broadcast 192.168.0.255
        ether b8:27:eb:f1:e7:f9  txqueuelen 1000  (Ethernet)
        RX packets 17780  bytes 2084254 (1.9 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2675  bytes 1163905 (1.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

nordlynx: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1420
        inet 10.5.0.2  netmask 255.255.0.0  destination 10.5.0.2
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1  bytes 48 (48.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


8) Donc on active le NAT maintenant pour cet interface:

sudo iptables -t nat -A POSTROUTING -o nordlynx -j MASQUERADE

Et on redirige les traffics entrant/sortant dans cet interface de ce VPN::

sudo iptables -A FORWARD -i eth0 -o nordlynx -j ACCEPT

sudo iptables -A FORWARD -i nordlynx -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT

9) Pour finir on lance la commande pour sauvegarder la configuration et rendre cela permanent après reboot :
(si cela ne marche pas, vous n'avez pas fait le tuto précédent surement et installé ce qu'il faut ou vous n'êtes pas sur debian ou raspbian ;-)


sudo netfilter-persistent save

Et voilà c'est fini pour utiliser la technologie NordLynx !

Enjoy !!!

P.S: pendant mes manipulations j'ai fait des erreurs, si besoin il faudra faire un cleaning de l'iptable avec ces commandes avant de la refaire:


sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X
sudo iptables -t mangle -F
sudo iptables -t mangle -X
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT

mercredi 3 juin 2020

Sécurité: Se protéger du "boot" sur nos XBOX one !

En fait, depuis plusieurs mois, on se fait "boot" à cause du fait que les IPs sont révélés dans les groupes XBOX quand on est en ligne sur le XBOX live (Apparement sur PS4, il n'y a pas le problème). Les "booteurs" sont des tricheurs qui pour faire perdre ses opposants piquent votre IP internet quand vous lui parler ou échangé en chat sur un même groupe (souvent c'est un ancien équipier qui garde votre IP pour s'en servir contre vous plus tard... pas cool du tout !!!)
Le principe du Boot est d'envoyer une attaque DDOS à votre intention :-( pour vous empêcher de jouer et donc de perdre la partie !!! Des services existent sur internet et plutôt payant.
Le principe de l'attaque DDOS (Distributed Denial of Service) est  d'envoyer pleins de requêtes avec plusieurs machines pour saturer la connexion de l'IP en question.
Et manque de bol, nous sommes chez Free à la maison, et avec eux, si on se fait "boot" même 5 minutes, et bien plus de connexion pendant 2h... et ils disent ne rien pouvoir faire pour cela.

Donc on a décider de se protéger :

1) On va changer d'opérateur 
Pour avoir une IP dynamique ou du moins pouvoir la changer si besoin (Apparement c'est surtout chez Orange ou Sosh que l'on peut le faire sur une connection ADSL/VSDL... je n'ai pas encore la fibre dans ma rue :-(

2) On va aussi utiliser un VPN pour cacher notre IP !
Le problème sur XBOX... pas de client VPN ni de conf VPN directement possible sur la box...
Donc la possibilité est de le mettre au niveau de la box internet ou d'un routeur Wifi (J'ai un firmware DD-WRT dans mon routeur Wifi donc c'est possible)... mais je me suis dis c'est dommage de mettre cela dans le routeur parce que toutes les connexions Wifi dans ce cas devront passer par le VPN donc je me suis dis que cela serait mieux de pouvoir choisir et que cela soit possible de le faire pour chaques appareils sur le réseau (wifi ou pas).

Donc j'ai opter pour le faire avec un Raspberry Pi :
Inconvénients:
- Pas simple à configurer, c'est pour cela qu'aujourd'hui je fais ce tuto pour vous (et pour moi si je dois le refaire ;-)
- Besoin de mettre un raspberry pi en place (dédié de préférence pour des raisons de maintenance)
- Besoin de lui trouver une place sur le réseau avec une connection etthernet de préférence.
- Passer en IP fixe les devices concernés et sans DHCP pour éviter des confs complexes du routeurs Wifi !

Avantages:
- Reste valide même si je change d'opérateur ou de routeur wifi.
- Consommation limité (je vais prendre un pi 2 dans mon cas)
- Coût limité
- juste besoin de changer de "gateway" dans les appareils qui voudront l'utiliser !

Donc voici comment mettre un raspberry pi en gateway VPN:

Pré-requis:

1) J'ai pris un compte chez NordVPN https://nordvpn.com/fr/ (j'ai pris une offre de 3 ans pour réduire le cout par mois)
On aura besoin du login/password du compte VPN par la suite.

2) J'ai pris un raspberry pi2, un boitier, un alim 5V/2A AUKRU et une microSD 4Go (suffisant et que j'avais en stock ;-)

3) Un OS Raspbian en version Lite, le dernier en date que l'on trouve ici: https://www.raspberrypi.org/downloads/raspberry-pi-os/

4) Un soft pour flasher la microSD: https://www.balena.io/etcher/

5) un PC pour faire la manip bien sur sur Windows ou Linux (dans mon cas je suis sur Windows 10)

Installation du pi et de son OS:

1) Installation de l'OS sur la microSD avec Etcher :
Rien de compliqué, on sélectionne l'image de l'OS, on sélection la microSD et on flash !!!

2) on active le SSH juste après le flashage (on eject puis réinsert la microSD (avec ou sans son adaptateur SD ;-) dans le PC pour pouvoir voir la partition "boot")
Puis on créé un fichier "ssh" à sa racine:


3) On insert ensuite la microSd dans le pi, on l'allume en branchant l'alim sur le microUSB et le SSH s'active comme on le voit ci-après, j'ai mis un écran pour voir le démarrage - désolé la photo a des reflet :-(.

https://drive.google.com/uc?export=view&id=1pjWdbDiseamxHeZxmYnLbbzpjhHYqDm7


Installation du VPN :


1) Pour connaitre l'IP du pi fourni par mon DHCP, dans mon cas, elle est visible au démarrage comme dans le précdent screenshot en fait ;-), mais il faudra peut être faire un second boot (dans mon cas, j'ai pu l'avoir au deuxième boot du pi finalement)

https://drive.google.com/uc?export=view&id=10Z8IdX0MfCXUvIqkXq4N4WyuT5yjmNHC

Donc 192.168.0.150.... il faudra penser à la rendre fixe dans votre DHCP (mettre en IP fixe sur le raspberry pi directement je ne suis pas un adepte, je préfère le faire via un DCHP (celui de mon routeur wifi dans mon cas), cela permet de modifier facilement la gateway et/ou les dns en cas de besoin de changement de box internet par exemple sans être obliger de changer dans chaque appareil du réseau)

2) Je m'y connecte en SSH en utilisant mobaXterm que je kiff trop en ce moment ;-) : https://mobaxterm.mobatek.net/
On peut avoir plusieurs session ouvert et en plus on browse les fichiers en même temps, j'adore.


 Password à saisir ci-après : raspberry 

(comme d'hab, il faudra changer votre password par défaut avec la command
passwd)




3) On peut aussi passer les commandes d'update comme d'hab :
(pas besoin de resize de la partition system, c'est fait par l'OS lui même au premier boot maintenant)

sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade

4) On va devoir installer openVPN
(je propose d'avoir le VPN comme un service et pas une app comme proposé ici par NordVPN: https://support.nordvpn.com/FAQ/Setup-tutorials/1182453582/Installing-and-using-NordVPN-on-Linux.htm, pourquoi ? parce que je veux pouvoir arrêter, changer de server, etc... à distance avec ma domotique dans un second temps surement)

sudo apt-get install openvpn

5) Puis dans mon cas, pour NordVPN, télécharger une partie de la configuration comme expliqué ici : https://support.nordvpn.com/Connectivity/Linux/1047409422/How-can-I-connect-to-NordVPN-using-Linux-Terminal.htm

On télécharge et installe les confs de tous les serveurs ainsi:
cd /etc/openvpn
sudo wget https://downloads.nordcdn.com/configs/archives/servers/ovpn.zip
sudo unzip ovpn.zip
sudo rm ovpn.zip

Puis via cette page dans le cas de NordVPN, j'ai choisi le serveur conseillé : https://nordvpn.com/fr/servers/tools/


Puis on lance la commande en ligne suivante pour tester:

sudo openvpn /etc/openvpn/ovpn_udp/fr514.nordvpn.com.udp.ovpn

Cela va demander le login/password de NordVPN, et on doit avoir un écran comme cela qui fini sur "Completed":

pi@raspberrypi:/ $ sudo openvpn /etc/openvpn/ovpn_udp/fr514.nordvpn.com.udp.ovpn
Wed Jun  3 19:24:14 2020 OpenVPN 2.4.7 arm-unknown-linux-gnueabihf [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Feb 20 2019
Wed Jun  3 19:24:14 2020 library versions: OpenSSL 1.1.1d  10 Sep 2019, LZO 2.10
Enter Auth Username: emailbidon@gmail.com
Enter Auth Password: **********
Wed Jun  3 19:24:56 2020 WARNING: --ping should normally be used with --ping-restart or --ping-exit
Wed Jun  3 19:24:56 2020 Outgoing Control Channel Authentication: Using 512 bit message hash 'SHA512' for HMAC authentication
Wed Jun  3 19:24:56 2020 Incoming Control Channel Authentication: Using 512 bit message hash 'SHA512' for HMAC authentication
Wed Jun  3 19:24:56 2020 TCP/UDP: Preserving recently used remote address: [AF_INET]212.129.34.54:1194
Wed Jun  3 19:24:56 2020 Socket Buffers: R=[163840->163840] S=[163840->163840]
Wed Jun  3 19:24:56 2020 UDP link local: (not bound)
Wed Jun  3 19:24:56 2020 UDP link remote: [AF_INET]212.129.34.54:1194
Wed Jun  3 19:24:56 2020 TLS: Initial packet from [AF_INET]212.129.34.54:1194, sid=20321615 983068ef
Wed Jun  3 19:24:56 2020 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
Wed Jun  3 19:24:56 2020 VERIFY OK: depth=2, C=PA, O=NordVPN, CN=NordVPN Root CA
Wed Jun  3 19:24:56 2020 VERIFY OK: depth=1, C=PA, O=NordVPN, CN=NordVPN CA4
Wed Jun  3 19:24:56 2020 VERIFY KU OK
Wed Jun  3 19:24:56 2020 Validating certificate extended key usage
Wed Jun  3 19:24:56 2020 ++ Certificate has EKU (str) TLS Web Server Authentication, expects TLS Web Server Authentication
Wed Jun  3 19:24:56 2020 VERIFY EKU OK
Wed Jun  3 19:24:56 2020 VERIFY OK: depth=0, CN=fr514.nordvpn.com
Wed Jun  3 19:24:56 2020 Control Channel: TLSv1.2, cipher TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384, 4096 bit RSA
Wed Jun  3 19:24:56 2020 [fr514.nordvpn.com] Peer Connection Initiated with [AF_INET]212.129.34.54:1194
Wed Jun  3 19:24:57 2020 SENT CONTROL [fr514.nordvpn.com]: 'PUSH_REQUEST' (status=1)
Wed Jun  3 19:24:57 2020 PUSH: Received control message: 'PUSH_REPLY,redirect-gateway def1,dhcp-option DNS 103.86.96.100,dhcp-option DNS 103.86.99.100,sndbuf 524288,rcvbuf 524288,explicit-exit-notify,comp-lzo no,route-gateway 10.8.0.1,topology subnet,ping 60,ping-restart 180,ifconfig 10.8.0.7 255.255.255.0,peer-id 2,cipher AES-256-GCM'
Wed Jun  3 19:24:57 2020 OPTIONS IMPORT: timers and/or timeouts modified
Wed Jun  3 19:24:57 2020 OPTIONS IMPORT: explicit notify parm(s) modified
Wed Jun  3 19:24:57 2020 OPTIONS IMPORT: compression parms modified
Wed Jun  3 19:24:57 2020 OPTIONS IMPORT: --sndbuf/--rcvbuf options modified
Wed Jun  3 19:24:57 2020 Socket Buffers: R=[163840->327680] S=[163840->327680]
Wed Jun  3 19:24:57 2020 OPTIONS IMPORT: --ifconfig/up options modified
Wed Jun  3 19:24:57 2020 OPTIONS IMPORT: route options modified
Wed Jun  3 19:24:57 2020 OPTIONS IMPORT: route-related options modified
Wed Jun  3 19:24:57 2020 OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified
Wed Jun  3 19:24:57 2020 OPTIONS IMPORT: peer-id set
Wed Jun  3 19:24:57 2020 OPTIONS IMPORT: adjusting link_mtu to 1657
Wed Jun  3 19:24:57 2020 OPTIONS IMPORT: data channel crypto options modified
Wed Jun  3 19:24:57 2020 Data Channel: using negotiated cipher 'AES-256-GCM'
Wed Jun  3 19:24:57 2020 Outgoing Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key
Wed Jun  3 19:24:57 2020 Incoming Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key
Wed Jun  3 19:24:57 2020 ROUTE_GATEWAY 192.168.0.254/255.255.255.0 IFACE=eth0 HWADDR=b8:27:eb:f1:e7:f9
Wed Jun  3 19:24:57 2020 TUN/TAP device tun0 opened
Wed Jun  3 19:24:57 2020 TUN/TAP TX queue length set to 100
Wed Jun  3 19:24:57 2020 /sbin/ip link set dev tun0 up mtu 1500
Wed Jun  3 19:24:57 2020 /sbin/ip addr add dev tun0 10.8.0.7/24 broadcast 10.8.0.255
Wed Jun  3 19:24:57 2020 /sbin/ip route add 212.129.34.54/32 via 192.168.0.254
Wed Jun  3 19:24:57 2020 /sbin/ip route add 0.0.0.0/1 via 10.8.0.1
Wed Jun  3 19:24:57 2020 /sbin/ip route add 128.0.0.0/1 via 10.8.0.1
Wed Jun  3 19:24:57 2020 Initialization Sequence Completed

Et pour sortir, il faudra faire CTRL+C

^CWed Jun  3 19:26:30 2020 event_wait : Interrupted system call (code=4)
Wed Jun  3 19:26:30 2020 SIGTERM received, sending exit notification to peer
Wed Jun  3 19:26:31 2020 /sbin/ip route del 212.129.34.54/32
Wed Jun  3 19:26:31 2020 /sbin/ip route del 0.0.0.0/1
Wed Jun  3 19:26:31 2020 /sbin/ip route del 128.0.0.0/1
Wed Jun  3 19:26:31 2020 Closing TUN/TAP interface
Wed Jun  3 19:26:31 2020 /sbin/ip addr del dev tun0 10.8.0.7/24
Wed Jun  3 19:26:31 2020 SIGTERM[soft,exit-with-notification] received, process exiting
pi@raspberrypi:/ $

6) Maintenant pour l'utiliser tout le temps en tant que Gateway Internet, il va falloir mettre le VPN en mode service !

Pour cela, on va faire en sorte que la conf de NordVPN soit lancable en mode service avec les credentials déjà configuré.

il faut déjà sauvegarder son login et mot de passe dans un fichier:

sudo nano /etc/openvpn/nordvpn_auth.txt

ainsi :


Et on change ses droits au passage:
chmod 600 /etc/openvpn/nordvpn_auth.txt

Puis on renomme le fichier de configuration du serveur qui nous intéresse en fichier "client.conf" pouvoir le lancer dans un service et on le met dans /etc/openvpn/ :
sudo mv /etc/openvpn/ovpn_udp/fr514.nordvpn.com.udp.ovpn /etc/openvpn/client.conf

Et on va donc aussi modifier le fichier .conf pour demander l'utilisation du fichier nordvpn_auth.txt

sudo nano /etc/openvpn/client.conf

pour changer la ligne contenant "auth-user-pass" par "auth-user-pass /etc/openvpn/nordvpn_auth.txt"

On va ensuite activer OpenVPN en mode service avant de la lancer (ou le relancer):

sudo systemctl enable openvpn


sudo service openvpn restart

Puis on lance et test:

pi@raspberrypi:/etc/openvpn $ wget  http://ipinfo.io/ip  -qO -
201.141.12.25

Installation du routage et du firewall :


1) On active l'IP forwarding

sudo /bin/su -c "echo -e '\n#Enable IP Routing\nnet.ipv4.ip_forward = 1' > /etc/sysctl.conf"

Et on doit avoir ce résultat suite à la commande suivante pour vérifier le bon fonctionnement:


pi@raspberrypi:/etc/openvpn $  sudo sysctl -p
net.ipv4.ip_forward = 1

2) On active le NAT

sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

3) Et on redirige les traffics entrant/sortant dans le VPN

sudo iptables -A FORWARD -i eth0 -o tun0 -j ACCEPT


sudo iptables -A FORWARD -i tun0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT

4) On configure aussi les flux locaux, le ping et le SSH pour les PCs internes

sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -i eth0 -p icmp -j ACCEPT
sudo iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -P FORWARD DROP
sudo iptables -P INPUT DROP

Et pour contrôler les modifications:


pi@raspberrypi:/etc/openvpn $ sudo iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED

Chain FORWARD (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

5) Et pour finir on lance ces 2 commands pour sauvegarder la configuration et rendre cela permanent après reboot:

sudo apt-get install iptables-persistent
sudo systemctl enable netfilter-persistent

Configuration de la XBOX One (désolé pour la qualité des screenshots :-( ):

1) on va dans les paramètres réseaux puis avancés de la console donc:



2) On va se mettre en config statique pour le IPs et donc pouvoir mettre la gateway VPN en tant que passerelle




J'ai pas mis tout les écrans, mais il va falloir mettre votre IP (que vous aviez avant surement fixé par le DHCP) + le masque sous réseau (mettre  255.255.255.0 en général) + la passerelle (mettre l'IP de votre raspberry pi) + le premier/second DNS (dans mon cas j'ai mis l'IP de mon raspberry pi pour le premier et rien pour le second)
Ensuite cela lance un test à la fin de la conf pour confirmé que l'on est bien connecté sur internet.


3) On voit aussi que l'on est en double NAT maintenant dans les détails de la connection.


4) et un petit test de performance pour finir


Et voilà, pas simple mais pas si compliqué... maintenant, on pourra changer d'IP via le VPN ;-)... merci d'avance pour vos retours. Dans un prochain article, je vous exposerais comment interagir avec ce VPN à partir de la domotique et qu'est ce que Jeedom m'apporte facilement dans ce cas.

Enjoy !

samedi 29 décembre 2018

Domotique: XBOX API & scripts dans Jeedom

En fait, j'ai eu besoin de pouvoir faire des statistiques sur les jeux et l'utilisation des consoles par mes enfants. Finalement, j'ai jamais vraiment utilisé cela pour les surveiller mais plus pour le challenge de voir si une api existait pour cela... et je suis tombé sur cela qui n'est pas une API officiel mais qui m'a satisfait pour mes besoins : https://xboxapi.com/


...qui marche sur xbox one mais je pense aussi sur xbox 360 ou pc si vous avez un compte xbox live ! (je vous laisse tester ces cas mais j'ai testé que sur xbox one et avec plusieurs comptes ;-)

En fait, cette API est gratuite et si votre utilisation est limité à 60 requêtes par heure et par compte xbox live par compte (je crois ;-). Pour l'instant, je n'ai pu associé qu'un seul compte xbox live par compte xbox API. 

Il faut créer un compte sur ce site et y lier votre comptre xbox live, il faudra y récupérer 2 infos, le "XBOX Profile User ID" et  le "XboxAPI API Key" comme on peut le voir sur un de mes comptes :



Ensuite, on va pouvoir utiliser des scripts pour récupérer des infos de l'API, j'ai essayé de faire un script générique (plus ou moins ;-) et donc avec en passage de paramètre comme la clé et le profile, et aussi dans certains cas, je rajoute l'info que je cherche dans le résultat de l'API, je vous expliquerais plus loin le principe.

Donc on peut passer sur Jeedom dès lors que le compte est créé, lié au xbox live account et que l'on a la clé et le profile....

Voici donc le script en perl pour cette fois (me demandez pas pourquoi ;-) :


#!/usr/bin/perl -s
use LWP::UserAgent;
use Net::Ping;
use JSON qw( decode_json ); # need to install json parsing library using this command: sudo apt-get install libjson-pp-perl

no warnings 'uninitialized';

#HTTP example command
#https://xboxapi.com/v2/profile
#https://xboxapi.com/v2/{xuid}/presence
#see more command from here: https://xboxapi.com/documentation

$ua=LWP::UserAgent->new; $ua->timeout(5);

if ($h==1 or (not defined $k) or (not defined $c) or (not defined $t))
{
  print("
  Script to use with https://xboxapi.com
  
  Need to install json parsing library using this command: sudo apt-get install libjson-pp-perl
  
  Parameters are: 
  -h for help 
  -k= (Mandatory)
  -c= (Mandatory)
  -t= (Mandatory)
  -p= (Optional but requested for some commands)
  
  #HTTP example command from XBOXAPI
  #https://xboxapi.com/v2/profile
  #https://xboxapi.com/v2/{xuid}/presence
  #see more command from here: https://xboxapi.com/documentation
  ");
}
else
{  
      #print("XBOX API Key=$k\n");
      #print("command=$c\n");
      
      if (defined $p)
      { 
        #print("XBOX profile User ID=$p\n");
        #X-AUTH token to get from your account of XBOXAPI, you need to have/create account from https://xboxapi.com
        $res=$ua->get("https://xboxapi.com/v2/$p/$c",'X-AUTH' => $k);
      }
      else
      {
        #X-AUTH token to get from your account of XBOXAPI, you need to have/create account from https://xboxapi.com
        $res=$ua->get("https://xboxapi.com/v2/$c",'X-AUTH' => $k);
      }

        unless ($res->is_success) { warn $res->status_line };

      #json parsing
      $decoded = decode_json($res->content);
      
      #print("tag to parse=$t\n");
      if((substr $t, 0, 1) ne '{')
      {
         #try to add { and } to help parsing of the string if missing
         $t = '{'.$t.'}';        
      }
      my $cmd = '$result = $decoded->'. $t. ';';
      eval "$cmd";
      print $result;
}

Et comme vous pouvez le voir dans les codes et les commentaires, il faudra bien s'assurer d'avoir installé la dépendance suivante et de cette manière : "sudo apt-get install libjson-pp-perl" pour gérer au mieux le JSON que l'on doit parser et venant de XBOXAPI.COM.

Dans jeedom, il faut juste créer un script "info" perl avec le code que j'ai donné (dans mon cas, j'ai appelé le script "xboxapi.perl", voici un screenshot où j'ai juste viré ma clé et mon id de profil bien sur ;-)



Il y a différents paramètres mais voici des exemples d'appel de ce script qui parlerons d'eux mêmes.

Pour savoir si le compte xbox live est "Online" ou pas : 

xboxapi.perl -k="votre API key" -p="votre profile id" -c=presence -t=state

Pour connaitre le gamerTag du profil : 

xboxapi.perl -k="votre API key" -c=profile -t=gamerTag

Pour savoir quel est le jeu en cours ou si on se trouve dans le menu de la xbox : 

xboxapi.perl -k="votre API key" -p="votre profile id" c=presence -t={devices}[0]{titles}[1]{name}

Pour connaitre le status du jeu (Dans Fortnite, vous aurez le nombre de gens restant sur la map par exemple ;-) : 

xboxapi.perl -k="votre API key" -p="votre profile id" -c=presence -t={devices}[0]{titles}[1]{activity}{richPresence}

Si vous voulez parser d'autres infos, il faudra aller voir la doc ou appeler l'API en direct et regarder ce que l'on trouve dans le JSON renvoyé.

Voici un exemple de JSON suite à une commande "presence" (j'ai mis des X pour les ids que je ne veux pas révéler):


{"xuid":XXXXXXXXXXXXXXXX,"state":"Online","devices":[{"type":"XboxOne","titles":[{"id":XXXXXXXX,"name":"Accueil","placement":"Background","state":"Active","lastModified":"2018-12-29T16:57:30.7121865Z"},{"id":XXXXXXXXXXX,"activity":{"richPresence":"CLASS\u00c9 - Manche 6\/6 (d\u00e9cisive)"},"name":"Tom Clancy's Rainbow Six Siege","placement":"Full","state":"Active","lastModified":"2018-12-29T16:57:30.7121865Z"}]}],"cloaked":true}


Conclusion:

Voilà, jespère que cela aidera certains à jouer avec cette API bien sympa et qui permet d'intégrer un peu plus encore nos consoles de jeu ;-)

On pouvait déjà utiliser l'UPNP/DLNA pour savoir si les consoles sont allumées (un simple PING ne marchait pas toujours :-( ) mais avec ce script et cette API, on peut avoir plus d'info... On pourrait imaginer faire un contrôle parental avec nos boxes domotiques en Jeedom ou autre utilisant des scripts perl.

Enjoy !!!