Skip to content

Instantly share code, notes, and snippets.

@ThomasGsp
Last active December 14, 2015 13:08
Show Gist options
  • Save ThomasGsp/5090774 to your computer and use it in GitHub Desktop.
Save ThomasGsp/5090774 to your computer and use it in GitHub Desktop.
#!/bin/bash
# Auteur : Tlams
# Date : 13/02/13
# Script description : Permet de monter un serveur OPENVPN de façon guidé !
############# Liste des fonctions:###############
## Menu: Permet d'afficher le menu de choix
## downloadopenvpn: Permet de télécharger OpenVPN
## config_openvpn: Configuration de OPENVPN
## conf_var: Permet de modifier les variables du fichier "var" afin d'avoir certaines configurations prè-enregistrés lors de la création d'un certificat.
## cree_files_server: Génère les fichiers de base du serveur (Certif,key,dh...)
## creer_client: Permet de créer un client OpenVPN (Génère Key et crt)
## revoke_user: Permet de bloquer un utilisateur
## creerfichieropenvpn: Permet de générer un fichier de configuration openvpn directement utilisable.
## installpureftp: Permet d'installer un serveur FTP pour récupérer les fichiers des clients facilement.
## ftp_creer_user: Creer un utilisateur pour le serveur FTP
## ftp_modif_pw: Permet de modifier le mot de passe d'un utilisateur FTP
## transfertfichier_client: Permet de transférer (copier) les fichiers clients d'openvpn sur le dossier de l'utilisateur FTP.
## choplip: Permet de récupérer automatiquement l'adresse IP publique du serveur
## validationIP: Permet de valider une adresse IP rentré par un utilisateur.
## connexiontest: Test permettant de déterminer si une connexion internet est présente, pour le téléchargement des paquets.
## config_firewall: Créer un fichier de configuration (firewall) qui applique les régles des bases du pare feu.
## reboot: Permet de redémarrer le serveur
## mailto: permet d'envoyer un email
## genere_fichier_var_ini: Permet de créer le fichier qui sauvegarde les configurations
## write_ini: Modifie les variables de config
#################################################
# Voir ajout GZ L 487/665
menu()
{
echo "********************"
echo "********MENU********"
echo "********************"
echo "1/ Installation d'OpenVPN"
echo "2/ Modification-Correction de paramettres"
#echo "3/ Documentation"
echo "4/ Quitter"
read Choix
case "$Choix" in
1 )
connexiontest
echo "***************************"
echo "**Installation de OPENVPN**"
echo "***************************"
echo -e "\033[33m
Près-requis:
- Une connexion internet " $internet "
- Connaitre son ip publique (Taper: ipconfig)
- Connaitre le nom de sa carte réseau connecté au routeur fournissant une connexion internet (Taper: ipconfig)
- Connaitre le nom de son server (Taper: hostname)
\033[0m"
if [ "$internet_result" = "FALSE" ]; then
echo "Aucune connexion internet n'a été trouvé !"
echo "Il faut corriger ce problème avant de pouvoir aller plus loin"
echo "Arret du script"
exit 0
fi
st_install_g=""
while [ "$st_install_g" != "y" ] && [ "$st_install_g" != "Y" ] && [ "$st_install_g" != "N" ] && [ "$st_install_g" != "n" ]
do
echo -n -e "\033[1mVoulez-vous lancer l'installation maintenant? (Y/N): \033[0m"
read st_install_g
done
if [ "$st_install_g" = "y" ] || [ "$st_install_g" = "Y" ]; then
source /etc/openvpn/conf.ini
re_install_g=""
Continuer=1
dpkg -l "openvpn" > /dev/null 2>&1
INSTALLEDOPENVPN=$?
if [ $INSTALLEDOPENVPN == '0' ]; then
while [ "$re_install_g" != "y" ] && [ "$re_install_g" != "Y" ] && [ "$re_install_g" != "N" ] && [ "$re_install_g" != "n" ]
do
echo -e "\033[33Il semblerait qu'une installation soit déjà présente, il n'est pas conseillé de re-installer par dessus ! \033[0m"
echo -e -n "\033[1mVoulez-vous lancer l'installation maintenant? (Y/N): \033[0m"
read re_install_g
done
if [ "$re_install_g" = "N" ] && [ "$re_install_g" = "n" ]; then
Continuer=0
fi
fi
if [ "$Continuer" = 1 ]; then
downloadopenvpn
conf_var
config_openvpn
cree_files_server
creer_client
creerfichieropenvpn
mailto
installpureftp
if [ "$v_ftp_install" = 1 ]; then
ftp_creer_user
fi
config_firewall
/etc/init.d/openvpn restart
echo "Installation du serveur OPENVPN terminé."
echo "Rappels:"
echo "Emplacement des fichiers clients: //etc/openvpn/easy-rsa/2.0/keys/clients/"
echo "Connexion sftp: sftp://root@"$v_sys_publicIP
if [ "$v_ftp_install" = 1 ]; then
echo "Connexion ftp - User:"$v_ftp_user" / IP:" $MONIP
fi
else
echo "Installation annulé ! Retour au menu"
menu
fi
elif [ "$st_install_g" = "n" ] || [ "$st_install_g" = "N" ]; then
echo "Installation annulé ! Retour au menu"
menu
fi
;;
2 )
dpkg -l "openvpn" > /dev/null 2>&1
INSTALLEDOPENVPN=$?
if [ $INSTALLEDOPENVPN != '0' ]; then
echo "Aucune installation d'openvpn détecté! Certaines fonctions ne seront pas correctement fonctionnelles"
fi
echo " 1/ Modifier le certificat"
echo " 2/ Ajouter un client."
echo " 3/ Supprimer un client."
echo " 4/ Modifier le mot de passe utilisateur FTP."
echo " 5/ Modifier la configuration du pare-feu."
echo " 6/ Modifier la configuration d'OPENVPN."
echo " 7/ Mettre à jour les fichiers clients sur le serveur FTP"
echo " 0/ Retour menu"
read modifcorrect
case "$modifcorrect" in
0 )
menu
;;
1 )
source /etc/openvpn/conf.ini
v_modif_certif=""
while [ "$v_modif_certif" != "y" ] && [ "$v_modif_certif" != "Y" ] && [ "$v_modif_certif" != "N" ] && [ "$v_modif_certif" != "n" ]
do
echo "Si vous modifiez le certificat, TOUS vos clients actuels seront invalides ! Continuer?(Y/N) "
read v_modif_certif
done
if [ "$v_modif_certif" = "y" ] || [ "$v_modif_certif" = "Y" ]; then
conf_var
cree_files_server
else
echo "Opération annulé"
fi
menu
;;
2 )
source /etc/openvpn/conf.ini
creer_client
creerfichieropenvpn
mailto
if [ "$v_ftp_install" = 1 ] ; then
transfertfichier_client
fi
menu;;
3 ) revoke_user
menu;;
4 )
source /etc/openvpn/conf.ini
ftp_modif_pw
menu;;
5 )
source /etc/openvpn/conf.ini
config_firewall
menu;;
6 )
v_modif_openvpn=""
while [ "$v_modif_openvpn" != "y" ] && [ "$v_modif_openvpn" != "Y" ] && [ "$v_modif_openvpn" != "N" ] && [ "$v_modif_openvpn" != "n" ]
do
echo "Si vous modifiez le certificat, TOUS vos clients actuels seront invalides ! Continuer?(Y/N) "
read v_modif_openvpn
done
if [ "$v_modif_openvpn" = "y" ] || [ "$v_modif_openvpn" = "Y" ]; then
config_openvpn
else
echo "Opération annulé"
fi
menu;;
7 )
source /etc/openvpn/conf.ini
transfertfichier_client
menu;;
* ) echo "Réponse incorrecte! - Arrêt du script";;
esac
;;
3 ) echo "RTFM !";;
4 ) exit 0;;
* ) echo "Réponse incorrecte! - Arrêt du script";;
esac
}
genere_fichier_var_ini()
{
if [ ! -d "/etc/openvpn" ]; then
mkdir /etc/openvpn
echo "Création du dossier openvpn"
fi
fichier_var="/etc/openvpn/conf.ini"
if [ ! -e "$fichier_var" ]; then
echo 'v_openvpn_port=' >> $fichier_var
echo 'v_openvpn_reseau=' >> $fichier_var
echo 'clienttoclient=' >> $fichier_var
echo 'v_openvpn_masque=' >> $fichier_var
echo 'v_sys_publicIP=' >> $fichier_var
echo 'v_sys_localIP=' >> $fichier_var
echo 'v_ftp_user=' >> $fichier_var
echo 'v_openvpn_internet=' >> $fichier_var
echo 'v_sys_cartenom=' >> $fichier_var
echo 'v_ftp_install=' >> $fichier_var
echo 'install_g=' >> $fichier_var
fi
}
write_ini()
{
clef=`echo $1 | sed 's/%/\\\%/g'`
valeur=`echo $2 | sed 's/%/\\\%/g'`
sed -r "s%(^[ $'\t']*$clef[ $'\t']*=[ $'\t']*).*\$%\1$valeur%" $3 -i
}
downloadopenvpn() #Permet de télécharger OPENVPN
{
write_ini "install_g" "1" "/etc/openvpn/conf.ini"
echo "Mise à jours liste des paquets"
apt-get update
echo "Téléchargement des fichiers openvpn..."
apt-get install openvpn
dpkg -l "openvpn" > /dev/null 2>&1
INSTALLEDOPENVPN=$?
if [ $INSTALLEDOPENVPN != '0' ]; then
echo "Arret de l'installation"
exit 0
fi
echo "Téléchargement des fichiers Mutt..."
apt-get install mutt
dpkg -l "mutt" > /dev/null 2>&1
INSTALLEMUTT=$?
if [ $INSTALLEMUTT != '0' ]; then
echo "Arret de l'installation"
exit 0
fi
cp -R /usr/share/doc/openvpn/examples/easy-rsa /etc/openvpn
}
config_openvpn() #Configuration du serveur openvpn
{
v_openvpn_port=""
v_openvpn_reseau=""
clienttoclient=""
v_openvpn_masque=""
v_sys_publicIP=""
echo "Configuration du serveur OpenVPN"
while [ -z "${v_openvpn_port}" ] || ! [ "$v_openvpn_port" -eq "$v_openvpn_port" ] 2>/dev/null
do
echo -e "\033[1mQuel port d'écoute utiliser? (Conseil: 1194) \033[0m"
echo -e "\033[33mVous pouvez aussi utiliser un port du type 443 afin d'optimiser les chances de disponibilité à partir de n'importe quel réseau. \033[0m"
read v_openvpn_port
done
while [ -z "${v_openvpn_reseau}" ] || [ "$valideIP" != "TRUE" ]
do
echo -e "\033[1mQuel réseau pour vos clients? (Conseil: 10.8.0.0) \033[0m"
echo -e "\033[33mIl s'agit d'une adresse réseau ! Pas d'une Ip de poste !\033[0m"
read v_openvpn_reseau
validationIP $v_openvpn_reseau
done
while [ "$clienttoclient" != "y" ] && [ "$clienttoclient" != "Y" ] && [ "$clienttoclient" != "N" ] && [ "$clienttoclient" != "n" ]
do
echo -e "\033[1mVoulez-vous que les clients puissent ce voir?(Y/N) \033[0m"
echo -e "\033[33mPermet aux clients de communiquer(comme dans un réseau local)\033[0m"
read clienttoclient
done
while [ -z "${v_openvpn_masque}" ] || [ "$valideIP" != "TRUE" ]
do
echo -n -e "\033[1mMasque réseau? (Conseil: 255.255.255.0) \033[0m"
read v_openvpn_masque
validationIP $v_openvpn_masque
done
while [ -z "${v_sys_publicIP}" ] || [ "$valideIP" != "TRUE" ]
do
echo -e "\033[1mQuelle est l'ip publique de votre serveur? \033[0m"
choplip
echo -e "\033[33mIl a été détecté <"$MONIP"> comme étant votre IP publique.\033[0m"
read v_sys_publicIP
validationIP $v_sys_publicIP
done
echo -n -e "\033[1mVotre IP publique est elle directement attribué à votre carte réseau?(Y/N)\033[0m"
read sys_carte_ip
if [ "$sys_carte_ip" = "y" ] || [ "$sys_carte_ip" = "Y" ]; then
v_sys_localIP=$v_sys_publicIP
else
while [ -z "${v_sys_localIP}" ] || [ "$valideIP" != "TRUE" ]
do
echo -e "\033[1mQuelle est l'ip locale de votre serveur? \033[0m"
read v_sys_localIP
validationIP $v_sys_localIP
done
fi
echo "Ecriture du fichier..."
Fichier_conf_rep="/etc/openvpn/"$HOST".conf"
if [ -e "$Fichier_conf_rep" ]; then
rm $Fichier_conf_rep
fi
write_ini "v_openvpn_port" "$v_openvpn_port" "/etc/openvpn/conf.ini"
write_ini "v_openvpn_reseau" "$v_openvpn_reseau" "/etc/openvpn/conf.ini"
write_ini "v_openvpn_masque" "$v_openvpn_masque" "/etc/openvpn/conf.ini"
write_ini "v_sys_publicIP" "$v_sys_publicIP" "/etc/openvpn/conf.ini"
write_ini "v_sys_localIP" "$v_sys_localIP" "/etc/openvpn/conf.ini"
echo 'mode server' >> $Fichier_conf_rep
echo 'local' $v_sys_localIP >> $Fichier_conf_rep
echo 'port' $v_openvpn_port >> $Fichier_conf_rep
echo 'proto udp' >> $Fichier_conf_rep
echo 'dev tun' >> $Fichier_conf_rep
echo 'ca ca.crt' >> $Fichier_conf_rep
echo 'cert '$HOST'.crt' >> $Fichier_conf_rep
echo 'key '$HOST'.key' >> $Fichier_conf_rep
echo 'dh dh1024.pem' >> $Fichier_conf_rep
echo 'server' $v_openvpn_reseau $v_openvpn_masque >> $Fichier_conf_rep
echo 'cipher BF-CBC' >> $Fichier_conf_rep
echo 'comp-lzo' >> $Fichier_conf_rep
echo 'persist-key' >> $Fichier_conf_rep
echo 'persist-tun' >> $Fichier_conf_rep
echo 'status openvpn-status.log' >> $Fichier_conf_rep
echo 'verb 3' >> $Fichier_conf_rep
echo 'tun-mtu 1500' >> $Fichier_conf_rep
echo 'tun-mtu-extra 32' >> $Fichier_conf_rep
echo 'mssfix 1450' >> $Fichier_conf_rep
echo 'push "redirect-gateway def1"' >> $Fichier_conf_rep
echo 'push "dhcp-option DNS 8.8.8.8"' >> $Fichier_conf_rep
echo 'push "dhcp-option DNS 208.67.220.220"' >> $Fichier_conf_rep
echo 'keepalive 10 120' >> $Fichier_conf_rep
echo 'crl-verify crl.pem' >> $Fichier_conf_rep #A VOIR
if [ "$clienttoclient" = "y" ] || [ "$clienttoclient" = "Y" ]; then
echo 'client-to-client' >> $Fichier_conf_rep
write_ini "clienttoclient" "1" "/etc/openvpn/conf.ini"
else
write_ini "clienttoclient" "0" "/etc/openvpn/conf.ini"
fi
}
conf_var() #Permet de déf des variables de bases pour la création des certif. (Non utilisé pour le moment)
{
v_certif_pays=""
v_certif_province=""
v_certif_ville=""
v_certif_org=""
v_certif_org=""
v_certif_email=""
while [ -z "${v_certif_pays}" ] || [ ${#v_certif_pays} != 2 ]
do
echo -n -e "\033[1mIndice de votre pays?(Exemple:FR - Limite de 2 caractère): \033[0m"
read v_certif_pays
done
while [ -z "${v_certif_province}" ]
do
echo -n -e "\033[1mVotre province?:\033[0m "
read v_certif_province
done
while [ -z "${v_certif_ville}" ]
do
echo -n -e "\033[1mVotre ville?:\033[0m "
read v_certif_ville
done
while [ -z "${v_certif_org}" ]
do
echo -n -e "\033[1mVotre organisation?:\033[0m "
read v_certif_org
done
while [ -z "${v_certif_email}" ] || [[ "$v_certif_email" != *"@"* ]]
do
echo -n -e "\033[1mVotre email? \033[0m"
read v_certif_email
done
write_ini 'export KEY_COUNTRY' '"'$v_certif_pays'"' '/etc/openvpn/easy-rsa/2.0/vars'
write_ini 'export KEY_PROVINCE' '"'$v_certif_province'"' '/etc/openvpn/easy-rsa/2.0/vars'
write_ini 'export KEY_CITY' '"'$v_certif_ville'"' '/etc/openvpn/easy-rsa/2.0/vars'
write_ini 'export KEY_ORG' '"'$v_certif_org'"' '/etc/openvpn/easy-rsa/2.0/vars'
write_ini 'export KEY_EMAIL' '"'$v_certif_email'"' '/etc/openvpn/easy-rsa/2.0/vars'
echo "Données enregistrés"
}
cree_files_server() #Permet de creer les fichiers de base du serveur (ca, key..)
{
ecrase_file=""
echo "Création du certificat serveur..."
if [ -e "/etc/openvpn/ca.crt" ]; then
while [ "$ecrase_file" != "y" ] && [ "$ecrase_file" != "Y" ] && [ "$ecrase_file" != "N" ] && [ "$ecrase_file" != "n" ]
do
echo "Il semblerait qu'un certificat existe déjà, si vous continuez le procéssus, il sera écrasé par le nouveau."
echo "Tous les clients devront mettre à jour leurs fichiers"
echo -n -e "\033[1mVoulez-vous continuer (Y/N)? \033[0m"
read ecrase_file
done
fi
if [ "$ecrase_file" != "n" ] && [ "$ecrase_file" != "N" ]; then
if [ -e "/etc/openvpn/ca.crt" ]; then
rm /etc/openvpn/ca.crt
fi
if [ -e "/etc/openvpn/keys/ca.key" ]; then
rm /etc/openvpn/keys/ca.key
fi
if [ -e "/etc/openvpn/keys/dh1024.pem" ]; then
rm /etc/openvpn/keys/dh1024.pem
fi
if [ -e "/etc/openvpn/$v_system_name.key" ]; then
rm /etc/openvpn/$HOST.key
fi
if [ -e "/etc/openvpn/$v_system_name.crt" ]; then
rm /etc/openvpn/$HOST.crt
fi
#Lignes pour le générer...
cd /etc/openvpn/easy-rsa/2.0
. /etc/openvpn/easy-rsa/2.0/vars
. /etc/openvpn/easy-rsa/2.0/clean-all
. /etc/openvpn/easy-rsa/2.0/build-ca
echo "Certificat serveur crée !"
echo "Création de la clé serveur..."
#Ligne de création
. /etc/openvpn/easy-rsa/2.0/build-key-server $HOST
echo "Clée serveur crée!"
echo "Création du fichier Diffie Hellman..."
#Ligne de création Diffie Hellman.
. /etc/openvpn/easy-rsa/2.0/build-dh
echo "Mise en place des fichiers..."
#Déplacement des fichiers du serveur
cp /etc/openvpn/easy-rsa/2.0/keys/ca.crt /etc/openvpn/ca.crt
cp /etc/openvpn/easy-rsa/2.0/keys/ca.key /etc/openvpn/ca.key
cp /etc/openvpn/easy-rsa/2.0/keys/dh1024.pem /etc/openvpn/dh1024.pem
cp /etc/openvpn/easy-rsa/2.0/keys/$HOST.key /etc/openvpn/$HOST.key
cp /etc/openvpn/easy-rsa/2.0/keys/$HOST.crt /etc/openvpn/$HOST.crt
echo "Tous les fichiers sont en place."
else
echo "Création du certificat serveur annulé !"
fi
#Importation d'un certificat bidon (Fichier ne peut pas être vide)
echo "Téléchargement d'un certificat bidon..."
cd /etc/openvpn/
wget http://pastebin.com/raw.php?i=fs5DYbeT
mv raw.php?i=fs5DYbeT crl.pem
}
creer_client() #Permet de creer un client openvpn
{
v_nom_clientP=""
while [ -z "${v_nom_clientP}" ]
do
echo -n -e "\033[1mCréation du client... Quel nom voulez-vous lui donner? \033[0m"
read v_nom_clientP
done
#permet de détecter si le nom est déjà utilisé ou pas
if [ -e "/etc/openvpn/easy-rsa/2.0/keys/clients/"$v_nom_clientP".crt" ]; then
echo "Ce client existe déjà !"
else
cd /etc/openvpn/easy-rsa/2.0
source ./vars
. /etc/openvpn/easy-rsa/2.0/build-key $v_nom_clientP
echo "Client $v_nom_clientP crée"
if [ ! -d "/etc/openvpn/easy-rsa/2.0/keys/clients" ]; then
mkdir /etc/openvpn/easy-rsa/2.0/keys/clients
echo "Création du dossier clients"
fi
#GZ les deux fichiers
cp /etc/openvpn/easy-rsa/2.0/keys/$v_nom_clientP.crt /etc/openvpn/easy-rsa/2.0/keys/clients/$v_nom_clientP.crt
cp /etc/openvpn/easy-rsa/2.0/keys/$v_nom_clientP.key /etc/openvpn/easy-rsa/2.0/keys/clients/$v_nom_clientP.key
echo "Les fichiers sont en attentes dans: /etc/openvpn/easy-rsa/2.0/keys/clients/"
fi
}
revoke_user() #Permet de bloquer l'utilisation d'un certificat client
{
revokclient=""
while [ -z "${revokclient}" ]
do
echo -n -e "\033[1mNom du client à supprimer:\033[0m "
read revokclient
done
cd /etc/openvpn/easy-rsa/2.0
source ./vars #Charge les var
./revoke-full $revokclient
cp keys/crl.pem /etc/openvpn/
}
creerfichieropenvpn() #Permet de générer un fichier de configuration openvpn directement utilisable.
{
#Création du fichier ovpn client.
confuseropenvpn="/etc/openvpn/easy-rsa/2.0/keys/clients/"$v_nom_clientP".ovpn"
#Config Ip + Port
echo "remote" $v_sys_publicIP $v_openvpn_port >> $confuseropenvpn
echo "<ca>" >> $confuseropenvpn
#Récupere les données du Certificat serveur et les mets dans le fichier de configuration ...
while read ca
do
echo -e "$ca" >> $confuseropenvpn
done < /etc/openvpn/ca.crt
echo "</ca>" >> $confuseropenvpn
echo "<cert>" >> $confuseropenvpn
#Récupere les données du Certificat client et les mets dans le fichier de configuration ...
while read cert
do
echo -e "$cert" >> $confuseropenvpn
done < /etc/openvpn/easy-rsa/2.0/keys/clients/$v_nom_clientP.crt
echo "</cert>" >> $confuseropenvpn
echo "<key>" >> $confuseropenvpn
#Récupere les données de la Key client et les mets dans le fichier de configuration ...
while read key
do
echo -e "$key" >> $confuseropenvpn
done < /etc/openvpn/easy-rsa/2.0/keys/clients/$v_nom_clientP.key
echo "</key>" >> $confuseropenvpn
#Configurations générales du client...
echo "client" >> $confuseropenvpn
echo "dev tun" >> $confuseropenvpn
echo "proto udp" >> $confuseropenvpn
echo "resolv-retry infinite" >> $confuseropenvpn
echo "nobind" >> $confuseropenvpn
echo "persist-key" >> $confuseropenvpn
echo "persist-tun" >> $confuseropenvpn
echo "mute-replay-warnings" >> $confuseropenvpn
echo "cipher BF-CBC" >> $confuseropenvpn
echo "comp-lzo" >> $confuseropenvpn
echo "verb 5" >> $confuseropenvpn
}
installpureftp() #Installe le serveur FTP pour récuperer les fichiers clients
{
st_install_ftp=""
echo -e "\033[33m Afin de récuperer les fichiers clients vous pouvez installer un serveur FTP.\033[0m"
while [ "$st_install_ftp" != "y" ] && [ "$st_install_ftp" != "Y" ] && [ "$st_install_ftp" != "N" ] && [ "$st_install_ftp" != "n" ]
do
echo -e "\033[1mVoulez-vous installer pure-ftp maitenant? (Y/N) \033[0m"
echo -e "\033[33m-Si vous possédez déjà un serveur FTP l'installation d'un second est très fortement déconseillé !
-Si votre serveur est disponible sur votre réseau local vous pouvez opter pour un partage de fichier.\033[0m"
read st_install_ftp
done
if [ "$st_install_ftp" = "y" ] || [ "$st_install_ftp" = "Y" ]; then
echo "Installation du serveur ftp..."
apt-get install pure-ftpd-common
dpkg -l "pure-ftpd-common" > /dev/null 2>&1
INSTALLEDftpd=$?
if [ $INSTALLEDftpd = '0' ]; then
echo "Création du groupe..."
groupadd ftpgroup
echo "Mise en place des droits..."
useradd -g ftpgroup -d /dev/null -s /usr/sbin/nologin ftpuser
echo 'yes' >> /etc/pure-ftpd/conf/NoAnonymous
echo 'yes' >> /etc/pure-ftpd/conf/ChrootEveryone
echo 'yes' >> /etc/pure-ftpd/conf/CreateHomeDir
echo 'yes' >> /etc/pure-ftpd/conf/AntiWarez
write_ini "v_ftp_install" "1" "/etc/openvpn/conf.ini"
v_ftp_install=1
else
"Arret de l'installation de pureftp"
fi
else
echo "Vous devrez les récuperer par vos propres moyens !"
write_ini "v_ftp_install" "0" "/etc/openvpn/conf.ini"
fi
}
ftp_creer_user() #Creer l'utilisateur FTP.
{
v_ftp_user=""
while [ -z "${v_ftp_user}" ]
do
echo -n -e "\033[1mQuel nom d'utilisateur pour votre compte ftp?\033[0m"
read v_ftp_user
done
echo "Création de l'utilisateur..."
mkdir /home/virtual_ftp_users
mkdir /home/virtual_ftp_users/$v_ftp_user
pure-pw useradd $v_ftp_user -u ftpuser -g ftpgroup -d /home/virtual_ftp_users/$v_ftp_user
write_ini "v_ftp_user" "$v_ftp_user" "/etc/openvpn/conf.ini"
pure-pw mkdb
echo "Application des modifications..."
ln -s /etc/pure-ftpd/conf/PureDB /etc/pure-ftpd/auth/50pure
transfertfichier_client
/etc/init.d/pure-ftpd restart
}
ftp_modif_pw() #Permet de modifier le mot de passe d'un compte FTP
{
v_ftp_user_modif=""
echo "Modification du mot de passe"
source /etc/openvpn/conf.ini
while [ "$userftpmodfpw" != "y" ] && [ "$userftpmodfpw" != "Y" ] && [ "$userftpmodfpw" != "N" ] && [ "$userftpmodfpw" != "n" ]
do
echo -e "\033[1m"$v_ftp_user" est-il bien votre utilisateur FTP? (Y/N) \033[0m"
read userftpmodfpw
done
if [ "$userftpmodfpw" = "y" ] || [ "$userftpmodfpw" = "Y" ]; then
pure-pw passwd $v_ftp_user -m
pure-pw mkdb
# Password
echo "Application des modifications..."
ln -s /etc/pure-ftpd/conf/PureDB /etc/pure-ftpd/auth/50pure
/etc/init.d/pure-ftpd restart
else
while [ -z "${v_ftp_user_modif}" ]
do
echo -n -e "\033[1mQuel nom d'utilisateur ?033[0m"
read v_ftp_user_modif
done
pure-pw passwd $v_ftp_user -m
pure-pw mkdb
# Password
echo "Application des modifications..."
ln -s /etc/pure-ftpd/conf/PureDB /etc/pure-ftpd/auth/50pure
/etc/init.d/pure-ftpd restart
fi
}
transfertfichier_client() #Permet de transferer les fichiers clients (.ovpn,ca,key...) dans le dossier du serveur ftp
{
while [ -z "${v_ftp_user}" ]
do
echo -n -e "\033[1mQuel est le nom utilisateur de votre compte ftp?"$v_ftp_user"\033[0m"
read v_ftp_user
done
#VOir pour l'ajout GZ
cp /etc/openvpn/ca.crt /home/virtual_ftp_users/$v_ftp_user/ca.crt
cp /etc/openvpn/easy-rsa/2.0/keys/clients/*.* /home/virtual_ftp_users/$v_ftp_user/
echo "Les fichiers clients sont maintenant disponible sur votre FTP!"
echo "Une fois les fichiers récuperés, il faut les supprimer du serveur FTP(Sécurité)"
echo -e "\033[33mInformation de connexion: IP:"$v_sys_publicIP" // USER:"$v_ftp_user"\033[0m"
chmod 755 /home/virtual_ftp_users/$v_ftp_user/*.* #Utile car tous les fichiers n'ont pas les mêmes droits.
}
config_firewall() #Configuration du firewall
{
v_openvpn_internet=""
v_sys_iptables=""
v_sys_cartenom=""
while [ "$v_openvpn_internet" != "y" ] && [ "$v_openvpn_internet" != "Y" ] && [ "$v_openvpn_internet" != "N" ] && [ "$v_openvpn_internet" != "n" ]
do
echo -n -e "\033[1mVoulez-vous un accès internet à partir du réseau client VPN?(Y/N) \033[0m"
read v_openvpn_internet
done
while [ "$v_sys_iptables" != "y" ] && [ "$v_sys_iptables" != "Y" ] && [ "$v_sys_iptables" != "N" ] && [ "$v_sys_iptables" != "n" ]
do
echo -e "\033[1mVoulez-vous que le script génère aussi les régles de base d'iptables?(Y/N) \033[0m"
echo -e "\033[33m Si vous en avez déjà paramétré un vous même, cette option peut créer des conflits ! \033[0m"
read v_sys_iptables
done
while [ -z "${v_sys_cartenom}" ]
do
echo -e "\033[1mQuel est le nom de votre carte rélié à internet? \033[0m"
echo -e "\033[33mIl s'agit généralement de <eth0> mais dans le cas d'un serveur vitualisé par OPENVZ le nom peut être <venet0>\033[0m"
read v_sys_cartenom
done
Fichier_firewall="/etc/init.d/firewall"
echo "Création des régles IPTables"
write_ini "v_sys_cartenom" "$v_sys_cartenom" "/etc/openvpn/conf.ini"
if [ -e "$Fichier_firewall" ]; then
rm $Fichier_firewall
fi
echo '#!/bin/bash' >> $Fichier_firewall
#régles de bases
if [ "$v_sys_iptables" = "y" ] || [ "$v_sys_iptables" = "Y" ]; then
modprobe ip_nat_ftp
modprobe ip_conntrack_ftp
#Suppr des régles existantes
echo 'iptables -F' >> $Fichier_firewall
echo 'iptables -X' >> $Fichier_firewall
# Entrés bloqués par défaut
echo 'iptables -P INPUT DROP' >> $Fichier_firewall
# Sortie bloqués par défauts
echo 'iptables -P OUTPUT DROP' >> $Fichier_firewall
# Forward entre cartes autorisé
echo 'iptables -P FORWARD ACCEPT' >> $Fichier_firewall
#Ne pas casser les connexions existantes
echo 'iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT' >> $Fichier_firewall
echo 'iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT' >> $Fichier_firewall
#Le loopback
echo 'iptables -t filter -A INPUT -i lo -j ACCEPT' >> $Fichier_firewall
echo 'iptables -t filter -A OUTPUT -o lo -j ACCEPT' >> $Fichier_firewall
#Le ping
echo 'iptables -A INPUT -p icmp -j ACCEPT' >> $Fichier_firewall
echo 'iptables -A OUTPUT -p icmp -j ACCEPT' >> $Fichier_firewall
#Le SSH
echo 'iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT' >> $Fichier_firewall
echo 'iptables -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT' >> $Fichier_firewall
#le FTP
echo 'iptables -t filter -A INPUT -p tcp --dport 20 -j ACCEPT' >> $Fichier_firewall
echo 'iptables -t filter -A OUTPUT -p tcp --dport 20 -j ACCEPT' >> $Fichier_firewall
echo 'iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT' >> $Fichier_firewall
echo 'iptables -t filter -A OUTPUT -p tcp --dport 21 -j ACCEPT' >> $Fichier_firewall
#SMTP
echo 'iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT' >> $Fichier_firewall
#Port openVPN
echo 'iptables -t filter -A INPUT -p udp --dport '$v_openvpn_port' -j ACCEPT' >> $Fichier_firewall
echo 'iptables -t filter -A OUTPUT -p udp --dport '$v_openvpn_port' -j ACCEPT' >> $Fichier_firewall
#DNS...
echo 'iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT' >> $Fichier_firewall
echo 'iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT' >> $Fichier_firewall
#Internet 80
echo 'iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT' >> $Fichier_firewall
echo 'iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT' >> $Fichier_firewall
#Internet 443
echo 'iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT' >> $Fichier_firewall
echo 'iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT' >> $Fichier_firewall
#NTP
echo 'iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT' >> $Fichier_firewall
else
while [ -z "${def_regles}" ]
do
echo -e "\033[1mVoulez-vous mettre les régles iptables par défaut?(Y/N) \033[0m"
echo -e "\033[33mSi vous avez défini des régles personalisés, elles seront écrasées.\033[0m"
read def_regles
done
if [ "$def_regles" = "y" ] || [ "$def_regles" = "Y" ]; then
echo "Régles par défauts..."
iptables -F
iptables -X
echo "INPUT - ACCEPT[OK]"
iptables -P INPUT ACCEPT
echo "OUTPUT - ACCEPT[OK]"
iptables -P OUTPUT ACCEPT
echo "FORWARD - ACCEPT[OK]"
iptables -P FORWARD ACCEPT
fi
fi
#Pour l'accès internet au réseau du VPN
if [ "$v_openvpn_internet" = "y" ] || [ "$v_openvpn_internet" = "Y" ]; then
echo 'oclient="'$v_openvpn_reseau'/'$v_openvpn_masque'"' >> $Fichier_firewall
echo 'iptables -A FORWARD -s $oclient -j ACCEPT' >> $Fichier_firewall
echo 'iptables -t nat -A POSTROUTING -o '$v_sys_cartenom' -j SNAT --to-source '$v_sys_localIP'' >> $Fichier_firewall
echo "Activation d'ipforward"
write_ini "v_openvpn_internet" "1" "/etc/openvpn/conf.ini"
write_ini "net.ipv4.ip_forward" "1" "/etc/sysctl.conf"
elif [ "$v_openvpn_internet" = "n" ] || [ "$v_openvpn_internet" = "N" ]; then
echo "Désactivation de l'ipforward"
echo "Vos clients n'auront pas d'accès internet!"
write_ini "v_openvpn_internet" "0" "/etc/openvpn/conf.ini"
write_ini "net.ipv4.ip_forward" "0" "/etc/sysctl.conf"
fi
echo "Le fichier firewall crée"
echo "chmod du fichiers..."
chmod +x $Fichier_firewall
$Fichier_firewall restart
update-rc.d firewall defaults
}
choplip() #Récupere l'ip publique du serveur
{
MONIP=`wget http://checkip.dyndns.org/ -O - -o /dev/null | cut -d: -f 2 | cut -d\< -f 1`
}
validationIP() #Permet de vérifier que l'entrée utilisateur soit bien une IP...
{
valideIP="FALSE"
if [[ $1 =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
valideIP="TRUE"
else
valideIP="FALSE"
fi
}
connexiontest() #Permet de tester la connectivité internet du serveur avant le téléchargement des paquets
{
internet_result=""
echo "Test de connectivité internet..."
ping -c3 checkip.dyndns.com
TEST=$?
if [ $TEST -ne 0 ]
then
internet="[Pas de connexion détecté]"
internet_result="FALSE"
else
internet="[Connexion détecté]"
fi
}
reboot() #Pour reboot le serveur complétement !
{
while [ "$rebootemoi" != "y" ] && [ "$rebootemoi" != "Y" ] && [ "$rebootemoi" != "N" ] && [ "$rebootemoi" != "n" ]
do
echo -n -e "\033[1mVoulez-vous redémarrer maintenant? (Y/N): \033[0m"
read rebootemoi
done
if [ "$rebootemoi" = "y" ] || [ "$rebootemoi" = "Y" ]; then
reboot
fi
}
reboot_opvn() #Pour reboot openvpn
{
while [ "$reboote_opvn" != "y" ] && [ "$reboote_opvn" != "Y" ] && [ "$reboote_opvn" != "N" ] && [ "$reboote_opvn" != "n" ]
do
echo -e "\033[1mCette opération demande un redémarrage d'open vpn... (Y/N): \033[0m"
echo -n -e "\033[1mVoulez-vous redémarrer maintenant? (Y/N): \033[0m"
read reboote_opvn
done
#if [ "$reboote_opvn" = "y" ] || [ "$reboote_opvn" = "Y" ]; then
# /etc/init.d/openvpn restart
#fi
}
mailto() #Permet d'envoyer les fichiers par email
{
while [ "$mail_to_user" != "y" ] && [ "$mail_to_user" != "Y" ] && [ "$mail_to_user" != "N" ] && [ "$mail_to_user" != "n" ]
do
echo -n -e "\033[1mVoulez-vous envoyer les fichiers de configuration par mail au client?(Y/N) \033[0m"
read mail_to_user
done
if [ "$mail_to_user" = "y" ] || [ "$mail_to_user" = "Y" ]; then
echo -n -e "\033[1mQuelle est l'email de "$v_nom_clientP"?\033[0m"
read email_user
echo "Envoi du mail..."
echo "Merci de patienter, cela peut prendre un peu de temps!"
echo | mutt -s "Vos fichiers de configuration OPENVPN" -a /etc/openvpn/easy-rsa/2.0/keys/clients/$v_nom_clientP.key /etc/openvpn/easy-rsa/2.0/keys/clients/$v_nom_clientP.crt /etc/openvpn/easy-rsa/2.0/keys/clients/$v_nom_clientP.ovpn /etc/openvpn/ca.crt -- $email_user
echo "Email envoyé."
fi
}
HOST=`hostname`
echo "Script d'installation simplifié d'openVPN"
echo "Auteur: Tlams"
echo "Date: 15/02/13"
echo "Version: 1.0"
echo "Langue: Français"
genere_fichier_var_ini
menu
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment