Bonjour,
Suite à pas mal de posts traitants de conenction VPN a partir d'un Syno, j'ai remarqué que presque personne ne se soucie de l'aspect sécurité.
Lorsque le NAS passe par un tunnel VPN en vue d'être anonyme sur internet, le fait d'avoir une IP publique vous expose complètement. La sécurité apportée par un routeur/box/... est innefficace car le NAS est connecté et visible directement sur internet, un peu comme si le cable réseau du syno était publique.
Le DSM (4.1 dans mon cas) propose une interface pour configurer le firewall mais celle çi ne reprends pas l'interface virtuelle créée lors de l'établissement du tunnel VPN. Il n'est donc pas possible d'appliquer des règles pour bloquer les ports ouverts sur votre NAS et son interface VPN.
Lorsque vous avez une connection VPN fonctionnelle (PPTP ou openVPN) il est possible d'appliquer manuellement des règles pour filtrer les connections vers votre NAS. Le problème est que ces règles disparaissent lorsque le VPN est déconnecté ou qu'il est reconnecté automatiquement après une interruption.
Pour éviter de devoir scruter manuellement la présence des filtres, j'ai fais un script qui vérifiera toutes les minutes si le VPN est connecté et si oui, si les filtres sont présent. Si les filtres ne sont pas présent, il jouera les commandes nécessaires pour créer les filtres.
Cron (planificateur de tâches Unix/Linux) se chargera d'exécuter le script à intervalles réguliers.
Pour suivre ce tuto vous devez avoir au minimum les connaissances de base linux. Toute la marche à suivre est à exécuter en tant que root. Je tiens quand même à vous avertir que si vous ne comprenez rien à ce qui est dit, il est risqué d'aller plus loin.
le script doit être accessible dans l'arborescence de votre syno (par exemple dans /usr/local/scripts/ ) et exécutable (chmod +x lenomduscript.sh )
Le script est le suivant:
EDIT du 21/01/2013: La ligne iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT doit être ajoutée sinon (entre autre) l'update DDNS ne pourra se faire (cette ligne autorise les packets qui font partie d'une session déjà ouverte, dans ce cas par le client DDNS qui dois connaître son IP publique).
#!/bin/ash
####################################################################
# This script coverts the lack of security when machine is fully #
# exposed on its public IP address once connected to a VPN. #
# It is designed to work on Synology NAS running DSM 4.1 but #
# general linux rules apply, it should be usefull for other #
# purpose. #
# e-raw [@] e-raw.be #
####################################################################
# Local settings definition #
#
#iptables binary path
iptables="/sbin/iptables"
#VPN interface
#Should be tun0 for openVPN instance and ppp0 for PPTP
interface="tun0"
#
# Test if VPN is up and iptables rules have been defined yet #
#
if [ -n "$(ifconfig | grep "$interface")" ] && [ -z "$($iptables -L -v | grep "$interface")" ]; then
#Incoming connections ACCEPT on the VPN interface #
$iptables -A INPUT -i $interface -p tcp --destination-port 22 -j ACCEPT
#[...]
$iptables -A INPUT -i $interface -p tcp --destination-port 5001 -j ACCEPT
##EDIT: Mandatory to allow DDNS client to resolve it own public address:
$iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#if none of the rules were matched DROP #
$iptables -A INPUT -i $interface -p tcp -j DROP
$iptables -A INPUT -i $interface -p udp -j DROP
$iptables -A INPUT -i $interface -p icmp -j DROP
fi
exit 0;
Deux choses sont à adapter a vos besoins:
Le type de VPN
L'interface virtuelle créée lors de la connection est tun0 dans le cas d'openVPN et ppp0 dans le cas du PPTP
Les ports à ouvrir
Ceux çi doivent être l'équivalent de ce que vous avez routé sur votre box pour pouvoir y avoir accès de l'extérieur. faites attentions au protocole (udp/tcp) ainsi qu'au port (en rouge)
Une fois le script modifié et exécutable, connectez-vous au VPN. Vous pourrez vérifier que il n'y a aucun filtre avec la commande iptables -L -v
Lancez le script manuellement une première fois et rejouez la commande iptables -L -v
Les filtres sont désormai appliqués et visibles.
Pour rendre le tout automatique, il faut utiliser crontab. Dans mon cas, le script est exécuté toute les minutes. Il y aura donc maximum une minute ou le NAS sera exposé lors de chque reboot/reconnection.
Sur le syno, les entrées du cron se trouvent dans le crontab dans /etc/crontab:
DiskStation> cat /etc/crontab
#minute hour mday month wday who command
32 18 * * 2,5 root /usr/syno/bin/synopkg chkupgradepkg
0 4 * * 1 root /var/packages/AntiVirus/target/bin/synoavscan --all
* * * * * root /usr/local/scripts/vpn_iptables.sh
Chaque ligne représente une tache planifiée. On remarque ici que vpn_iptables.sh (le script en question) est exécuté toute les minutes. Les autres lignes ne doivent pas être touchées!
Ajoutez à l'aide de vi par exemple la ligne en rouge correspondant à votre script. Redémarrez crond avec les commandes :
/usr/syno/etc.defaults/rc.d/S04crond.sh stop
/usr/syno/etc.defaults/rc.d/S04crond.sh start
Pour vérifier que votre script fonctionne bien, vous pouvez vider les règles de filtres avec la commande iptables -F ce qui aura le même effet qu'une nouvelle (re)connection.
Après maximum une minute (suivant l'intervalle que vous avez configuré dans cron) les filtres devraient réapparaitre, à vérifier avec iptables -L -v
J'espère que ça en aidera quelques uns!