<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Archives des asterisk - Alain ARDITI&#039;s blog</title>
	<atom:link href="https://alain.arditi.fr/tag/asterisk/feed/" rel="self" type="application/rss+xml" />
	<link>https://alain.arditi.fr/tag/asterisk/</link>
	<description>Aide mémoire informatique</description>
	<lastBuildDate>Thu, 20 Nov 2025 10:31:29 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>

<image>
	<url>https://alain.arditi.fr/wp-content/uploads/2020/04/cropped-ARDITI_Alain_20200326_512x512-32x32.jpg</url>
	<title>Archives des asterisk - Alain ARDITI&#039;s blog</title>
	<link>https://alain.arditi.fr/tag/asterisk/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>FreePBX / Asterisk : filtrage d&#8217;appel avec MySQL</title>
		<link>https://alain.arditi.fr/2020/10/29/freepbx-asterisk-filtrage-dappel-avec-mysql/</link>
		
		<dc:creator><![CDATA[Alain ARDITI]]></dc:creator>
		<pubDate>Thu, 29 Oct 2020 15:39:02 +0000</pubDate>
				<category><![CDATA[Système]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[FreePBX]]></category>
		<guid isPermaLink="false">https://alain.arditi.fr/?p=194</guid>

					<description><![CDATA[<p>OS Debian Buster 10.6 FreePBX version 15.0.16.75 Asterisk version 16.2.1~dfsg-1+deb10u2 L&#8217;objectif était de pouvoir autoriser des numéros de téléphones à appeler une ligne de notre serveur Asterisk. C&#8217;est en fait une whitelist qu&#8217;on a défini dans une base de données MySQL. Quand on cherche à filtrer des appels en fonction de numéros appelant on tombe&#8230; </p>
<div class="more-link-container"><a class="more-link" href="https://alain.arditi.fr/2020/10/29/freepbx-asterisk-filtrage-dappel-avec-mysql/">Poursuivre la lecture <span class="screen-reader-text">FreePBX / Asterisk : filtrage d&#8217;appel avec MySQL</span></a></div>
<p>L’article <a href="https://alain.arditi.fr/2020/10/29/freepbx-asterisk-filtrage-dappel-avec-mysql/">FreePBX / Asterisk : filtrage d&rsquo;appel avec MySQL</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p></p>



<ul class="wp-block-list"><li>OS Debian Buster 10.6</li><li>FreePBX version 15.0.16.75</li><li>Asterisk version 16.2.1~dfsg-1+deb10u2</li></ul>



<p>L&rsquo;objectif était de pouvoir autoriser des numéros de téléphones à appeler une ligne de notre serveur Asterisk. C&rsquo;est en fait une whitelist qu&rsquo;on a défini dans une base de données MySQL.</p>



<p>Quand on cherche à filtrer des appels en fonction de numéros appelant on tombe souvent sur la fonctionnalité de FreePBX Caller ID Lookup. Cette fonctionnalité permet en fait d&rsquo;enrichir un appel avec le nom correspondant au numéro appelant qu&rsquo;on peut trouver dans une table de correspondance. C&rsquo;est comme un annuaire, qui affiche le nom de l&rsquo;appelant plutôt que son numéro.</p>



<span id="more-194"></span>



<p>Dans FreePBX le menu Système/CID Lookup permet de définir la source de l&rsquo;annuaire. On peut utiliser une URL qui va chercher dans un annuaire ou un requête MySQL, etc&#8230;. Ca fonctionne très bien, sauf que ça ne joue pas le rôle de filtre.</p>



<p>Le module Blacklist de FreePBX <a href="https://wiki.freepbx.org/display/FPG/Blacklist+Module+User+Guide" target="_blank" rel="noreferrer noopener">https://wiki.freepbx.org/display/FPG/Blacklist+Module+User+Guide</a> fait exactement le contraire de ce qu&rsquo;on cherche à faire.</p>



<p>D&rsquo;autres manières de créer des whitelists passent par l&rsquo;utilisation d&rsquo;un masque de numéros sur les routes entrantes. On peut dire qu&rsquo;on laisse passer tous les numéros qui commencent par 06 et 07, les mobiles avec une expression régulière telle que « _0[67]XXXXXXXX. » Le problème c&rsquo;est qu&rsquo;on ne peut pas définir une dizaine de numéros de mobiles avec une expression régulière de cette forme.</p>



<p>Quand on cherche de la documentation Asterisk et les posts sur le sujet, on voit qu&rsquo;on peut définir des règles « custom ». Alors , pourquoi ne pas bloquer les appelants s&rsquo;ils ne sont pas dans une table MySQL en utilisant cidlookup ?</p>



<p>Il suffit en théorie de créer un contexte cidlookup-custom dans le fichier <code>/etc/asterisk/extensions_custom.conf</code></p>



<p>Sauf que le contexte est inclus, mais il n&rsquo;est pas appelé. Et on ne voit pas bien comment l&rsquo;appeler sans toucher le fichier <code>/etc/asterisk/extensions_additional.conf</code>. Le problème, c&rsquo;est que dans ce cas, à chaque modification de FreePBX via l&rsquo;interface graphique, le fichier extensions_additional.conf est écrasé !</p>



<p>La solution, c&rsquo;est d&rsquo;écraser le contexte cdi-lookup dans <code>/etc/asterisk/extensions_override_freepbx.conf</code>  !!!</p>



<h2 class="wp-block-heading"><strong>Procédure pour la mise en place du filtrage d&rsquo;appelant sur une route entrante</strong></h2>



<h3 class="wp-block-heading">Etape 1 : Création de la whitelist dans MySQL</h3>



<p>Commencer par créer une table pour stocker les numéros de la whiteliste dans la base MySQL de FreePBX. On a créé 2 champs, le nom ou pentagramme dans notre cas particulier et le numéro de téléphone : phonenumber.</p>



<p>Se connecter à la base MySQL en ligne de commande, puis lancer la commande :</p>



<pre class="urvanov-syntax-highlighter-plain-tag">MariaDB [asterisk]&gt; CREATE TABLE cidlookup ( 
  pentagramme varchar(15) COLLATE utf8mb4_unicode_ci NOT NULL, 
  phonenumber varchar(15) COLLATE utf8mb4_unicode_ci NOT NULL, 
  PRIMARY KEY (pentagramme),
  UNIQUE KEY phonenumber_unique (phonenumber)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ;
MariaDB [asterisk]&gt;</pre>



<p>Ajouter quelques enregistrements correspondants aux numéros que vous voulez laisser passer.</p>



<pre class="urvanov-syntax-highlighter-plain-tag">MariaDB [asterisk]&gt; insert into cidlookup (pentagramme, phonenumber) values ('alard', '0634000001');
Query OK, 1 row affected (0.004 sec)
MariaDB [asterisk]&gt;</pre>



<p>Vérifiez le contenu de la whitelist</p>



<pre class="urvanov-syntax-highlighter-plain-tag">MariaDB [asterisk]&gt; select * from cidlookup;
+-------------+-------------+
| pentagramme | phonenumber |
+-------------+-------------+
| paabo       | 0634000003  |
| ancha       | 0634000002  |
| alard       | 0634000001  |
+-------------+-------------+
3 rows in set (0.000 sec)
MariaDB [asterisk]&gt;</pre>



<h3 class="wp-block-heading">Etape 2 : Création d&rsquo;une source de CID Lookup dans FreePBX</h3>



<p>Allez dans le menu Admin/CIDLookup Source</p>



<p>Cliquez sur le bouton pour ajouter une source « + CIDLookup Source » et remplir les champs du formulaire</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="913" height="405" src="https://alain.arditi.fr/wp-content/uploads/2020/10/CIDLookup-1.png" alt="" class="wp-image-198" srcset="https://alain.arditi.fr/wp-content/uploads/2020/10/CIDLookup-1.png 913w, https://alain.arditi.fr/wp-content/uploads/2020/10/CIDLookup-1-300x133.png 300w, https://alain.arditi.fr/wp-content/uploads/2020/10/CIDLookup-1-768x341.png 768w" sizes="(min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></figure>



<p>Enregistrer le formulaire et appliquer la configuration.</p>



<h3 class="wp-block-heading">Etape 3 : Affectation de la whitelist à une route entrante</h3>



<p>Allez dans le menu Inbound routes et choisir la ligne que vous voulez filtrer. En modification, dans l&rsquo;onglet « Other », vous pouvez sélectionner « Whitelist » dans la liste déroulante dans CIDLookup Source. Vous pouvez enregistrer le formulaire et appliquer la configuration.</p>



<p>A cette étape, vous avez appliqué la configuration, si vous appelez le numéro entrant à partir d&rsquo;un des numéros de votre whitelist, il ne se passe rien de particulier. Peut-être voyez vous le nom de l&rsquo;appelant à la place du numéro. C&rsquo;est l&rsquo;objectif de la fonction CIDLookup.</p>



<h3 class="wp-block-heading">Etape 4 : Mise en place du filtrage</h3>



<p>Nous allons modifier le comportement par défaut, afin de bloquer les appels dont le numéro ne se trouve pas dans la whitelist. Il faut créer, s&rsquo;il n&rsquo;existe pas déjà, le fichier /etc/asterisk/extensions_override_freepbx.conf&nbsp;en ajoutant un contexte [cidlookup] qui va écraser celui qui se trouve dans /etc/asterisk/extensions_additional.conf</p>



<p>Pour créer le contexte dans extensions_override_freepbx.conf, le plus simple est de le recopier depuis extensions_additional.conf</p>



<p>Contexte [cdilookup] dans extensions_additional.conf</p>



<pre class="urvanov-syntax-highlighter-plain-tag">[cidlookup]
include =&gt; cidlookup-custom
exten =&gt; cidlookup_2,1,MYSQL(Connect connid localhost user_read user_password asterisk)
exten =&gt; cidlookup_2,n,MYSQL(Query resultid ${connid} SELECT pentagramme FROM cidlookup WHERE phonenumber LIKE '%${CALLERID(num)}%')
exten =&gt; cidlookup_2,n,MYSQL(Fetch fetchid ${resultid} CALLERID(name))
exten =&gt; cidlookup_2,n,MYSQL(Clear ${resultid})
exten =&gt; cidlookup_2,n,MYSQL(Disconnect ${connid})
exten =&gt; cidlookup_2,n,Return()
exten =&gt; cidlookup_return,1,ExecIf($[&quot;${DB(cidname/${CALLERID(num)})}&quot; != &quot;&quot;]?Set(CALLERID(name)=${DB(cidname/${CALLERID(num)})}))
exten =&gt; cidlookup_return,n,Return()
;--== end of [cidlookup] ==--;</pre>



<p>qu&rsquo;on recopie et qu&rsquo;on modifie dans le fichier /etc/asterisk/extensions_override_freepbx.conf comme suit :</p>



<pre class="urvanov-syntax-highlighter-plain-tag">; Fichier qui &eacute;crase les contextes cr&eacute;&eacute;s par FreePBX et qui n'est pas &eacute;cras&eacute; par un restart !
; Si le num n'est pas dans la BDD on interdit l'appel
[cidlookup]
include =&gt; cidlookup-custom
exten =&gt; cidlookup_2,1,MYSQL(Connect connid localhost user_read user_password asterisk)
exten =&gt; cidlookup_2,n,MYSQL(Query resultid ${connid} SELECT pentagramme FROM cidlookup WHERE phonenumber LIKE '%${CALLERID(num)}%')
exten =&gt; cidlookup_2,n,MYSQL(Fetch fetchid ${resultid} CALLERID(name))
exten =&gt; cidlookup_2,n,MYSQL(Clear ${resultid})
exten =&gt; cidlookup_2,n,MYSQL(Disconnect ${connid})
; ligne suppl&eacute;mentaire par rapport au contexte [cidlookup] de FreePBX defini dans extensions_additional.conf
exten =&gt; cidlookup_2,n,ExecIf($[${fetchid} = 0]?Gosub(action-forbidden,s,1()))
exten =&gt; cidlookup_2,n,Return()
exten =&gt; cidlookup_return,1,ExecIf($[&quot;${DB(cidname/${CALLERID(num)})}&quot; != &quot;&quot;]?Set(CALLERID(name)=${DB(cidname/${CALLERID(num)})}))
exten =&gt; cidlookup_return,n,Return()
;--== end of [cidlookup] ==--;
; les fichiers de son se trouvent dans /usr/share/asterisk/sounds/fr/
[action-forbidden]
exten =&gt; s,1,Playback(sorry-cant-let-you-do-that)
 same =&gt; n,Playback(vm-goodbye)
 same =&gt; n,Macro(hangupcall,)
;--== end of [action-forbidden] ==--;</pre>



<p>Une fois que vous avez créé ce fichier, il faut le charger dans Asterisk.<br>Lancer la commande :</p>



<pre class="urvanov-syntax-highlighter-plain-tag"># asterisk -vrx 'dialplan reload'</pre>



<p>Lorsque vous appelez la ligne entrante et que votre numéro n&rsquo;est pas dans la whitelist vous devriez entendre le message <br>« Désolé, je ne peux vous laisser faire cela,<br>au revoir. » et Asterisk raccroche !</p>



<p></p>
<p>L’article <a href="https://alain.arditi.fr/2020/10/29/freepbx-asterisk-filtrage-dappel-avec-mysql/">FreePBX / Asterisk : filtrage d&rsquo;appel avec MySQL</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
