GuiderChatt och e-postTelefonväxeln Asterisk

Driv din egen telefonväxel med Asterisk

Asterisk 22 LTS på Debian 13, en egen telefonväxel med anknytningar som ringer varandra, röstbrevlåda och ekotest, samtal krypterade med TLS och SRTP, telefoner bakom hemmaroutrar och fail2ban mot SIP-skannrar.

Testad på Asterisk 22.11.0 på Debian 13 (trixie) på en server hos Melonslab Uppdaterad 27 september 2026

Rekommenderad server för guiden

VC-S Micro · 2 vCPU · 8 GB Minne · 250 GB Lagring

Månadsvis, ingen bindningstid 7 dagars öppet köp

90 kr/mån

Beställ nu
På den här sidan

Det här sätter du upp

Asterisk är den fria telefonväxeln bakom många företags telefonsystem. Telefoner och SIP-appar registrerar sig hos den under ett anknytningsnummer, och den kopplar samtal mellan dem, tar emot röstmeddelanden och svarar med menyer.

Den här guiden sätter upp Asterisk som den är, med inställningarna i textfiler och utan webbgränssnitt: två anknytningar, 101 och 102, som ringer varandra, en röstbrevlåda när ingen svarar och ett ekotest på 600. Telefonerna ansluter över TLS på port 5061 med ett certifikat från Let's Encrypt, och ljudet krypteras med SRTP.

Debian 13 har inget Asterisk-paket, och Asterisk-projektet ger inte ut någon containeravbildning, så i steg 1 bygger du den aktuella versionen med långtidsstöd, Asterisk 22, från källkoden. Den får buggfixar till oktober 2028 och säkerhetsuppdateringar till oktober 2029. Asterisk körs av systemd som en egen användare, asterisk, och inte som root.

Varje steg nedan har körts på en nyinstallerad VC-P Alloy (2 vCPU, 8 GB) hos Melonslab med Debian 13:

  • Asterisk 22.11.0 byggdes på ungefär 6 minuter.
  • Två SIP-appar registrerade sig över TLS med certifikatet från Let's Encrypt: en på en dator bakom en hemmarouter, över IPv4, och en över IPv6 från själva servern.
  • De ringde varandra åt båda hållen och ringde ekotestet. Ljudet var krypterat med SRTP och gick åt båda hållen utan förlorade paket, och en testton som skickades in i ekotestet kom tillbaka.
  • Den som inte fick svar lämnade ett röstmeddelande, och brevlådans ägare loggade in med sin PIN-kod och lyssnade på det.
  • Med NAT-inställningen i steg 4 avstängd fick appen bakom hemmaroutern inget ljud tillbaka alls.
  • Fel lösenord, okända användarnamn och samtal från appar utan konto nekades, och fail2ban blockerade adressen.
  • När certifikatet förnyades mitt i ett samtal väntade Asterisk tills samtalet var slut innan den startade om.
  • Allt startade igen av sig självt efter en omstart av servern.

Asterisk använde omkring 75 MB minne, och hela servern omkring 450 MB.

Innan du börjar

Du behöver:

  • en server hos Melonslab med Debian 13;
  • ett namn för den, till exempel sip.example.com, med en A-post och en AAAA-post som pekar på den;
  • en SIP-telefon eller SIP-app för varje anknytning, som klarar TLS och SRTP. Leta i appens kontoinställningar efter TLS som transport och SRTP eller SDES som mediekryptering. Våra tester använde baresip, som finns i Debian och körs på Linux.

Sätt upp SSH-nycklar, automatiska säkerhetsuppdateringar och ufw enligt steg 1 till 4 i säkerhetsguiden.

Exemplen använder sip.example.com för servern. Byt genomgående ut det mot ditt eget namn.

1. Bygg Asterisk

Som root installerar du det som bygget behöver:

apt update
apt install -y build-essential pkg-config libedit-dev libjansson-dev libsqlite3-dev uuid-dev libxml2-dev libssl-dev libsrtp2-dev libcurl4-openssl-dev libsystemd-dev bzip2 patch wget curl

libsrtp2-dev ger Asterisk krypterat ljud, och med libsystemd-dev kan den tala om för systemd när den har startat.

Ladda ner Asterisk 22, kontrollera nedladdningen mot dess kontrollsumma och packa upp den. Den senaste versionen finns på nedladdningssidan. Vårt test använde 22.11.0:

cd /usr/local/src
curl -fsSLO https://downloads.asterisk.org/pub/telephony/asterisk/releases/asterisk-22.11.0.tar.gz
curl -fsSLO https://downloads.asterisk.org/pub/telephony/asterisk/releases/asterisk-22.11.0.sha256
sha256sum -c asterisk-22.11.0.sha256
tar xzf asterisk-22.11.0.tar.gz
cd asterisk-22.11.0

sha256sum skriver ut asterisk-22.11.0.tar.gz: OK. Bygg och installera den sedan:

./configure
make menuselect.makeopts
make -j2
make install

configure laddar ner pjproject, SIP-biblioteket som byggs in i Asterisk, och make install laddar ner de engelska röstmeddelandena. Bygget tog ungefär 6 minuter på vår testserver. make install skapar inga inställningar, så katalogen /etc/asterisk är fortfarande tom. Skapa användaren som Asterisk körs som:

adduser --system --group --home /var/lib/asterisk --no-create-home asterisk

2. Skaffa ett certifikat

Telefonerna kontrollerar serverns certifikat när de ansluter över TLS. Certbot hämtar ett från Let's Encrypt och behöver port 80 för det:

apt install -y certbot
ufw allow 80/tcp
certbot certonly --standalone -d sip.example.com

Certbot förnyar certifikatet av sig självt. Asterisk kan inte läsa det där Certbot sparar det, så en krok kopierar det till Asterisk efter varje förnyelse. Skapa /etc/letsencrypt/renewal-hooks/deploy/asterisk:

#!/bin/sh
# Copy the renewed certificate to Asterisk, and restart it once no calls are active.
install -o asterisk -g asterisk -m 600 /etc/letsencrypt/live/sip.example.com/fullchain.pem /etc/letsencrypt/live/sip.example.com/privkey.pem /etc/asterisk/keys/
asterisk -rx "core stop when convenient" >/dev/null 2>&1 &

Asterisk läser bara certifikatet när den startar. core stop when convenient väntar tills inga samtal pågår, och systemd startar Asterisk igen 4 sekunder senare, så en förnyelse bryter aldrig ett samtal. Gör kroken körbar och kör den en gång, så att certifikatet du just fick kopieras:

mkdir -p /etc/asterisk/keys
chmod 755 /etc/letsencrypt/renewal-hooks/deploy/asterisk
/etc/letsencrypt/renewal-hooks/deploy/asterisk

3. Grundinställningarna

Skapa de här fyra filerna i /etc/asterisk. asterisk.conf får Asterisk att lämna root och köras som användaren asterisk:

[options]
runuser = asterisk
rungroup = asterisk

modules.conf laddar alla moduler som har en inställningsfil. De andra avstår, vilket loggen visar med ofarliga rader som app_queue declined to load:

[modules]
autoload = yes

logger.conf skriver meddelanden, fel och säkerhetshändelser till /var/log/asterisk/messages, som fail2ban läser i steg 8:

[logfiles]
console => notice,warning,error
messages => notice,warning,error,security

rtp.conf anger vilka UDP-portar ljudet använder. Varje samtal använder några portar, så 10 000 räcker gott:

[general]
rtpstart = 10000
rtpend = 20000

4. Skapa anknytningarna

Ta fram ett lösenord för varje anknytning. Det matas bara in i telefonen en gång, så gör det långt:

openssl rand -hex 16

Skapa /etc/asterisk/pjsip.conf, med ett eget lösenord för både 101 och 102:

[global]
type = global
user_agent = PBX

[tls-v4]
type = transport
protocol = tls
bind = 0.0.0.0:5061
cert_file = /etc/asterisk/keys/fullchain.pem
priv_key_file = /etc/asterisk/keys/privkey.pem
method = sslv23

[tls-v6]
type = transport
protocol = tls
bind = [::]:5061
cert_file = /etc/asterisk/keys/fullchain.pem
priv_key_file = /etc/asterisk/keys/privkey.pem
method = sslv23

[phone](!)
type = endpoint
context = phones
disallow = all
allow = g722,ulaw,alaw
media_encryption = sdes
direct_media = no
rtp_symmetric = yes
force_rport = yes
rewrite_contact = yes

[auth](!)
type = auth
auth_type = digest

[aor](!)
type = aor
max_contacts = 1
remove_existing = yes
qualify_frequency = 30

[101](phone)
auth = 101
aors = 101
callerid = Anna <101>
mailboxes = 101@default

[101](auth)
username = 101
password = lösenordet-för-101

[101](aor)

[102](phone)
auth = 102
aors = 102
callerid = Bo <102>
mailboxes = 102@default

[102](auth)
username = 102
password = lösenordet-för-102

[102](aor)

Så här fungerar delarna:

  • De två transporterna tar emot TLS på port 5061, en för IPv4 och en för IPv6. Vanlig okrypterad SIP på port 5060 finns inte alls. Med method = sslv23 kan telefonerna använda TLS 1.2 eller 1.3. Utan den erbjuder Asterisk bara TLS 1.0, som dagens telefoner och appar vägrar. TLS 1.0 och 1.1 nekas i båda fallen.
  • user_agent = PBX håller Asterisk-versionen borta ur varje svar som servern skickar.
  • Avsnitten med (!) är mallar, och varje anknytning hämtar sina inställningar från mallen inom parentes, som [101](phone). För att lägga till anknytning 103 kopierar du de tre avsnitten för 102 och byter nummer, namn och lösenord.
  • media_encryption = sdes gör SRTP obligatoriskt: en telefon som inte erbjuder krypterat ljud kan inte ringa.
  • NAT-inställningarna. En telefon bakom en hemmarouter uppger sin privata adress, till exempel 192.168.1.20, som inte går att nå från internet. rtp_symmetric skickar tillbaka ljudet till adressen som telefonens ljud faktiskt kommer från, force_rport och rewrite_contact gör samma sak för dess SIP-meddelanden, och direct_media = no låter ljudet gå via servern. När vi stängde av rtp_symmetric i vårt test skickade appen bakom hemmaroutern 599 ljudpaket och fick inte ett enda tillbaka.
  • qualify_frequency = 30 kontrollerar var 30:e sekund att varje telefon finns kvar. Det håller också anslutningen genom telefonens router öppen, så att inkommande samtal når fram.

Det finns ingen gäståtkomst: bara anknytningarna i den här filen kan registrera sig eller ringa, var och en med sitt lösenord.

5. Skriv nummerplanen och röstbrevlådan

Nummerplanen, dialplan på engelska, bestämmer vad som händer med varje nummer som slås. Skapa /etc/asterisk/extensions.conf:

[phones]
exten => _10[12],1,Dial(PJSIP/${EXTEN},20)
 same => n,VoiceMail(${EXTEN}@default,u)
 same => n,Hangup()

exten => 600,1,Answer()
 same => n,Playback(beep)
 same => n,Echo()
 same => n,Hangup()

exten => 700,1,VoiceMailMain(${CALLERID(num)}@default)
 same => n,Hangup()
  • 101 och 102 ringer i 20 sekunder och går sedan till röstbrevlådan. _10[12] matchar båda. För att lägga till 103 ändrar du det till _10[1-3].
  • 600 är ekotestet: efter pipet hör du det du säger.
  • 700 spelar upp din egen röstbrevlåda, när du har slagit din PIN-kod.

Skapa /etc/asterisk/voicemail.conf, med en egen PIN-kod för varje brevlåda:

[general]
format = wav

[default]
101 => 482913,Anna
102 => 750264,Bo

6. Starta Asterisk

Inställningarna innehåller lösenord, så bara användaren asterisk får läsa dem:

chown -R asterisk:asterisk /etc/asterisk /var/lib/asterisk /var/log/asterisk /var/spool/asterisk
chmod 750 /etc/asterisk /var/spool/asterisk
chmod 640 /etc/asterisk/*.conf

Asterisk har från början en systemd-enhet. Två av dess inställningar är bortkommenterade: RuntimeDirectory, utan vilken användaren asterisk inte kan skapa sin styrsocket efter en omstart av servern, och UMask, som gör att nya röstmeddelanden inte kan läsas av andra användare. Installera den med båda påslagna och starta Asterisk:

cp /usr/local/src/asterisk-22.11.0/contrib/systemd/asterisk.service /etc/systemd/system/
sed -i -e 's/^#RuntimeDirectory=/RuntimeDirectory=/' -e 's/^#UMask=0002/UMask=0027/' /etc/systemd/system/asterisk.service
systemctl daemon-reload
systemctl enable --now asterisk

Öppna portarna för SIP över TLS och för ljudet:

ufw allow 5061/tcp
ufw allow 10000:20000/udp

asterisk -rx kör ett kommando i Asterisk och skriver ut svaret. Kontrollera transporterna:

asterisk -rx "pjsip show transports"
Transport:  tls-v4                    tls      0      0  0.0.0.0:5061
Transport:  tls-v6                    tls      0      0  [::]:5061

asterisk -r öppnar själva Asterisk-konsolen, där du kan skriva samma kommandon. exit lämnar den, och Asterisk fortsätter att köra.

7. Anslut telefonerna

Ställ in varje telefon eller app med:

InställningVärde
Server eller domänsip.example.com
Användarnamn101
Lösenordlösenordet för 101 från steg 4
TransportTLS, port 5061
MediekrypteringSRTP (SDES), obligatoriskt

I baresip ser raden i ~/.baresip/accounts ut så här:

<sip:101@sip.example.com;transport=tls>;auth_pass=lösenordet-för-101;mediaenc=srtp-mand

När båda är anslutna visar servern dem:

asterisk -rx "pjsip show contacts"
  Contact:  101/sip:101-0x560957bdac10@198.51.100.7:8790; c837cce61c Avail         2.576
  Contact:  102/sip:102-0x56380d153890@[2001:db8:5::20]: 51a3c650e8 Avail        41.843

Adressen för 101 är hemmarouterns publika adress och inte den privata som appen uppgav: det är rewrite_contact som gör det. Ring 600 och prata. Efter pipet hör du dig själv. Ring sedan 102 från 101. Under samtalet visar det här ljudet åt båda hållen:

asterisk -rx "pjsip show channelstats"
 BridgeId ChannelId ........ UpTime.. Codec.   Count    Lost Pct  Jitter   Count    Lost Pct  Jitter RTT....
 d801b11e 101-00000003       00:00:15 g722      781       0    0   0.002    787       0    0   0.001   0.002
 d801b11e 102-00000004       00:00:15 g722      787       0    0   0.001    781       0    0   0.002   0.000

Den första Count är paketen som servern har tagit emot från telefonen, och den andra paketen den har skickat till den. Båda ska växa under samtalet. Om 102 inte svarar inom 20 sekunder hamnar den som ringer i 102:s röstbrevlåda, och 102 lyssnar av den genom att ringa 700.

För att ringa vanliga telefonnummer behöver du också en SIP-trunk från en teleoperatör, vilket den här guiden inte tar upp.

8. Håll SIP-skannrarna ute

Program söker igenom internet efter SIP-servrar och provar vanliga anknytningsnummer och lösenord, för att ringa på någon annans konto. Den här uppsättningen ger dem redan lite att gå på: det finns ingenting på port 5060, där de letar först, lösenorden är långa och slumpmässiga, och det finns ingen gäståtkomst. Fel lösenord och okänt användarnamn får samma svar, 401 Unauthorized, så en skanner kan inte ens se vilka anknytningar som finns.

fail2ban blockerar adresser som fortsätter att försöka. Installera det:

apt install -y fail2ban

Skapa /etc/fail2ban/jail.d/asterisk.conf:

[asterisk]
enabled = true
port = 5061
systemctl restart fail2ban
fail2ban-client status asterisk

fail2ban blockerar en adress på port 5061 i 10 minuter när den har hittat 10 misslyckanden från den inom 10 minuter. Asterisk loggar varje misslyckat försök på flera rader, och fail2ban räknar varenda en, så i praktiken räcker två eller tre försök. I vårt test blockerades en app med fel lösenord inom en sekund, eftersom den försökte igen direkt.

Nekade försök syns i loggen som rader av det här slaget:

NOTICE[68430] res_pjsip/pjsip_distributor.c: Request 'REGISTER' from '<sip:101@sip.example.com>' failed for '198.51.100.7:8801' (callid: 9900c3ec2e06cd87) - Failed to authenticate
NOTICE[68430] res_pjsip/pjsip_distributor.c: Request 'INVITE' from '<sip:guest@sip.example.com>' failed for '198.51.100.7:21435' (callid: 2456639b85f6257e) - No matching endpoint found

Så här visar du dem:

grep "failed for" /var/log/asterisk/messages

Under vårt test nådde ingenting annat än våra egna appar port 5061. Som jämförelse öppnade vi vanlig SIP på UDP-port 5060 i en timme: under den tiden skickade en enda adress två felaktiga paket dit, som Asterisk kastade.

9. Säkerhetskopiera och uppdatera

Dina inställningar, röstmeddelandena och Asterisks lilla databas är allt du behöver spara:

umask 077
tar czf /root/asterisk-backup.tar.gz /etc/asterisk /var/spool/asterisk/voicemail /var/lib/asterisk/astdb.sqlite3

Arkivet innehåller lösenorden och den privata nyckeln, så förvara det säkert, någon annanstans än på servern.

Debians säkerhetsuppdateringar täcker biblioteken som Asterisk använder, som OpenSSL, men inte Asterisk själv eller pjproject som är inbyggt i den. Nya versioner av Asterisk 22 kommer var 4:e till 6:e vecka och listas på Asterisks sida för nya versioner på GitHub. För att uppdatera gör du om steg 1 med det nya versionsnumret, från nedladdningen till make install, och kör sedan systemctl restart asterisk. make install lämnar dina inställningar som de är. Vi kunde inte testa en uppdatering, eftersom 22.11.0 var den senaste versionen när vi skrev det här.

Felsökning

En telefon som fungerade kan inte ansluta längre. fail2ban har blockerat den, ofta på grund av ett skrivfel i lösenordet. fail2ban-client status asterisk visar de blockerade adresserna, och fail2ban-client set asterisk unbanip 198.51.100.7 släpper in en igen. Rätta lösenordet i telefonen först, annars blockeras den igen direkt.

Telefonen visar ett fel om TLS eller certifikatet. Kontrollera att den ansluter till namnet på certifikatet, sip.example.com, och inte till IP-adressen, och att katalogen /etc/asterisk/keys innehåller certifikatfilerna. openssl s_client -connect sip.example.com:5061 visar certifikatet som servern skickar.

Samtalen kopplas, men ljudet går bara åt ena hållet. Kontrollera att ufw tillåter 10000:20000/udp och att rtp_symmetric = yes är satt. Om telefonens router har en inställning som heter SIP ALG, stäng av den: den skriver om SIP-meddelanden och kan förstöra samtal. I Asterisk-konsolen visar rtp set debug on varje ljudpaket när det kommer in och går ut, och rtp set debug off stänger av det.

Ett samtal misslyckas direkt med 488 Not Acceptable Here. Telefonen erbjöd inte krypterat ljud. Ställ in dess mediekryptering på SRTP, eller SDES, och gör den obligatorisk.

asterisk -rx svarar "Unable to connect to remote asterisk". Asterisk körs inte, eller så saknas raden RuntimeDirectory i dess enhet. systemctl status asterisk och /var/log/asterisk/messages visar varför.

Kör det på din egen server

VC-S Micro

90 kr/mån

vCPU
2
Minne
8 GB
Lagring
250 GB
Trafik
10 TB
Standard
HDD · RAID 10
  • Full root-åtkomst
  • Nativt /64 IPv6
  • RAID-skyddad lagring
  • Malmö, Sverige
  • Månadsvis, ingen bindningstid
  • 7 dagars öppet köp
Alla guider