Boken "Linux i praktiken"

Boken "Linux i praktiken" Hej, Habr-besökare! I boken beskriver David Clinton 12 verkliga projekt, inklusive automatisering av backup- och ÄterstÀllningssystem, att stÀlla in en personlig filmoln som Dropbox och skapa en egen MediaWiki-server. Genom intressanta exempel lÀr du dig virtualisering, katastrofÄterstÀllning, sÀkerhetslösningar, backup, implementering av DevOps och felsökning av system. Varje kapitel avslutas med en översikt av praktiska rekommendationer, ett lexikon av nya termer och övningar.

Utdrag "10.1. Skapande av en OpenVPN-tunnel"

I den hÀr boken har jag redan berÀttat en hel del om kryptering. SSH och SCP kan skydda data som överförs genom fjÀrranslutningar (kapitel 3), filkryptering skyddar data nÀr de lagras pÄ servern (kapitel 8), och TLS/SSL-certifikat kan skydda data vid överföring mellan webbplatser och klientwebblÀsare (kapitel 9). Men ibland behövs en bredare skyddsnivÄ för dina data. Till exempel kan vissa medlemmar av ditt team behöva arbeta pÄ resande fot och ansluta till nÀtverket över Wi-Fi via offentliga hotspots. Det Àr definitivt inte sÀkert att alla sÄdana hotspots Àr trygga, men dina anstÀllda behöver verkligen ett sÀtt att ansluta till företagets resurser - och en VPN kan hjÀlpa till i detta fall.

En vÀl utformad VPN-tunnel sÀkerstÀller en direkt anslutning mellan fjÀrrklienter och servern pÄ ett sÀtt som döljer data vid överföring genom osÀkra nÀtverk. SÄ vad? Du har redan sett mÄnga verktyg som kan göra detta med hjÀlp av kryptering. Den verkliga vÀrdet av en VPN Àr att nÀr en tunnel öppnas kan avlÀgsna nÀtverk kopplas samman, som om de alla vore lokala. PÄ sÄ sÀtt anvÀnder du en bypass.

Genom att anvÀnda ett sÄdant utvidgat nÀtverk kan administratörer utföra sitt arbete pÄ sina servrar frÄn vilken plats som helst. Men viktigare Àr att ett företag med resurser som Àr spridda över flera filialer kan göra dem alla synliga och tillgÀngliga för alla grupper som behöver dem, oavsett var de finns (figur 10.1).

En tunnel i sig sjÀlv garanterar inte sÀkerhet. Men en av standarderna för kryptering kan inkluderas i nÀtverksstrukturen vilket vÀsentligt ökar sÀkerhetsnivÄn. Tunnlar skapade med hjÀlp av OpenVPN-paketet med öppen kÀllkod anvÀnder den samma kryptering TLS/SSL som du redan har lÀst om. OpenVPN Àr inte det enda tillgÀngliga alternativet för tunneling, men det Àr ett av de mest kÀnda. Det anses vara nÄgot snabbare och sÀkrare Àn det alternativa tunnelingprotokollet pÄ nivÄ 2 som anvÀnder IPsec-kryptering.

Vill du att alla i ditt team ska kunna kommunicera sÀkert med varandra, oavsett om de Àr pÄ vÀg eller arbetar i olika byggnader? För detta behöver du skapa en OpenVPN-server för att möjliggöra delning av applikationer och Ätkomst till den lokala nÀtverksmiljön pÄ servern. För att detta ska fungera krÀvs det att du kör tvÄ virtuella maskiner eller tvÄ containrar: en för att fungera som server/vÀrd och en annan för klienten. Att skapa en VPN Àr en komplex process, sÄ det kan vara vÀrt att ta nÄgra minuter för att fÄ en översikt över helheten.

Boken "Linux i praktiken"

10.1.1. Konfigurera OpenVPN-servern

Innan du börjar, jag vill ge dig ett nyttigt tips. Om du planerar att göra allt sjÀlv (och jag rekommenderar starkt att du gör det), kommer du förmodligen att upptÀcka att du arbetar med flera terminalfönster öppna pÄ skrivbordet, dÀr varje fönster Àr anslutet till sin egen maskin. Det finns en risk att du vid nÄgot tillfÀlle kommer att skriva in ett kommando i fel fönster. För att undvika detta kan du anvÀnda kommandot hostname för att Àndra maskinens namn som visas i kommandoraden till nÄgot som tydligt anger var du befinner dig. NÀr du har gjort detta behöver du logga ut frÄn servern och logga in igen för att de nya instÀllningarna ska trÀda i kraft. SÄ hÀr ser det ut:

Boken "Linux i praktiken"
Genom att följa detta tillvÀgagÄngssÀtt och ge varje maskin ett lÀmpligt namn kan du enkelt hÄlla reda pÄ var du Àr.

Efter att ha anvÀnt hostname kan du stöta pÄ irriterande meddelanden om att kunna lösa vÀrdnamnet OpenVPN-Server nÀr du kör efterföljande kommandon. Att uppdatera filen /etc/hosts med det nya lÀmpliga vÀrdnamnet bör lösa problemet.

Förbereda din server för OpenVPN

För att installera OpenVPN pÄ din server behövs tvÄ paket: openvpn och easy-rsa (för att hantera processen för att generera krypteringsnycklar). AnvÀndare av CentOS bör först installera epel-release-repositoryt vid behov, precis som du gjorde i kapitel 2. För att kunna kontrollera Ätkomsten till serverapplikationen kan du ocksÄ installera webbservern Apache (apache2 för Ubuntu och httpd pÄ CentOS).

Medan du stÀller in servern rekommenderar jag att du aktiverar brandvÀggen, som blockerar alla portar utom 22 (SSH) och 1194 (standardporten för OpenVPN). Det hÀr exemplet visar hur ufw fungerar i Ubuntu, men jag Àr sÀker pÄ att du fortfarande kommer ihÄg programmet firewalld CentOS frÄn kapitel 9:

# ufw enable
# ufw allow 22
# ufw allow 1194

För att tillÄta intern routing mellan nÀtverksgrÀnssnitten pÄ servern behöver du avkommentera en rad (net.ipv4.ip_forward = 1) i filen /etc/sysctl.conf. Detta kommer att möjliggöra omdirigering av fjÀrrklienter vid behov efter deras anslutning. För att den nya parametern ska trÀda i kraft, kör sysctl -p:

# nano /etc/sysctl.conf
# sysctl -p

Nu Àr servermiljön helt konfigurerad, men det finns fortfarande nÄgra saker kvar att göra innan du Àr redo: du behöver utföra följande steg (vi kommer att gÄ igenom dem i detalj lÀngre fram).

  1. Skapa en uppsÀttning nycklar för infrastrukturen med öppna nycklar (PKI) pÄ servern med hjÀlp av skripten som följer med easy-rsa-paketet. I grunden fungerar OpenVPN-servern Àven som sin egen certifieringsmyndighet (CA).
  2. Förbered motsvarande nycklar för klienten
  3. Konfigurera serverns server.conf-fil
  4. Konfigurera din OpenVPN-klient
  5. Kontrollera din VPN

Generering av krypteringsnycklar

För att göra livet enklare kan du konfigurera din nyckelinfrastruktur pÄ samma maskin som OpenVPN-servern körs pÄ. Men i sÀkerhetsrekommendationer rekommenderas det vanligtvis att anvÀnda en separat CA-server för produktionsmiljöer. Processen för att generera och fördela krypteringsnycklar för anvÀndning i OpenVPN illustreras i fig. 10.2.

Boken "Linux i praktiken"
NÀr du installerade OpenVPN skapades automatiskt katalogen /etc/openvpn/, men den Àr fortfarande tom. Paketen openvpn och easy-rsa levereras med exempel pÄ mallfiler som du kan anvÀnda som bas för din konfiguration. För att starta certifieringsprocessen, kopiera easy-rsa-mallkatalogen frÄn /usr/share/ till /etc/openvpn och navigera till katalogen easy-rsa/:

# cp -r /usr/share/easy-rsa/ /etc/openvpn
$ cd /etc/openvpn/easy-rsa

Katalog easy-rsa kommer nu att innehÄlla en hel del skript. I tabell 10.1 anges de verktyg som du kommer att anvÀnda för att skapa nycklar.

Boken "Linux i praktiken"

De angivna operationerna krÀver root-behörigheter, sÄ du behöver bli root via sudo su.

Den första filen du kommer att arbeta med kallas vars och innehÄller miljövariabler som easy-rsa anvÀnder vid generering av nycklar. Du mÄste redigera filen för att anvÀnda dina egna vÀrden istÀllet för standardvÀrdena som redan finns. SÄ hÀr kommer min fil att se ut (listning 10.1).

Listning 10.1. Viktiga delar av filen /etc/openvpn/easy-rsa/vars

export KEY_COUNTRY="CA"
export KEY_PROVINCE="ON"
export KEY_CITY="Toronto"
export KEY_ORG="Bootstrap IT"
export KEY_EMAIL="info@bootstrap-it.com"
export KEY_OU="IT"

Att köra filen vars kommer att överföra dess vÀrden till skalets miljö, dÀrifrÄn kommer de att inkluderas i innehÄllet i dina nya nycklar. Varför fungerar inte kommandot sudo pÄ egen hand? Eftersom vi i första steget redigerar skriptet vars, och sedan tillÀmpar det. TillÀmpningen betyder ocksÄ att filen vars överför sina vÀrden till skalets miljö, dÀrifrÄn kommer de att inkluderas i innehÄllet i dina nya nycklar.

Se till att köra filen igen med ett nytt skal för att avsluta den oavslutade processen. NÀr detta Àr gjort kommer skriptet att be dig att köra ett annat skript, clean-all, för att ta bort allt innehÄll i katalogen /etc/openvpn/easy-rsa/keys/:

Boken "Linux i praktiken"
Som en naturlig följd kommer nÀsta steg att vara att köra skriptet clean-all, följt av build-ca, som anvÀnder skriptet pkitool för att skapa ett rotcertifikat. Du kommer att bli ombedd att bekrÀfta identifieringsinstÀllningarna som tillhandahÄlls av vars:

# ./clean-all
# ./build-ca
Generating a 2048 bit RSA private key

DÀrefter kommer skriptet build-key-server. Eftersom det anvÀnder samma skript pkitool tillsammans med det nya rotcertifikatet, kommer du att se samma frÄgor för att bekrÀfta skapandet av nyckelparet. Nycklarna kommer att fÄ namn baserade pÄ de argument du anger, som, sÄvida du inte kör flera VPN:er pÄ denna dator, vanligtvis kommer att vara server, som i exemplet:

# ./build-key-server server
[...]
Certificate is to be certified until Aug 15 23:52:34 2027 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

OpenVPN anvÀnder parametrar som genererats med Diffie-Hellman-algoritmen (med hjÀlp av build-dh) för att Ästadkomma autentisering för nya anslutningar. Den skapade filen hÀr behöver inte vara hemlig, men den bör genereras med hjÀlp av build-dh-skriptet för de RSA-nycklar som för tillfÀllet Àr aktiva. Om du skapar nya RSA-nycklar i framtiden mÄste du ocksÄ uppdatera filen baserat pÄ Diffie-Hellman-algoritmen:

# ./build-dh

Dina nycklar pÄ serversidan hamnar nu i katalogen /etc/openvpn/easy-rsa/keys/, men OpenVPN vet inte om detta. Som standard söker OpenVPN efter nycklar i /etc/openvpn/, sÄ kopiera dem:

# cp /etc/openvpn/easy-rsa/keys/server* /etc/openvpn
# cp /etc/openvpn/easy-rsa/keys/dh2048.pem /etc/openvpn
# cp /etc/openvpn/easy-rsa/keys/ca.crt /etc/openvpn

Förberedelse av klientens krypteringsnycklar

Som du redan har sett anvÀnder TLS-kryptering par av motsvarande nycklar: en Àr installerad pÄ servern och den andra pÄ den fjÀrrklient. Det betyder att du behöver klientnycklar. VÄr gamla vÀn pkitool Àr precis vad som behövs för detta. I detta exempel, genom att köra programmet i katalogen /etc/openvpn/easy-rsa/, skickar vi argumentet client för att generera filer med namnen client.crt och client.key:

# ./pkitool client

De tvÄ klientfilerna tillsammans med den ursprungliga filen ca.crt, som fortfarande ligger i katalogen keys/, mÄste nu sÀkert överföras till din klient. PÄ grund av deras Àgande och ÄtkomstrÀttigheter kan detta visa sig vara en klurig uppgift. Det enklaste tillvÀgagÄngssÀttet Àr att manuellt kopiera innehÄllet i den ursprungliga filen (och inget annat Àn detta innehÄll) till terminalen som körs pÄ skrivbordet pÄ din PC (markera texten, högerklicka och vÀlj Kopiera i menyn). Klistra sedan in detta i en ny fil med samma namn som du skapar i den andra terminalen som Àr ansluten till din klient.

Men vem som helst kan ju klippa och klistra. TÀnk istÀllet som en administratör, för du kommer inte alltid ha tillgÄng till ett GUI dÀr klipp-och-klistra-operationer Àr möjligt. Kopiera filer till din anvÀndarhemskatalog (sÄ att den fjÀrroperationen scp kan komma Ät dem), och Àndra sedan Àgaren till filerna frÄn root till en vanlig anvÀndare utan root-behörigheter med hjÀlp av chown, sÄ att den fjÀrroperationen scp kan utföras. Se till att alla dina filer för nÀrvarande Àr korrekt instÀllda och tillgÀngliga. Du kommer att flytta dem till klienten lite senare:

# cp /etc/openvpn/easy-rsa/keys/client.key /home/ubuntu/
# cp /etc/openvpn/easy-rsa/keys/ca.crt /home/ubuntu/
# cp /etc/openvpn/easy-rsa/keys/client.crt /home/ubuntu/
# chown ubuntu:ubuntu /home/ubuntu/client.key
# chown ubuntu:ubuntu /home/ubuntu/client.crt
# chown ubuntu:ubuntu /home/ubuntu/ca.crt

Med en komplett uppsÀttning av krypteringsnycklar redo att anvÀndas mÄste du informera servern hur du vill skapa VPN. Detta görs med hjÀlp av filen server.conf.

Minska antalet tangentryckningar

MĂ„ste du skriva för mycket? En parentesförlĂ€ngning hjĂ€lper till att minska dessa sex kommandon till tvĂ„. Jag Ă€r sĂ€ker pĂ„ att du kan lĂ€ra dig dessa tvĂ„ exempel och förstĂ„ vad som hĂ€nder. Ännu viktigare, du kommer att förstĂ„ hur du tillĂ€mpar dessa principer pĂ„ operationer som involverar dussintals eller till och med hundratals element:

# cp /etc/openvpn/easy-rsa/keys/{ca.crt,client.{key,crt}} /home/ubuntu/
# chown ubuntu:ubuntu /home/ubuntu/{ca.crt,client.{key,crt}}

InstÀllning av filen server.conf

Hur kan du veta hur filen server.conf ska se ut? Kommer du ihÄg mallen för katalogen easy-rsa som du kopierade frÄn /usr/share/? Vid installation av OpenVPN finns en komprimerad fil med konfigurationsmallar som du kan kopiera till /etc/openvpn/. Jag kommer att utgÄ ifrÄn att mallen Àr arkiverad och introducera dig till ett anvÀndbart verktyg: zcat.

Du vet redan hur man skriver ut textinnehÄllet i en fil pÄ skÀrmen med kommandot cat, men vad hÀnder om filen Àr komprimerad med gzip? Du kan alltid packa upp filen, och dÄ kommer cat att skriva ut den utan problem, men det Àr ett eller tvÄ steg mer Àn vad som behövs. IstÀllet, som du kanske har gissat, kan du anvÀnda kommandot zcat för att hÀmta den uppackade texten i minnet i ett steg. I nÀsta exempel kommer du, istÀllet för att skriva ut texten pÄ skÀrmen, att omdirigera den till en ny fil som heter server.conf:

# zcat 
  /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz 
  > /etc/openvpn/server.conf
$ cd /etc/openvpn

LÄt oss lÀmna den omfattande och anvÀndbara dokumentationen som följer med filen Ät sidan och titta pÄ hur den kan se ut nÀr du Àr klar med redigeringen. Observera att semikolon (;) anger för OpenVPN att inte lÀsa och utföra nÀsta rad (lista 10.2).

Boken "Linux i praktiken"
LÄt oss gÄ igenom nÄgra av dessa instÀllningar.

  • Som standard kör OpenVPN pĂ„ port 1194. Du kan Ă€ndra detta, till exempel för att dölja dina aktiviteter ytterligare eller undvika konflikter med andra aktiva tunnlar. Eftersom 1194 krĂ€ver minimal samordning med klienterna, Ă€r det bĂ€st att göra just sĂ„.
  • OpenVPN anvĂ€nder antingen transmissionsprotokollet (TCP) eller anvĂ€ndardatagramprotokollet (UDP) för datatransmission. TCP kan vara nĂ„got lĂ„ngsammare, men det Ă€r mer pĂ„litligt och har större chans att förstĂ„s av program som körs i bĂ„da Ă€ndar av tunneln.
  • Du kan ange dev tun nĂ€r du vill skapa en enklare och mer effektiv IP-tunnel som överför datainnehĂ„ll och inget mer. Om du Ă„ sin sida behöver ansluta flera nĂ€tverksgrĂ€nssnitt (och de nĂ€tverk de representerar) genom att skapa en Ethernet-bro, mĂ„ste du vĂ€lja dev tap. Om du inte förstĂ„r vad detta betyder, anvĂ€nd argumentet tun.
  • De följande fyra raderna överför till OpenVPN namnen pĂ„ tre autentiseringsfiler pĂ„ servern och den parameterfil dh2048 som du skapade tidigare.
  • Raden server anger intervallet och subnetmasken som ska anvĂ€ndas för att tilldela IP-adresser till klienter vid inloggning.
  • Den valfria parametern push "route 10.0.3.0 255.255.255.0" gör det möjligt för fjĂ€rrklienter att fĂ„ Ă„tkomst till privata undernĂ€t bakom servern. För att denna funktion ska fungera krĂ€vs Ă€ven nĂ€tverksinstĂ€llningar pĂ„ sjĂ€lva servern, sĂ„ att det privata undernĂ€tet kĂ€nner till OpenVPN-under nĂ€tet (10.8.0.0).
  • Raden port-share localhost 80 gör det möjligt att omdirigera klienttrafik som kommer in via port 1194 till en lokal webbserver som lyssnar pĂ„ port 80. (Detta Ă€r anvĂ€ndbart om du planerar att anvĂ€nda webbservern för att testa din VPN.) Detta fungerar endast nĂ€r TCP-protokollet Ă€r valt.
  • Raderna user nobody och group nogroup mĂ„ste vara aktiverade — detta görs genom att ta bort semikolonerna (;). Att tvinga fjĂ€rrklienter att köra under nobody och nogroup garanterar att sessioner pĂ„ servern Ă€r oprivilegerade.
  • log anger att nuvarande loggposter kommer att skriva över gamla poster vid varje start av OpenVPN, medan log-append lĂ€gger till nya poster i den befintliga loggfilen. SjĂ€lva filen openvpn.log skrivs till katalogen /etc/openvpn/.

Dessutom lÀggs ofta vÀrdet client-to-client till konfigurationsfilen sÄ att flera klienter kan se varandra utöver OpenVPN-servern. Om du Àr nöjd med din konfiguration kan du starta OpenVPN-servern:

# systemctl start openvpn

PÄ grund av den förÀnderliga naturen av relationerna mellan OpenVPN och systemd kan det ibland krÀvas en sÄdan syntax för att starta tjÀnsten: systemctl start openvpn@server.

Att köra ip addr för att visa listan över nÀtverksgrÀnssnitt pÄ din server bör nu Äterge en referens till det nya grÀnssnittet med namnet tun0. OpenVPN kommer att skapa det för att hantera inkommande klienter:

$ ip addr
[...]
4: tun0: mtu 1500 qdisc [...]
      link/none
      inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
          valid_lft forever preferred_lft forever

Du kan behöva starta om servern innan allt börjar fungera fullt ut. NÀsta stopp Àr klientdatorn.

10.1.2. Konfigurera OpenVPN-klienten

Traditionellt byggs tunnlar med minst tvÄ utgÄngar (annars skulle vi kalla dem grottor). En korrekt konfigurerad OpenVPN-server dirigerar trafik in i och ut ur tunneln frÄn ena sidan. Men du kommer ocksÄ att behöva nÄgon programvara som körs pÄ klientsidan, det vill sÀga i den andra Ànden av tunneln.

I det hÀr avsnittet kommer jag att fokusera pÄ manuell installation av en Linux-dator av nÄgot slag för att fungera som OpenVPN-klient. Men detta Àr inte det enda sÀttet denna möjlighet finns tillgÀnglig. OpenVPN stöder klientapplikationer som kan installeras och anvÀndas pÄ stationÀra datorer och laptops med Windows eller macOS, samt pÄ smartphones och surfplattor som kör Android och iOS. Se detaljer pÄ openvpn.net.

OpenVPN-paketet mÄste installeras pÄ klientdatorn, precis som det installerades pÄ servern, Àven om det inte behövs nÄgot easy-rsa hÀr eftersom de nycklar du anvÀnder redan finns. Du behöver kopiera filen client.conf-mallen till katalogen /etc/openvpn/, som just har skapats. Denna gÄng kommer filen inte att komprimeras, sÄ ett vanligt cp-kommando kommer att fungera utmÀrkt för detta:

# apt install openvpn
# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf 
  /etc/openvpn/

De flesta instÀllningarna i din client.conf-fil kommer att vara ganska tydliga: de bör matcha vÀrdena pÄ servern. Som visas i följande exempel pÄ fil Àr det unika parametern remote 192.168.1.23 1194, som anger klientens IP-adress till servern. Kontrollera Äterigen att detta Àr adressen till din server. Du bör ocksÄ se till att klientdatorn verifierar serverns certifikat för att förhindra en eventuell 'man-in-the-middle'-attack. Ett sÀtt att göra detta Àr att lÀgga till raden remote-cert-tls server (listning 10.3).

Boken "Linux i praktiken"
Nu kan du gÄ till katalogen /etc/openvpn/ och extrahera certifikatnycklarna frÄn servern. Byt ut serverns IP-adress eller domÀnnamn i exemplet mot dina egna vÀrden:

Boken "Linux i praktiken"
Inget sĂ€rskilt spĂ€nnande kommer förmodligen att hĂ€nda förrĂ€n du startar OpenVPN pĂ„ klienten. Eftersom du mĂ„ste skicka ett par argument gör du detta frĂ„n kommandoraden. Argumentet —tls-client talar om för OpenVPN att du kommer att agera som klient och ansluta genom TLS-kryptering, medan —config anger din konfigurationsfil:

# openvpn --tls-client --config /etc/openvpn/client.conf

LÀs noggrant utskriften frÄn kommandot för att sÀkerstÀlla att du Àr korrekt ansluten. Om nÄgot gÄr fel för första gÄngen kan det bero pÄ att instÀllningarna mellan serverns och klientens konfigurationsfiler inte stÀmmer överens, eller pÄ ett problem med nÀtverksanslutningen/brandvÀggen. HÀr Àr nÄgra tips för att felsöka.

  • LĂ€s noggrant utskriften av OpenVPN-operationen pĂ„ klienten. Den innehĂ„ller ofta vĂ€rdefulla rĂ„d om vad som inte kan genomföras och varför.
  • Kontrollera felmeddelandena i openvpn.log och openvpn-status.log i katalogen /etc/openvpn/ pĂ„ servern.
  • Kontrollera relaterade meddelanden för OpenVPN och tidssynkroniserade meddelanden i systemloggarna pĂ„ servern och klienten. (journalctl -ce visar de senaste posterna.)
  • Se till att du har en aktiv nĂ€tverksanslutning mellan servern och klienten (för mer information, se kapitel 14).

Om författaren

David Clinton — systemadministratör, lĂ€rare och författare. Han har administrerat, skrivit om och skapat utbildningsmaterial för mĂ„nga viktiga tekniska discipliner, inklusive Linux-system, molnberĂ€kning (specifikt AWS) och behĂ„llarteknologier som Docker. Han har skrivit boken Learn Amazon Web Services in a Month of Lunches (Manning, 2017). MĂ„nga av hans utbildningsvideokurser finns pĂ„ Pluralsight.com, och lĂ€nkar till andra av hans böcker (om Linuxadministration och servervirtualisering) finns pĂ„ bootstrap-it.com.

” För mer information om boken kan man lĂ€sa pĂ„ förlagets webbplats
» InnehÄllsförteckning
» Utdrag

För Habr-följare Ă€r det 25 % rabatt med koden — Linux
Vid betalning av den tryckta versionen av boken skickas en e-bok till e-post.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster