Règles iptables afin de bloquer les scanners SIP

Les serveurs SIP (Asterisk, FreeSwitch … mais aussi les serveurs propriétaires) sont constamment scannés par des automates ou des humains avec pour seule idée, découvrir une faille à exploiter. En effet, les enjeux financiers sont importants.
Je partage avec vous ce jour, un script iptables pour bloquer les scanners SIP (à adapter notamment les ports si vous utilisez des différents de 5060).

iptables -N SIPDOS

iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “sundayddr” –algo bm –to 65535 -m comment –comment “deny sundayddr” -j SIPDOS
iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “sipsak” –algo bm –to 65535 -m comment –comment “deny sipsak” -j SIPDOS
iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “sipvicious” –algo bm –to 65535 -m comment –comment “deny sipvicious” -j SIPDOS
iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “friendly-scanner” –algo bm –to 65535 -m comment –comment “deny friendly-scanner” -j SIPDOS
iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “iWar” –algo bm –to 65535 -m comment –comment “deny iWar” -j SIPDOS
iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “sip-scan” –algo bm –to 65535 -m comment –comment “deny sip-scan” -j SIPDOS
iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “User-Agent: sipcli” –algo bm –to 65535 -m comment –comment “deny sipcli” -j SIPDOS
iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “User-Agent: Nmap NSE” –algo bm –to 65535 -m comment –comment “deny Nmap NSE” -j SIPDOS
iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “User-Agent: VaxSIPUserAgent” –algo bm –to 65535 -m comment –comment “deny VaxSIPUserAgent” -j SIPDOS
iptables -A INPUT -i eth0 -p udp -m udp –dport 5060 -m string –string “From: sipp <sip:” –algo bm –to 65535 -m comment –comment “deny sipp” -j SIPDOS

iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “sundayddr” –algo bm –to 65535 -m comment –comment “deny sundayddr” -j SIPDOS
iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “sipsak” –algo bm –to 65535 -m comment –comment “deny sipsak” -j SIPDOS
iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “sipvicious” –algo bm –to 65535 -m comment –comment “deny sipvicious” -j SIPDOS
iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “friendly-scanner” –algo bm –to 65535 -m comment –comment “deny friendly-scanner” -j SIPDOS
iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “iWar” –algo bm –to 65535 -m comment –comment “deny iWar” -j SIPDOS
iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “sip-scan” –algo bm –to 65535 -m comment –comment “deny sip-scan” -j SIPDOS
iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “User-Agent: sipcli” –algo bm –to 65535 -m comment –comment “deny sipcli” -j SIPDOS
iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “User-Agent: Nmap NSE” –algo bm –to 65535 -m comment –comment “deny Nmap NSE” -j SIPDOS
iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “User-Agent: VaxSIPUserAgent” –algo bm –to 65535 -m comment –comment “deny VaxSIPUserAgent” -j SIPDOS
iptables -A INPUT -i eth0 -p tcp -m tcp –dport 5060 -m string –string “From: sipp <sip:” –algo bm –to 65535 -m comment –comment “deny sipp” -j SIPDOS

iptables -A SIPDOS -j LOG –log-prefix “firewall-sipdos: ” –log-level 6
iptables -A SIPDOS -j DROP

Si vous avez des idées pour l’améliorer, toutes les suggestions sont les bienvenues, l’idée étant de faciliter la sécurisation des serveurs SIP au plus grand nombre.

Mises à jour :

  • 4 août 2016 : ajoût de règles + correction typo suite au commentaire de Ztur

PyFreeBilling disponible en italien

Grâce à l’excellent travail de Vito, PyFreeBilling est entièrement traduit en italien. Un grand merci à lui. Une traduction en français et espagnol est en cours.

Installation FreeSwitch sur Ubuntu automatisée

Installation automatisée de FreeSwitch à partir des sources sur Ubuntu/Debian

L’installation de FreeSwitch à partir des sources n’est pas une tâche bien compliquée. Il suffit de suivre le guide expliquant le processus sur le site de FreeSwitch. Mais cette tâche est longue et si vous installez de manière régulière de serveurs FreeSwitch, cela devient vite répétitif et source d’erreur.

Je vais vous présenter une manière simple et automatique pour installer FreeSwitch sur votre serveur tout neuf Ubuntu 14.04 64 bits LTS. (Cela marche aussi pour Debian 7).

Voici le process d’installation FreeSwitch :

sudo apt-get install -y python-apt python-pycurl libtiff5-dev
sudo git clone https://github.com/mwolff44/freeswitch-mw.git
sudo echo localhost > inventory
sudo ansible-playbook -i inventory freeswitch-mw/test.yml --connection=local

Prenez un grand café, prenez votre temps pendant que vous voyez FreeSwitch se compiler et s’installer.

Vous pouvez personnaliser les modules à installer, pour cela il faut utiliser la variable « freeswitch_modules_template » pour pointer sur votre propre fichier. Je vous laisse découvrir les autres options sur le Readme de github pour le script freeswitch-mw.

PyFreeBilling : démo en ligne

Suite à de nombreuses demandes, j’ai pris le temps d’installer un serveur de démo de PyFreeBilling, le logiciel de routage et de facturation opérateur basé sur FreeSwitch.

Certaines fonctions sont désactivées comme la possibilité d’émettre ou de recevoir des appels.

Pour se connecter, le username est « admin » et le password « pyfreebilling ».

Essayez de garder la démo propre, merci d’avance.

Si vous souhaitez avoir plus d’information sur la solution open source de billing FreeSwitch, le site de PyFreeBilling vous attend.

Ansible : Freeswitch role : nouvelle version – v1.1

Je viens de publier la mise à jour du role FreeSwitch pour Ansible, le célèbre moteur d’orchestration. Ce role permet d’installer FreeSwitch à partir des sources sur les systèmes linux basés sur Debian/Ubuntu.

J’ai ajouté la gestion des variables, vous permettant d’utiliser une configuration collant au mieux de vos besoins.

L’utilisation est simple. Il faut dans un premier temps installer Ansible, puis ajouter mwolff44.freeswitch-mw à vos roles. Vous avez un exemple de configuration ci-dessous :

- hosts: all
  vars_files:
    - 'defaults/main.yml'
  tasks:
    - include: 'tasks/main.yml'
  handlers:
    - include: 'handlers/main.yml'

Le repository du role Ansible pour FreeSwitch est hébergé chez Github et est bien sûr validé en intégration continue grâce au service de travis-ci.org.

Si vous voyez des idées d’amélioration, n’hésitez pas.

Howto : comment configurer monit pour surveiller FreeSwitch

Guide détaillant la procédure de configuration de mont pour surveiller FreeSwitch et être alerter en cas de panne.

Il est essentiel de surveiller les services que nous déployons au sein de nos entreprises ou pour nos clients. Je vais vous présenter aujourd’hui comment superviser FreeSwitch avec Monit.

Monit est un outil léger open source (licence AGPL) permettant de superviser et de gérer les systèmes Unix. Il est capable d’exécuter des actions en cas de détection de défaillance.

Monit est disponible sous forme de paquet dans la plupart des distributions. L’installation sur un système basé sur Debian est très simple :

apt-get install monit

pour Centos, ce n’est pas plus compliqué :

yum install monit

La première chose à faire est de vérifier que la variable « START » a bien la valeur yes dans le fichier /etc/default/monit afin de permettre à Monit de démarrer.

Ensuite, la configuration centrale de Monit se fait au sein du fichier monitrc localisé sous /etc/monit. Dans ce fichier, vous pouvez notamment modifier l’adresse email qui recevra les alertes.

Ensuite, les configuration sont dans le répertoire /etc/monit/conf.d . Nous allons créer un fichier nommé freeswitch et y ajouter les lignes suivantes :

check process freeswitch with pidfile /usr/local/freeswitch/run/freeswitch.pid
  start program = "/etc/init.d/freeswitch start"
  stop program  = "/etc/init.d/freeswitch stop"

Nous allons simplement vérifier que FreeSwitch est bien démarré et si ce n’est pas le cas, nous demandons à Monit de le démarrer.

Avant de lancer Monit, vérifier bien que la syntaxe des fichiers de configuration est bonne avec la commande :

monit -t

Vous devez obtenir une belle réponse « Control file syntax OK ».

Nous allons maintenant compléter notre test afin de s’assurer que le process SIP est toujours fonctionnel. Pour cela, nous allons ajouter les lignes suivantes à notre fichier :

check host fs_server with address 127.0.0.1
   if failed port 5060 type udp protocol sip
      with target "localhost:5060" and maxforward 6
   then alert

En cas de dysfonctionnement, Monit vous enverra un mail d’alerte (attention à bien configurer votre mail et serveur dans le fichier monitrc).

Il possible de pousser aussi la supervision plus loin, selon le taux d’utilisation de votre machine, vérifier les process, les fichiers de log … et l’usage de la solution M/Monit permet un monitoring de vos serveurs centralisé simplement.

Ansible : freeswitch role – installation et compilation automatique

Je viens de publier mon nouveau role pour Ansible, le célèbre moteur d’orchestration. Ce role permet d’installer FreeSwitch à partir des sources sur les systèmes linux basés sur Debian/Ubuntu.

Je viens de publier mon nouveau role pour Ansible, le célèbre moteur d’orchestration. Ce role permet d’installer FreeSwitch à partir des sources sur les systèmes linux basés sur Debian/Ubuntu.

Il fait pour vous les tâches longues : installation des dépendances, téléchargement des sources, configuration et compilation, installation de FreeSwitch, sécurisation de l’installation (user et droits) et paramétrage du script de démarrage.

L’utilisation est simple. Il faut dans un premier temps installer Ansible, puis ajouter mwolff44.freeswitch-mw à vos roles. Vous avez un exemple de configuration ci-dessous :

- hosts: all
  vars_files:
    - 'defaults/main.yml'
  tasks:
    - include: 'tasks/main.yml'
  handlers:
    - include: 'handlers/main.yml'

Le repository du role Ansible pour FreeSwitch est hébergé chez Github et est bien sûr validé en intégration continue grâce au service de travis-ci.org.

Si vous voyez des idées d’amélioration, n’hésitez pas.

SIP : comment débugger ?

Introduction

Votre nouveau serveur VoIP est en place. Mais pour une raison que vous ignorez vos appels ne fonctionnent pas comme prévus. Pas de panique, je vais vous présenter quelques outils en ligne de commande qui vont vous aider à déterminer la source du problème. En effet, le protocole SIP n’est pas toujours aussi simple à l’usage que dans la théorie. Les informations fournies par les systèmes de téléphonie Open Source (Asterisk, Freeswitch, Yate …) ou propriétaires ne sont pas toujours d’une grande aide (manque de lisibilité, de souplesse …).

Pourquoi des outils en ligne de commande : l’installation est simple et très rapide, fonctionnent sur toutes les distributions linux, et l’information souhaitée est facilement et rapidement accessible. Il est tout à fait possible d’utiliser ces outils afin de sauvegarder les informations collectées dans un fichier afin de réaliser des analyses plus fines avec des logiciels intégrant une interface graphique, comme le renommé Wireshark.

Pré requis

Vous vous êtes assuré de la bonne configuration de vos comptes SIP (du moins sur le papier), que le routage (diaplan) est correctement fait et que les appels sont possibles (droits d’accès à la route bien affectés, balance financière positive …). Si pour vous, vous ne voyez pas de loup à cette étape, nous allons entrer dans le dur.

Procédure

Je vais maintenant vous expliquer comment trouver de manière efficace la source du problème. Nous allons du plus général vers le plus détaillé. Tout d’abord, vérifier que les échanges de messages SIP se passent comme prévus (je ne vais pas les rappeler ici, je vous laisse ressortir vos cours. J’écrirais peut-être un de ces jours un article les détaillants) : enregistrement, établissement d’un appel, raccroché de l’appel. Si une des étapes est manquantes, il va falloir trouver des informations détaillées. Nous allons voir ces étapes dans le paragraphe suivant.

Comment tracer les messages SIP

Nous allons dans un premier temps vérifier que les messages SIP échanger sont conforment. Nous n’avons pas besoin de tout le détail, juste du type de message SIP (100, 180, 407, 404 …). On va ainsi pouvoir voir très simplement à quelle étape le problème se pose. Le serveur distant souhaite que le compte soit enregistrer avant d’autoriser un appel (merde, on m’avait dit que c’était une authentification par IP ?), le serveur distant vous répond par un bon 404 ? …

Pour cela, je vais utiliser tshark, outil renommé de tout bon administrateur linux. Il utilise la librairie pcap pour capturer le traffic de l’interface déclarée (avec l’option -i) et affiche (ou enregistre dans un fichier avec l’option -w) les informations décodées de paquets capturés. Les fichiers de capture créés peuvent être lus par Wireshark.

Nous allons utiliser toute la puissance de filtrage de tshark afin de trouver l’information souhaitée. Par exemple, il faut vérifier que l’invite correspond bien au format attendu.

tshark -i eth0 -R "ip.addr==78.x.y.10 and sip.CSeq.method eq INVITE" (-V)

Si vous souhaitez capturer l’ensemble du traffic SIP d’une adresse ip spécifique et d’un port spécifique :

tshark -i eth0 -R "ip.addr==78.x.y.10 and port==5060" -z sip,stat

Un autre outil fort utile peut être utilisé, j’ai nommé tcpdump.

tcpdump est un analyseur de paquet. Il utilise libpcap, une librairie C/C++ afin de capturer les paquets.  Vous devez avoir les droits de super utilisateur afin de pouvoir l’utiliser.

Nous allons voir le détail de la commande à utiliser :

-i eth0 — le nom de l’interface à écouter

-n — afin de ne pas résoudre les hostnames

host 1.2.3.4 — filtre le traffic sur cette adresse IP (peut être remplacé par net pour capturer un réseau ex : net 1.2.3.0/24)

proto udp — en général on utilise de l’udp

-w /tmp/file.pcap — pour enregistrer la capture dans un fichier. Mais comme on souhaite avoir le retour en console, on ne vas pas ajouter cette option.

Vous trouverez le détail des options de la commande de tcpdump sur cette page.

Conclusion

Nous venons de voir de manière simple comment débugger un chance SIP entre 2 machines. Vous pouvez utiliser la capture afin de l’importer dans un GUI comme Wireshark afin de réaliser des recherches plus poussées, afficher une vue graphique des échanges ou générer des statistiques.

Il est aussi possible d’utiliser d’autres outils comme ngrep. Je vous présenterai dans un prochain article l’outil HOMER.

PyFreeBilling : comment démarrer

Vous souhaitez utiliser PyFreeBilling, Softswitch VoIP opensource basé sur FreeSwitch, mais vous ne savez pas par où commencer. Après avoir suivi la documentation d’installation sur un serveur Ubuntu 14.04 LTS 64 bits, je vous encourage à lire cet article intitulé : PyFreeBilling : quick start .

Vous souhaitez utiliser PyFreeBilling, Softswitch VoIP opensource basé sur FreeSwitch, mais vous ne savez pas par où commencer. Après avoir suivi la documentation d’installation sur un serveur Ubuntu 14.04 LTS 64 bits, je vous encourage à lire cet article intitulé : PyFreeBilling : quick start .

Pour ceux qui ne connaissent pas encore PyFreeBilling, vous disposez d’un serveur permettant d’interconnecter des clients SIP avec des fournisseurs VoIP,  établir des règles de routage, définir des grilles tarifaires, facturer les clients et fournir un extranet à ces mêmes clients.

PyFreeBilling a été conçu pour supporter une montée en charge importante et fiabilité.

La solution avance assez vite, la nouvelle version étant attendue pour la fin de l’année.

FreeSWITCH : problème avec git « merge error »

Vous rencontrez une erreur « merge error » lorsque vous souhaitez faire un pull sur la branche 1.4 de FreeSWITCH. Pas de panique, l’équipe de développement FreeSWITCH a réalisée quelques modifications. Pour corriger cette erreur impactant votre repo local, il vous suffit d’entrer cette commande :

git reset --hard origin/v1.4

Vous pouvez installer maintenant la dernière version stable 1.4.