Category Archives: Linux & Software

Configurazione di un bonding tra due schede di rete

In questo articolo vedremo come configurare il link aggregation (Bonding) di due schede di rete in Debian, utile per creare connessioni ridondate ed aumentare il throughput del nostro server.

Il software di cui abbiamo bisogno è “ifenslave”, che serve per attivare o disattivare il bonding tra le due schede.

Un bonding device si comporterà come una normale interfaccia ethernet, ma invierà i pacchetti attraverso le interfacce secondarie (slaves) attraverso uno scheduler round-robin. Questo permette un load-balancing, del tutto simile alle tecniche Channel Bonding o Trunking usati negli switch.

Nel nostro esempio abbiamo due interfacce di rete:

202.54.1.1 (eth0)
192.168.1.254 (eth1)

Installiamo ifenslave:

apt-get install ifenslave-2.6

Creiamo ora un file chiamato /etc/modprobe.d/bonding.conf:

vim /etc/modprobe.d/bonding.conf

e vi inseriamo:

alias bond0 bonding
options bonding mode=0 arp_interval=100 arp_ip_target=192.168.1.254, 192.168.1.12

Salviamo e chiudiamo il file. Questa configurazione è molto importante in quanto sarà usata dal driver del Kernel di Linux chiamato “bonding”. Le opzioni sopra inserite sono:

  • mode=0: Dice al driver di usare lo scheduler balance-rr, che sarebbe il round robin. Questo è la modalità di default.
  • arp_interval=100: è l’intervallo (in millisecondi) per il controllo l’arp monitoring. Senza questo parametro all’avvio riceverete molti warning.
  • arp_ip_target=192.168.1.254, 192.168.1.12: usa l’interfaccia collegata al router (192.168.1.254) e l’IP 192.168.1.2 per effettuare l’arp monitoring quando l’arp_interval > 0. Questo è usato per determinare la salute dei nostri link. Possiamo inserire più indirizzi IP, delimitati da una virgola. Dobbiamo inserire chiaramente almeno un indirizzo IP.

A questo momento carichiamo il driver:

modprobe bonding

Controlliamo che l’interfaccia virtuale sia stata creata:

ifconfig bond0

Ora fermiamo le due interfacce preconfigurate:

/etc/init.d/networking stop

Mofifichiamo il file di configurazione della rete di debian:

cp /etc/network/interfaces /etc/network/interfaces.bak
vim /etc/network/interfaces

Eliminiamo le entry eth0 ed eth1 che al momento non servono più ed inseriamo la entry relativa al bonding:

# The primary network interface
auto bond0
iface bond0 inet static
address 192.168.1.10
netmask 255.255.255.0
network 192.168.1.0
gateway 192.168.1.254
slaves eth0 eth1
# jumbo frame support
mtu 9000
# Load balancing and fault tolerance
bond-mode balance-rr
bond-miimon 100
bond-downdelay 200
bond-updelay 200

Salviamo e chiudiamo.

Un po’ di spiegazione su quest’ultima entry:

  • address 192.168.1.10: indirizzo IP di bond0
  • netmask 255.255.255.0: netmask di bond0
  • network 192.168.1.0: network di bond0
  • gateway 192.168.1.254: default gateway di bond0
  • slaves eth0 eth1: specifichiamo le interfacce reali dove fare il bonding
  • mtu 9000: settiamo l’MTU a 9000
  • bond-mode balance-rr: settiamo il bonding come “Load balancing and fault tolerance”
  • bond-miimon 100: settiamo il link monitoring a 100 millisecondi
  • bond-downdelay 200: ritardo massimo di un link prima di essere dichiarato “failed”
  • bond-updelay 200: ritardo massimo di un link prima di essere dichiarato “up”

A questo punto effettuiamo un restart della rete:

/etc/init.d/networking restart

Controlliamo che tutto sia andato bene:

ifconfig

Dovremmo avere qualcosa simile a:

bond0 Link encap:Ethernet HWaddr 00:xx:yy:zz:tt:31
inet addr:192.168.1.10 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::208:9bff:fec4:3031/64 Scope:Link
UP BROADCAST RUNNING MASTER MULTICAST MTU:9000 Metric:1
RX packets:2414 errors:0 dropped:0 overruns:0 frame:0
TX packets:1559 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:206515 (201.6 KiB) TX bytes:480259 (469.0 KiB)
eth0 Link encap:Ethernet HWaddr 00:xx:yy:zz:tt:31
UP BROADCAST RUNNING SLAVE MULTICAST MTU:9000 Metric:1
RX packets:1214 errors:0 dropped:0 overruns:0 frame:0
TX packets:782 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:103318 (100.8 KiB) TX bytes:251419 (245.5 KiB)
Memory:fe9e0000-fea00000
eth1 Link encap:Ethernet HWaddr 00:xx:yy:zz:tt:31
UP BROADCAST RUNNING SLAVE MULTICAST MTU:9000 Metric:1
RX packets:1200 errors:0 dropped:0 overruns:0 frame:0
TX packets:777 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:103197 (100.7 KiB) TX bytes:228840 (223.4 KiB)
Memory:feae0000-feb00000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:560 (560.0 B) TX bytes:560 (560.0 B)

Per controllare lo status del bonding possiamo digitare:

cat /proc/net/bonding/bond0

Dovremmo avere qualcosa simile a:

Ethernet Channel Bonding Driver: v3.5.0 (November 4, 2008)
Bonding Mode: load balancing (round-robin)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 200
Down Delay (ms): 200
Slave Interface: eth0
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:xx:yy:zz:tt:31
Slave Interface: eth1
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:xx:yy:zz:tt:30

Se un link aggregation non è andato a buon fine avremo:

cat /proc/net/bonding/bond0

 

Ethernet Channel Bonding Driver: v3.5.0 (November 4, 2008)
Bonding Mode: load balancing (round-robin)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 200
Down Delay (ms): 200
Slave Interface: eth0
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:xx:yy:zz:tt:31
Slave Interface: eth1
MII Status: down
Link Failure Count: 1
Permanent HW addr: 00:xx:yy:zz:tt:30

Vi ricordo che anche il file /var/log/messages contiene importanti informazioni sullo stato del bonding:

Sep 5 04:20:21 nas01 kernel: [ 6517.492974] e1000e: eth1 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX/TX
Sep 5 04:20:21 nas01 kernel: [ 6517.548029] bonding: bond0: link status up for interface eth1, enabling it in 200 ms.
Sep 5 04:20:21 nas01 kernel: [ 6517.748016] bonding: bond0: link status definitely up for interface eth1.

Sep 5 04:16:15 nas01 kernel: [ 6271.468218] e1000e: eth1 NIC Link is Down
Sep 5 04:16:15 nas01 kernel: [ 6271.548027] bonding: bond0: link status down for interface eth1, disabling it in 200 ms.
Sep 5 04:16:15 nas01 kernel: [ 6271.748018] bonding: bond0: link status definitely down for interface eth1, disabling it

Politiche di link aggregation del bonding di Linux

  • balance-rr or 0: Politica di round robin. I pacchetti sono inviati in sequenza dal primo slave disponibile fino all’ultimo. Questa modalità supporta il load balancing ed il fault tollerance.
  • active-backup or 1: Politica di backup attivo. Solo uno slave nel bond è attivo, Un altro slave diventa attivo soltanto se il primo fallisce. Questa modalità supporta il fault tollerance.
  • balance-xor or 2: secondo altre fonti la policy di default è [(source MAC address XOR’d with destination MAC address) modulo slave count]. Fornisce load balancing e fault tollerance
  • broadcast or 3: Trasmette tutto il traffico a tutti gli slave
  • 802.3ad or 4: Crea gruppi di aggregazione che condividono la stessa velocità e duplex. Utilizza gli slave attivi secondo lo standard 802.3ad. Molti switch avranno bisogno di configurazioni avanzate per utilizzare 802.3ad.
  • balance-tlb or 5: Il traffico in uscita è instradato secondo il carico sulle singole interfacce di rete. Il traffico in entrata è ricevuto dallo slave corrente. Se lo slave ricevente fallisce, un altro slave diventerà automaticamente ricevente prendendo il suo mac address.
  • balance-alb or 6: include il balance-tlb ed in più effettua il load balancing in entrata tramite l’arp negotiation.

Creazione di una Web Radio completa

In questo articolo vi spiegherò come ho creato la mia web radio: Radio passaggio a Scirocco partendo da zero ed utilizzando supporti open-source e musica libera dai diritti d’autore.

Si parte inizialmente dalla filosofia e dalla possibilità o meno di “pagare”. Per avere una webradio “regolare” occorre essere iscritti alla SIAE. Ad oggi, per una radio da massimo 30 utenti simultanei NON COMMERCIALE bisogna pagare circa 300 euro l’anno.

Essendo il mio un progetto totalmente amatoriale e personale, ho deciso di evitare di pagare la SIAE e di utilizzare soltanto musica di artisti non iscritti alla SIAE (licenze creative common e aperte), però in caso vi interessasse qualcosa di più “main stram”, potete fare un giro nel sito di Mondo, che è molto ferrato in materia.

Per avere un po’ di buon “materiale” da suonare, mi sono fatto un giro su Free Music Archive, un database di musica gratuita che può essere riprodotta e scaricata gratis.

Al momento non prevedo di inserire delle trasmissioni “live“, ma di suonare musica a rotazione (un jukebox via internet insomma). Ho poi pensato che sarebbe stato meglio registrare le trasmissioni in locale e poi farle ruotare sul server. Questo perché non è facile con una strumentalizzazione amatoriale (pc + streaming server) creare buoni stacchi e tagli.

Come server utilizzerò una Debian Squeeze aggiornata, server web Apache e Icecast2 come server di streaming.

Per prima cosa installiamo icecast2 ed ices2, i due programmi che si occuperanno di effettuare lo streaming della musica ai vostri ascoltatori:

apt-get install icecast2 ices2

una volta installati, questi programmi vanno configurati. Si parte con il file di configurazione di icecast2: /etc/icecast2/icecast.xml. Le parti più importanti del file sono:

<--! massimo numero di clienti simultanei -->
<clients>100</clients>
<sources>2</sources>
<threadpool>5</threadpool>
<queue-size>902400</queue-size>
<client-timeout>30</client-timeout>
<header-timeout>15</header-timeout>
<source-timeout>10</source-timeout>
<burst-on-connect>1</burst-on-connect>
<burst-size>65535</burst-size>

<authentication>
<!-- Password di Ices2 -->
<source-password>sourcepass</source-password>
<!-- Password per Relay (inutilizzato al momento) -->
<relay-password>relaypass</relay-password>

<!-- Password per la web UI -->
<admin-user>admin</admin-user>
<admin-password>adminpass</admin-password>
</authentication>
<hostname>buleria.acido.be</hostname>

<listen-socket>
<port>8000</port>
<!-- <bind-address>109.169.37.166</bind-address> -->
<!-- <shoutcast-mount>/stream</shoutcast-mount> -->
</listen-socket>

Una volta modificato il file, lo avviamo:

/etc/init.d/icecast2 restart

Passiamo poi a ices2: prima di tutto creo il suo ambiente e mi prendo un file di configurazione standard:

mkdir -p /home/ices/music
cp /usr/share/doc/ices2/examples/ices-playlist.xml > /home/ices/

Inizio poi a modificare il file di configurazione. Ecco le parti più importanti:

<ices>
<!-- fork in background -->
<background>1</background>
<!-- location dei logs -->
<logpath>/var/log/ices</logpath>
<logfile>ices.log</logfile>
<!-- 1=error,2=warn,3=info,4=debug -->
<loglevel>4</loglevel>

<stream>

<input>
<module>playlist</module>
<param name="type">basic</param>
<param name="file">/home/ices/playlist.txt</param>
<!-- random play -->
<param name="random">1</param>
<!-- Se la playlist viene cambiata, il playback inizia da capo -->
<param name="restart-after-reread">0</param>
<!-- Se è messo a 1, riproduce tutta la playlist e poi esce -->
<param name="once">0</param>
</input>
<instance>
<!-- Credenziali per il collegamento ad icecast2 -->
<hostname>localhost</hostname>
<port>8000</port>
<password>sourcepass</password>
<mount>/radio</mount>
<reconnectdelay>2</reconnectdelay>
<reconnectattempts>5</reconnectattempts>
<maxqueuelength>80</maxqueuelength>
<encode>
<!-- Bitrate -->
<nominal-bitrate>64000</nominal-bitrate>
<samplerate>44100</samplerate>
<channels>2</channels>
</encode>
</instance>

</stream>
</ices>

A questo punto dobbiamo caricare la nostra prima canzone! Ices2 utilizza OGG come formato musicale open source, quindi probabilmente dovremo convertire il nostro mp3 prima di poterlo mettere in playlist:

mpg321 -q nomefile.mp3 -w - | oggenc -b256 -o nomefile.ogg -

e poi metterlo in playlist:

ls ./*.ogg > /home/ices/playlist.txt

Nel mio caso, dopo qualche test ho preferito effetturare l’encoding del file a 256kb/s ed uno stream a 64kb/s. Questo mi permette di risparmiare banda utilizzando uno stream bitrate basso, ma di avere comunque una buona qualità di ascolto.

Feedbacks sono ben accetti.

Infine avviamo ices2:

ices2 /home/ices/ices-config.xml

Proviamo ad aprire il nostro player musicale (iTunes, VLC, Winamp..), inserendo nel mio caso il seguente URL:

http://buleria.acido.be:8000/radio

Se tutto è andato bene, possiamo mettere l’avvio automatico di ices inserendo il comando nel file /etc/rc.local

Per fare questa operazione su un largo numero di files, mi sono creato uno scriptino in bash: mp32ogg.sh  che rinomina i files mp3 togliendo gli spazi, fa l’encoding dei files ogg inserendo anche gli ID3 ed infila tutto nella playlist di ices2.

Per poterlo usare, la cartella contenente i files mp3 non può avere spazi (mentre i nomi dei files sì) e lo script va lanciato con i path ASSOLUTI. Es:

sh mp32ogg.sh /home/ices/music/album_in_mp3

Il problema è che su Debian al momento, lo script ufficiale per fare encoding di files ogg – mp32ogg – è rotto e perl va in errore. Ho dovuto riparare da me.

Questo script è scritto “con la zappa”, ovvero fa uscire a video un sacco di errori, a volte mpg123 va in segfault, ed è successo che gli ID3 se non sono scritti bene uscissero errati, ma funziona nel 95% dei casi. Se qualcuno ha voglia e tempo di fargli un paio di fix ne sarei contento 😉

Potete controllare tutti i parametri della radio aprendo con un browser questo indirizzo:

http://buleria.acido.be:8000

Per entrare nell’area admin dovrete loggarvi con “admin” e la “adminpass” che avete specificato nel file di configurazione di icecast2

A questo punto, dopo aver messo in piedi la vostra radio bisogna passare al sito web.

Ho pensato che, essendo una web radio, la parte più importante debba essere la musica, quindi ho voluto creare una pagina web molto semplice dove ci fosse solo il player in html5 e qualche info:

http://pas.acido.be

Una cosa che in una web radio è molto utile è l’indicazione in tempo reale della canzone che si sta ascoltando. Per fare questo, ho trovato uno script da qualche parte nel web che prende le info di http://buleria.acido.be:8000/status.xsl e le inserisce in un html. Nella pagina index ho poi inserito un javascript che fa l’update del DIV dove verranno stampate le informazioni.

Per comodità potete scaricare il sorgente completo di http://pas.acido.be e modificarlo a vostro piacimento.

A questo punto la radio è completa! Buon divertimento!

sender-id=temperror su hotmail con record SPF

Se avete problemi a recapitare messaggi email ad indirizzi Hotmail.com, Live.com e Msn.com; potreste avere dei problemi con i record SPF. Ecco cosa ho scoperto.

Ho dovuto fare assistenza ad un server mail che non riusciva ad inviare email in “posta in arrivo” su Hotmail, ma soltando in “posta indesiderata” o “junk folder“.

Ho dato un’occhiata agli header e ho trovato qualcosa che non andava:

Authentication-Results: hotmail.com; sender-id=temperror (sender IP is 109.169.37.210)

Se avete correttamente installato SPF, dkim e il reverse DNS e vi chiedete come aggiungere questo record sender-id al vostro dominio, sappiate che Hotmail non usa i DNS mondiali per il suo database sender-id.

Loro hanno un loro server DNS interno che registra in cache i record sender-id e li mette a disposizione degli MX. Tale cache SPF è aggiornata due volte al giorno. Tutti gli errori “TempError” sono divuti dal fatto che l’SPF del tuo dominio non è stato ancora inserito nei loro database.

Per far sì che il tuo dominio venga aggiunto, devi inviare una mail a [email protected] con il tuo dominio riportato, oppure riempire il form a questo indirizzo. Loro lo aggiungeranno, ma con molta calma. E’ un processo manuale e la cache viene aggiornata solo due volte al giorno.

Dopo circa 48 ore dall’invio della richiesta, sono stato contattato da Microsoft con questa email:

<!-- p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Helvetica} p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Helvetica; color: #2951a9} span.s1 {text-decoration: underline ; color: #2951a9} span.s2 {color: #000000} span.s3 {text-decoration: underline} -->Hi,

We've successfully added your domain to our Sender ID queue. However, please take note that this does not guarantee that your emails will de delivered to your recipients' inbox. Publishing your SPF records and enrolling in our Junk Mail Reporting Program (JMRP) are the two policy requirements of Hotmail.

If you are still unable to send emails to Hotmail users, please confirm that your emails comply with Windows Live Hotmail's technical standards. Additional information on common deliverability issues and best practices can be found on the Windows Live/Hotmail Postmaster Site found at <a href="http://postmaster.live.com/Guidelines.aspx">http://postmaster.live.com/Guidelines.aspx</a>

To enroll in our Junk Mail Reporting program, please visit <a href="https://support.msn.com/eform.aspx?productKey=edfsjmrpp&amp;ct=eformts">https://support.msn.com/eform.aspx?productKey=edfsjmrpp&amp;ct=eformts</a>

L’errore persiste ancora, però al momento riesco a passare per il filtro senza essere marcato come SPAM content.

Molti dicono che il loro sistema di controllo delle email e il loro filtro antispam sono affetti da qualche BUG, alcuni dicono che proprio non funzionano e dobbiamo affidarci alla sorte. Io ho fatto tutto quello richiesto da Microsoft per avere i miei messaggi correttamente consegnati. Vediamo un po’ quel che succede.

Come prevenire i bruteforce con Iptabes

Ci sono vari modi per bannare un ip che sta effettuando un attacco di bruteforce al server SSH sul nostro server. Vediamo come fare con Iptables.

Il modo è molto semplice, anche se non è utilizzato da molti, in quanto anche il software fail2ban offre questa feature insieme alle altre. Le regole da inserire sono tre ed utilizzeremo un modulo di Iptables chiamato RECENT, che offre la possibilità di marcare i pacchetti a seconda della frequenza con il quale vengono mandati.

Vediamo l’esempio, e consideriamo che l’interfaccia utilizzata sia eth0

Inizialmente dico ad Iptables di creare un database chiamato SSH degli IP che tentano di connettersi alla porta 22 (server SSH):

iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH

Dopodiché loggo tutti gli IP che effettuano 3 nuove connessioni in meno di 300 secondi:

iptables -A INPUT -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-level info --log-prefix "SSH SCAN blocked: "

Infine blocco gli IP

iptables  -A INPUT -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP

Una volta che saranno passati i 300 secondi dovrò rimuovere il ban dagli IP:

iptables -A INPUT   -m recent --name SSH --remove

Quello che ho ottenuto è un ban automatico di 300 secondi di un IP che sbaglia 2 volte la password. Se si utilizzano le chiavi SSH è perfetto. Per vedere gli IP che vengono bloccati, essi saranno loggati in /var/log/syslog. Il database degli ip creato da Iptables si trova in /proc/net/ipt_recent/.

Ecco il mio in questo momento:

maradona:/home/luca# cat /proc/net/ipt_recent/SSH
src=66.96.207.19 ttl: 53 last_seen: 1574688771 oldest_pkt: 17 1574675627, 1574676051, 1574676051, 1574676070, 1574676070, 1574676070, 1574676899, 1574676899, 1574677663, 1574677663, 1574677663, 1574678595, 1574678595, 1574681987, 1574681987, 1574688771, 1574688771, 1574675452, 1574675452, 1574675627
src=121.184.33.56 ttl: 45 last_seen: 1523900419 oldest_pkt: 1 1523900419
src=59.30.218.148 ttl: 46 last_seen: 1550603547 oldest_pkt: 1 1550603547
src=122.70.150.106 ttl: 112 last_seen: 1561734410 oldest_pkt: 1 1561734410
src=218.108.0.91 ttl: 112 last_seen: 1580437381 oldest_pkt: 1 1580437381
src=61.236.182.11 ttl: 52 last_seen: 1584381984 oldest_pkt: 4 1584379536, 1584379536, 1584381984, 1584381984, 1584377172, 1584377172, 1584377242, 1584377242, 1584377394, 1584377394, 1584377700, 1584377700, 1584377922, 1584377922, 1584377922, 1584378312, 1584378312, 1584379421, 1584379421, 1584379421
src=195.228.135.138 ttl: 112 last_seen: 1525774504 oldest_pkt: 1 1525774504
src=64.120.26.34 ttl: 52 last_seen: 1548030041 oldest_pkt: 10 1548007267, 1548007267, 1548007583, 1548007583, 1548014434, 1548014434, 1548015069, 1548015069, 1548030041, 1548030041, 1548001891, 1548001968, 1548001968, 1548002398, 1548002398, 1548002398, 1548003683, 1548003683, 1548003840, 1548003840
src=38.108.125.101 ttl: 55 last_seen: 1551424865 oldest_pkt: 1 1551424865
src=85.114.140.73 ttl: 118 last_seen: 1594716674 oldest_pkt: 1 1594716674
src=59.1.90.140 ttl: 46 last_seen: 1550619212 oldest_pkt: 1 1550619212
src=174.36.85.36 ttl: 119 last_seen: 1551527977 oldest_pkt: 1 1551527977
src=211.202.2.107 ttl: 49 last_seen: 1552508574 oldest_pkt: 10 1552476845, 1552476845, 1552478775, 1552478775, 1552483035, 1552483035, 1552491546, 1552491546, 1552508574, 1552508574, 1552475052, 1552475052, 1552475346, 1552475346, 1552475346, 1552475586, 1552475586, 1552476649, 1552476649, 1552476845
src=64.120.26.58 ttl: 52 last_seen: 1589438178 oldest_pkt: 10 1589425634, 1589426141, 1589426141, 1589426141, 1589427426, 1589427426, 1589431010, 1589431010, 1589438178, 1589438178, 1589424066, 1589424066, 1589424290, 1589424290, 1589424641, 1589424641, 1589424641, 1589424738, 1589424738, 1589425634
src=93.93.129.125 ttl: 54 last_seen: 1601942176 oldest_pkt: 19 1601925043, 1601925313, 1601925313, 1601925572, 1601925572, 1601925572, 1601925857, 1601925857, 1601926945, 1601926945, 1601927078, 1601927078, 1601927078, 1601929122, 1601929122, 1601933473, 1601933473, 1601942176, 1601942176, 1601925043
src=112.161.94.145 ttl: 46 last_seen: 1577293804 oldest_pkt: 1 1577293804
src=62.128.149.44 ttl: 50 last_seen: 1562069800 oldest_pkt: 2 1562069208, 1562069800
src=125.138.59.232 ttl: 46 last_seen: 1586717876 oldest_pkt: 1 1586717876
src=14.37.84.210 ttl: 46 last_seen: 1549261247 oldest_pkt: 1 1549261247
src=178.162.239.192 ttl: 54 last_seen: 1593634277 oldest_pkt: 10 1593616610, 1593616610, 1593616805, 1593616805, 1593619302, 1593619302, 1593624293, 1593624293, 1593634277, 1593634277, 1593614621, 1593614621, 1593614934, 1593614934, 1593615110, 1593615110, 1593615110, 1593615557, 1593615557, 1593616610
src=60.190.216.90 ttl: 50 last_seen: 1549489599 oldest_pkt: 0 1549486840, 1549486840, 1549487023, 1549487023, 1549487392, 1549487392, 1549487510, 1549487510, 1549487510, 1549488127, 1549488127, 1549489010, 1549489010, 1549489010, 1549489599, 1549489599, 1549492543, 1549492543, 1549498431, 1549498431
src=112.220.100.226 ttl: 43 last_seen: 1563702466 oldest_pkt: 10 1563673299, 1563673299, 1563674914, 1563674914, 1563678850, 1563678850, 1563686722, 1563686722, 1563702466, 1563702466, 1563671471, 1563671471, 1563671799, 1563671799, 1563671799, 1563671963, 1563671963, 1563672946, 1563672946, 1563673299
src=109.168.123.134 ttl: 120 last_seen: 1571008152 oldest_pkt: 1 1571008152
src=31.210.72.73 ttl: 50 last_seen: 1590914007 oldest_pkt: 9 1590893785, 1590894295, 1590894295, 1590897111, 1590897111, 1590902743, 1590902743, 1590914007, 1590914007, 1590891831, 1590891831, 1590892183, 1590892183, 1590892285, 1590892285, 1590892285, 1590892887, 1590892887, 1590893785, 1590893785
src=109.230.232.145 ttl: 55 last_seen: 1592528351 oldest_pkt: 1 1592528351
src=58.68.174.76 ttl: 54 last_seen: 1520319496 oldest_pkt: 10 1520303368, 1520303369, 1520303369, 1520303369, 1520305672, 1520305672, 1520310280, 1520310280, 1520319496, 1520319496, 1520301352, 1520301352, 1520301640, 1520301640, 1520301869, 1520301869, 1520301869, 1520302216, 1520302216, 1520303368
src=218.108.85.240 ttl: 112 last_seen: 1578974064 oldest_pkt: 1 1578974064
src=95.250.59.247 ttl: 49 last_seen: 1515911697 oldest_pkt: 1 1515911697
src=81.56.117.225 ttl: 47 last_seen: 1562139443 oldest_pkt: 15 1562137225, 1562137303, 1562137303, 1562137303, 1562137911, 1562137911, 1562137955, 1562137955, 1562138784, 1562138784, 1562138784, 1562139351, 1562139351, 1562139443, 1562139443, 1562136857, 1562136857, 1562137199, 1562137199, 1562137225
src=41.139.66.52 ttl: 50 last_seen: 1573686109 oldest_pkt: 1 1573686109
src=109.70.149.42 ttl: 55 last_seen: 1558340790 oldest_pkt: 10 1558325333, 1558325425, 1558325425, 1558325425, 1558327542, 1558327542, 1558331958, 1558331958, 1558340790, 1558340790, 1558323402, 1558323402, 1558323678, 1558323678, 1558323926, 1558323926, 1558323926, 1558324230, 1558324230, 1558325333
src=61.232.11.146 ttl: 115 last_seen: 1590588858 oldest_pkt: 1 1590588858

Trunk SIP multipli con FeePBX e HANGUPCAUSE = 21

Piccolo suggerimento che spiega come attivare due trunk SIP su FreePBX senza ricevere l’errore HANGUPCAUSE = 21.

Nel mio scenario i trunk erano tre e tutti provenienti dallo stesso provider, ogni provider aveva il suo prefisso di teleselezione.
Ho notato che i primi due non funzionavano, mentre il terzo sì. Provandoli singolarmente con un telefono VoIP funzionavano tutti senza problemi.
L’errore che riscontravo era “Dial failed for some reason with DIALSTATUS = CONGESTION and HANGUPCAUSE = 21”. Il SIP phone falliva la chiamata in uscita dando come errore “forbidden”.
Attivando il debug sulla shell di Asterisk.

sip set debug on

ho notato che ricevevo dal provider degli “access denied” o “login failed”. Ho controllato le credenziali ed ovviamente era tutto giusto.
Guardando su internet ho poi scoperto che con FreePBX (ma mi immagino anche con asterisk o altre soluzioni), in caso di trunk multipli, dobbiamo specificare anche l’utente da utilizzare. Andremo quindi nella sezione “Trunk”, selezioneremo il trunk desiderato e aggiungeremo l’opzione fromuser= nel form PEER details.
Questo è il mio box PEER details:

username=XXXXX
type=peer
secret=supersegreta
host=sip.myprovidervoip.com
insecure=very
dtmfmode=rfc2833
canreinvite=no
context=from-pstn
fromuser=XXXXX

Aggiungendo fromuser= ad ogni trunk, tutte e tre le linee telefoniche hanno iniziato a funzionare correttamente.