Grāmata «Linux darbībā»

Grāmata «Linux darbībā» Sveiki, Habrāžotāji! Grāmatā Dāvids Klintons apraksta 12 reālas projektu piemērus, tostarp automātisku dublēšanas un atjaunošanas sistēmas automatizāciju, personīgā failu mākoņa iestatīšanu, kas līdzīgs Dropbox, un savu MediaWiki servera izveidi. Aizraujošos piemēros jūs apgūsiet virtualizāciju, avārijas atjaunošanu, drošības nodrošināšanu, dublēšanu, DevOps ieviešanu un sistēmas kļūdu novēršanu. Katra nodaļa beidzas ar praktisko ieteikumu apskatu, jauno terminu vārdnīcu un uzdevumiem.

Izraksts «10.1. OpenVPN tunelēšana»

Šajā grāmatā es jau esmu daudz stāstījis par šifrēšanu. SSH un SCP var aizsargāt datus, kas tiek pārsūtīti pa attālinātām savienojumiem (3. nodaļa), failu šifrēšana ļauj aizsargāt datus to glabāšanas laikā serverī (8. nodaļa), bet TLS/SSL sertifikāti spēj aizsargāt datus, kad tie tiek pārsūtīti starp vietnēm un klienta pārlūkprogrammām (9. nodaļa). Taču dažkārt jūsu dati prasa aizsardzību plašākā savienojumu spektrā. Piemēram, iespējams, daži jūsu komandas locekļi strādā ceļojuma laikā, pieslēdzoties tīklam pa Wi-Fi publiskās piekļuves punktos. Noteikti nevajadzētu uzskatīt, ka visi šie piekļuves punkti ir droši, taču jūsu cilvēkiem tiešām ir vajadzīgs veids, kā pieslēgties uzņēmuma resursiem — šajā gadījumā var palīdzēt VPN.

Pareizi izstrādāts VPN-tunelis nodrošina tiešu savienojumu starp attālinātajiem klientiem un serveri, tādējādi slēpjot datus to pārsūtīšanas laikā pa nedrošu tīklu. Un kas? Jūs jau esat redzējuši daudz rīku, kas to var izdarīt, izmantojot šifrēšanu. Reālā VPN vērtība ir tāda, ka atverot tuneli, jūs varat pieslēgt attālinātās tīklus tā, it kā tie visi būtu vietējie. Noteiktā nozīmē jūs izmantojat apvedceļu.

Izmantojot šādu paplašinātu tīklu, administratori var veikt savu darbu savos serveros no jebkuras vietas. Taču, kas ir vēl svarīgāk, uzņēmums ar resursiem, kas sadalīti vairākos filiālēs, var padarīt tos visus redzamus un pieejamus visām grupām, kurām tās ir nepieciešamas, neatkarīgi no tā, kur tās ir (10.1. att.).

Tunnels by themselves do not guarantee security. However, one of the encryption standards can be integrated into the network structure, significantly enhancing the level of security. Tunnels created using the OpenVPN open-source package employ the same TLS/SSL encryption that you have already read about. OpenVPN is not the only available option for tunneling, but it is one of the most well-known. It is considered to be slightly faster and more secure than the alternative Level 2 tunnel protocol that uses IPsec encryption.

Do you want your team to communicate securely with each other while on the go or working from different buildings? To achieve this, it is necessary to set up an OpenVPN server to enable application sharing and access to the local network environment of the server. To make this work, you only need to run two virtual machines or two containers: one to act as the server/host and the other as the client. Creating a VPN is not a simple process, so it is likely worth spending a few minutes to get a general picture.

Grāmata «Linux darbībā»

10.1.1. Configuring the OpenVPN Server

Before you start, here’s a useful tip. If you intend to do everything yourself (and I strongly recommend that you do), you will likely find yourself working with several terminal windows open on the Desktop, each connected to its own machine. There is a risk that at some point you might enter a command in the wrong window. To avoid this, you can use the hostname command to change the displayed machine name in the command line to something that clearly tells you where you are. Once you do this, you will need to log out of the server and log back in for the new settings to take effect. Here’s how it looks:

Grāmata «Linux darbībā»
By following this approach and giving appropriate names to each machine you are working with, you will be able to easily keep track of where you are.

After using hostname, you may encounter annoying Unable to Resolve Host OpenVPN-Server messages when executing subsequent commands. Updating the /etc/hosts file with the corresponding new hostname should resolve the issue.

Preparing your server for OpenVPN

Lai instalētu OpenVPN savā serverī, nepieciešami divi pakotnes: openvpn un easy-rsa (atbildīga par šifrēšanas atslēgas ģenerēšanas procesu). CentOS lietotājiem vispirms, ja nepieciešams, jāinstalē epel-release krājums, kā jūs to darījāt 2. nodaļā. Lai būtu iespējams pārbaudīt piekļuvi servera lietojumprogrammām, jūs varat arī uzstādīt tīmekļa serveri Apache (apache2 Ubuntu un httpd CentOS).

Kamēr jūs konfigurējat serveri, iesaku aktivizēt ugunsmūri, kas bloķē visus portus, izņemot 22 (SSH) un 1194 (OpenVPN noklusējuma ports). Šis piemērs ilustrē, kā darbosies ufw Ubuntu, taču esmu pārliecināts, ka jūs vēl atceraties firewalld programmu CentOS no 9. nodaļas:

# ufw enable
# ufw allow 22
# ufw allow 1194

Lai atļautu iekšējo maršrutēšanu starp tīklu interfeisiem serverī, jums ir jāizdzēš komentārs no vienas rindiņas (net.ipv4.ip_forward = 1) failā /etc/sysctl.conf. Tas ļaus pārsūtīt attālos klientus nepieciešamības gadījumā pēc viņu pieslēgšanās. Lai jaunais parametrs sāktu darboties, izpildiet sysctl -p:

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

Tagad servera vide ir pilnībā konfigurēta, taču jāveic vēl daži soļi, pirms esat gatavs: būs jāveic šādi soļi (mēs tos detalizēti izskatīsim tālāk).

  1. Izveidojiet serverī atslēgu komplektu, lai šifrētu atslēgu infrastruktūru (PKI) ar skriptiem, kas nāk kopā ar easy-rsa pakotni. Patiesībā OpenVPN serveris arī darbojas kā sava veida sertifikācijas centrs (CA).
  2. Sagatavojiet atbilstošās atslēgas klientam
  3. Konfigurējiet servera server.conf failu
  4. Konfigurējiet savu OpenVPN klientu
  5. Pārbaudiet savu VPN

Šifrēšanas atslēgu ģenerēšana

Lai atvieglotu dzīvi, varat konfigurēt savu atslēgu infrastruktūru tajā pašā mašīnā, kur darbojas OpenVPN serveris. Tomēr drošības ieteikumos parasti ieteicams izmantot atsevišķu CA serveri ražošanas videi. Šifrēšanas atslēgu resursu ģenerēšanas un sadales process OpenVPN izmantošanai ir ilustrēts 10.2. attēlā.

Grāmata «Linux darbībā»
Kad jūs instalējāt OpenVPN, automātiski tika izveidots katalogs /etc/openvpn/, bet tajā pagaidām nav nekā. Pakotnes openvpn un easy-rsa nāk kopā ar paraugu failu šabloniem, kurus varat izmantot kā pamatu savai konfigurācijai. Lai uzsāktu sertifikācijas procesu, nokopējiet easy-rsa šablona katalogu no /usr/share/ uz /etc/openvpn un pārejiet uz easy-rsa/:

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

Easy-RSA katalogs tagad saturēs diezgan daudz skriptu. Tabulā 10.1 ir norādīti rīki, kurus izmantosiet atslēgu izveidē.

Grāmata «Linux darbībā»

Norādītās darbības prasa root tiesības, tāpēc, izmantojot sudo su, jums jākļūst par root.

Pirmais fails, ar kuru strādāsiet, saucas vars un satur vides mainīgos, kurus easy-rsa izmanto atslēgu ģenerēšanai. Jums jārediģē fails, lai izmantotu savus vērtības, nevis noklusējuma vērtības, kas jau ir. Lūk, kā izskatīsies mans fails (izraksts 10.1).

Izraksts 10.1. Galvenās faila fragmenti /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"

Faila vars palaišana ļaus tā vērtībām tikt nodotām uz vidē, no kurienes tās tiks iekļautas jūsu jauno atslēgu saturā. Kāpēc komanda sudo pati par sevi nedarbojas? Tāpēc, ka pirmajā posmā mēs rediģējam skriptu ar nosaukumu vars, un pēc tam to piemērojam. Piemērošana nozīmē, ka fails vars nodod savas vērtības videi, no kurienes tās tiks iekļautas jūsu jauno atslēgu saturā.

Noteikti atkārtoti palaižiet failu, izmantojot jaunu vidi, lai pabeigtu nepabeigto procesu. Kad tas būs izdarīts, skripts piedāvās jums palaist citu skriptu clean-all, lai dzēstu jebkuru saturu direktorijā /etc/openvpn/easy-rsa/keys/:

Grāmata «Linux darbībā»
Dabiski, nākamais solis būs skriptu clean-all palaišana, kam sekos build-ca, kas izmanto skriptu pkitool, lai izveidotu saknes sertifikātu. Jūs tiksiet lūgti apstiprināt identifikācijas iestatījumus, ko sniedzis vars:

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

Tālāk ir skripts build-key-server. Tā kā tas izmanto to pašu skriptu pkitool kopā ar jauno saknes sertifikātu, jūs redzēsiet tos pašus jautājumus, lai apstiprinātu atslēgu pāra izveidi. Atslēgām tiks piešķirti nosaukumi, pamatojoties uz jūsu nodotajiem argumentiem, kuri, ja vien jūs nesākat vairākas VPN šajā datorā, parasti būs server, kā piemēram:

# ./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 izmanto parametrus, kas tiek ģenerēti, izmantojot Diffie-Hellman algoritmu (izmantojot build-dh), lai vienotos par autentifikāciju jauniem savienojumiem. Šajā failā nedrīkst būt slepena informācija, taču tam jābūt ģenerētam, izmantojot build-dh skriptu, pamatojoties uz pašreizējiem RSA atslēgām. Ja nākotnē ģenerēsiet jaunas RSA atslēgas, jums būs jāatjaunina fails, balstoties uz Diffie-Hellman algoritmu:

# ./build-dh

Jūsu atslēgas servera pusē tagad nonāks katalogā /etc/openvpn/easy-rsa/keys/, taču OpenVPN to nezina. Noklusējuma iestatījumos OpenVPN meklēs atslēgas /etc/openvpn/, tāpēc nokopējiet tās:

# 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

Klienta šifrēšanas atslēgu sagatavošana

Kā jau redzējāt, TLS šifrēšanā tiek izmantotas atbilstošo atslēgu pāri: viena ir iestatīta uz servera, bet otra — uz attālināto klientu. Tas nozīmē, ka jums būs nepieciešamas klienta atslēgas. Mūsu vecais draugs pkitool ir tieši tas, kas nepieciešams. Šajā piemērā, startējot programmu katalogā /etc/openvpn/easy-rsa/, mēs nododam tai argumentu client, lai ģenerētu failus ar nosaukumiem client.crt un client.key:

# ./pkitool client

Divi klienta faili kopā ar oriģinālo failu ca.crt, kas joprojām atrodas katalogā keys/, tagad ir jānodod drošā veidā jūsu klientam. Ņemot vērā to piederību un tiesības, tas var izrādīties ne tik vienkāršs uzdevums. Vienkāršākais veids ir manuāli nokopēt oriģinālā faila saturu (un neko citu) terminālā, kas darbojas jūsu datora darbvirsmā (izvēlieties tekstu, ar peles labo pogu noklikšķiniet uz tā un izvēlieties Copy (Kopēt) no izvēlnes). Pēc tam ielīmējiet to jaunā failā ar to pašu nosaukumu, kuru veidojat otrajā terminālā, kas pieslēgts jūsu klientam.

Bet taču ikviens var izgriezt un ielīmēt. Domājiet kā administrators, jo jums ne vienmēr būs piekļuve GUI, kur ir iespēja izgriešanas/ielīmēšanas operācija. Nokopējiet failus uz jūsu lietotāja mājas katalogu (lai attālinātā scp operācija varētu tiem piekļūt), un pēc tam izmantojiet chown, lai mainītu failu īpašnieku no root uz parasto lietotāju bez root tiesībām, lai varētu veikt attālināto scp darbību. Pārliecinieties, ka visi jūsu faili šajā brīdī ir iestatīti un pieejami. Klientam jūs tos pārvietosiet nedaudz vēlāk:

# 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

Ar pilnu šifrēšanas atslēgu komplektu, kas ir gatavs darbībai, jums jāinformē serveris, kā vēlaties izveidot VPN. To var izdarīt ar serveru konfigurācijas failu server.conf.

Samazinām taustiņu nospiešanas skaitu

Pārāk daudz jāpieraksta? Paplašinājums ar iekavām palīdzēs samazināt sešas komandas līdz divām. Esmu pārliecināts, ka varēsiet apgūt šos divus piemērus un saprast, kas notiek. Kas vēl svarīgāk, jūs varēsiet saprast, kā piemērot šos principus operācijām, kas ietver desmitiem vai pat simtiem elementu:

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

Servera konfigurācijas faila iestatīšana

Kā jūs varat zināt, kādam jāizskatās servera konfigurācijas failam? Atcerieties easy-rsa katalogā esošo paraugu, kuru kopējāt no /usr/share/? Instalējot OpenVPN, palika saspiests konfigurācijas paraugs, kuru varat kopēt uz /etc/openvpn/. Es balstos uz to, ka paraugs ir arhivēts, un iepazīstināšu ar noderīgu rīku: zcat.

Jūs jau zināt, kā parādīt teksta satura izvadi no faila ekrānā izmantojot komandu cat, bet kas notiek, ja fails ir saspiests, izmantojot gzip? Jūs vienmēr varat izjust failu, un tad cat ar prieku to parādīs, bet tas ir par vienu vai diviem soļiem vairāk, nekā vajadzētu. Tādēļ, kā jūs, iespējams, jau nojaušat, varat ievadīt komandu zcat, lai vienā solī ielādētu izsistā teksta saturu atmiņā. Nākamajā piemērā, nevis drukājot tekstu ekrānā, jūs novirzīsiet to uz jaunu failu ar nosaukumu server.conf:

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

Atstājot novārtā plašo un noderīgo dokumentāciju, kas pievienota failam, paskatīsimies, kā tam varētu izskatīties, kad jūs pabeidzat rediģēšanu. Ņemiet vērā, ka semikolonas (;) norāda OpenVPN neizlasīt un neizpildīt nākamo rindu (10.2. saraksts).

Grāmata «Linux darbībā»
Pastaigāsim pa dažiem no šiem iestatījumiem.

  • Pēc noklusējuma OpenVPN darbojas caur 1194. portu. Jūs varat mainīt to, piemēram, lai vēl vairāk slēptu savas darbības vai izvairītos no konfliktiem ar citiem aktīviem tuneļiem. Tā kā 1194 prasa minimālu saskaņošanu ar klientiem, labāk ir rīkoties tieši tā.
  • OpenVPN datu pārsūtīšanai izmanto vai nu pārsūtīšanas kontroles protokolu (TCP), vai arī lietotāju datagrammu protokolu (UDP). TCP var būt nedaudz lēnāks, taču tas ir uzticamāks un ir ar lielāku varbūtību saprotams abās tuneļa pusēs strādājošām lietotnēm.
  • Jūs varat izmantot dev tun, kad vēlaties izveidot vienkāršāku un efektīvāku IP tuneli, kas pārsūta datu saturu un neko vairāk. Ja, no otras puses, jums ir nepieciešams pieslēgt vairākas tīkla saskarnes (un tīklus, kurus tās pārstāv), izveidojot Ethernet tiltu, tad jums būs jāizvēlas dev tap. Ja nesaprotat, ko tas viss nozīmē, izmantojiet tun argumentu.
  • Nākamās četras rindas nodod OpenVPN trīs autentifikācijas failu nosaukumus serverī un dh2048 parametru failu, kuru jūs iepriekš izveidojāt.
  • Rinda server nosaka diapazonu un apakštīkla masku, kas tiks izmantotas, lai piešķirtu IP adreses klientiem, kad viņi pieslēdzas.
  • Neobligātais parametrs push 'route 10.0.3.0 255.255.255.0' ļauj attālinātiem klientiem piekļūt privātajiem apakštīkliem aiz servera. Šai darbībai ir nepieciešama arī tīkla konfigurācija pašā serverī, lai privāts apakštīkls zinātu par OpenVPN apakštīklu (10.8.0.0).
  • Rinda port-share localhost 80 ļauj pārsūtīt klientu trafiku, kas ienāk caur portu 1194, uz lokālo tīmekļa serveri, kas klausās portā 80. (Tas būs noderīgi, ja plānojat izmantot tīmekļa serveri, lai testētu savu VPN.) Tas darbojas tikai tad, ja ir izvēlēts tcp protokols.
  • Rindas user nobody un group nogroup ir jāaktivizē — tam nepieciešams noņemt semikolu (;). Spiešanas attālināto klientu izmantošana ar nobody un nogroup garantē, ka sesijas serverī ir nepieredzētas.
  • log norāda, ka pašreizējie žurnāla ieraksti tiks pārrakstīti, katru reizi uzsākot OpenVPN, kamēr log-append pievieno jaunus ierakstus esošajam žurnāla failam. Pats fails openvpn.log tiek ierakstīts direktorijā /etc/openvpn/.

Turklāt konfigurācijas failam bieži pievieno vērtību client-to-client, lai vairāki klienti varētu redzēt viens otru papildus OpenVPN serverim. Ja esat apmierināts ar savu konfigurāciju, varat palaist OpenVPN serveri:

# systemctl start openvpn

Dēļ mainīgās attiecību rakstura starp OpenVPN un systemd, lai palaistu pakalpojumu dažreiz var būt nepieciešama šāda sintakse: systemctl start openvpn@server.

Startējot ip addr, lai parādītu sava servera tīkla saskarnju sarakstu, tagad vajadzētu izvadīt saiti uz jauno saskarni ar nosaukumu tun0. OpenVPN to izveidos, lai apkalpotu ienākošos klientus:

$ 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

Iespējams, jums būs nepieciešams restartēt serveri, pirms viss sāks pilnībā darboties. Nākamā pietura ir klienta dators.

10.1.2. OpenVPN klienta konfigurācija

Tradicionāli tunelus veido vismaz ar diviem izejas punktiem (pretējā gadījumā mēs tos sauktu par alām). Pareizi konfigurēts OpenVPN serveris pārsūta datu plūsmu tunelī vienā virzienā un no tā. Bet jums būs nepieciešama arī programmatūra, kas darbojas klienta pusē, tas ir, tunela otrā galā.

Šajā sadaļā es koncentrēšos uz tāda veida Linux datora manuālo konfigurāciju, lai tas darbotos kā OpenVPN klients. Bet tas nav vienīgais veids, kā šāda iespēja ir pieejama. OpenVPN atbalsta klientu lietotnes, kuras var instalēt un izmantot uz galddatoriem un klēpjdatoriem ar Windows vai macOS, kā arī uz viedtālruņiem un planšetdatoriem, kas darbojas ar Android un iOS. Sīkāku informāciju var atrast vietnē openvpn.net.

OpenVPN pakotne būs jāinstalē arī klienta datorā, kā tā tika instalēta serverī, lai gan šeit nav nepieciešama easy-rsa, jo izmantotie taustiņi jau pastāv. Jums jānokopē veidnes fails client.conf uz katalogu /etc/openvpn/, kas tikko tika izveidots. Šoreiz fails netiks saspiests, tādēļ parastā cp komanda lieliski tiks galā ar šo uzdevumu:

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

Lielākā daļa iestatījumu jūsu failā client.conf būs diezgan saprotami: tie jāsaskaņo ar vērtībām serverī. Kā redzams nākamajā faila piemērā, unikālais parametrs ir remote 192.168.1.23 1194, kas norāda klientam servera IP adresi. Atkal pārliecinieties, ka tas ir jūsu servera adrese. Jums arī jāspiež klienta dators, lai pārbaudītu servera sertifikāta autentiskumu, lai novērstu potenciālu „vidus cilvēka” uzbrukumu. Viens no veidiem, kā to izdarīt, ir pievienot rindu remote-cert-tls server (saraksts 10.3).

Grāmata «Linux darbībā»
Tagad jūs varat doties uz katalogu /etc/openvpn/ un izvilkt sertifikācijas taustiņus no servera. Aizstājiet servera IP adresi vai domēna nosaukumu piemērā ar savām vērtībām:

Grāmata «Linux darbībā»
Nekas īpašs, visticamāk, nenotiks, kamēr jūs nepalaižat OpenVPN klientā. Tā kā jums ir jānodod daži argumenti, jūs to darīsiet no komandrindas. Arguments —tls-client norāda OpenVPN, ka jūs darbosities kā klients un pieslēgsieties caur TLS šifrēšanu, bet —config norāda uz jūsu konfigurācijas failu:

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

Rūpīgi izlasiet komandas izpildes rezultātu, lai pārliecinātos, ka jūs esat pareizi pieslēdzies. Ja kaut kas noiet greizi pirmo reizi, iespējams, tas ir saistīts ar neatbilstībām starp servera un klienta konfigurācijas failiem vai ar tīkla savienojuma/ugunsmūra problēmām. Šeit ir daži padomi, kā novērst problēmas.

  • Rūpīgi izlasiet OpenVPN darbības rezultātus klientā. Tajos bieži ir vērtīgi padomi par to, kas tieši nevar tikt izpildīts un kāpēc.
  • Pārbaudiet kļūdu ziņojumus openvpn.log un openvpn-status.log failos direktorijā /etc/openvpn/ serverī.
  • Pārbaudiet saistītās OpenVPN ziņas un atbilstošus ierakstus sistēmas žurnālos serverī un klientā. (journalctl -ce parādīs visjaunākos ierakstus.)
  • Pārliecinieties, ka jums ir aktīvs tīkla savienojums starp serveri un klientu (vairāk informācijas skatiet 14. nodaļā).

Par autoru

Deivids Klintons — sistēmas administrators, pasniedzējs un rakstnieks. Viņš ir administrējis, rakstījis par to un izstrādājis mācību materiālus daudzām svarīgām tehniskām disciplīnām, tostarp Linux sistēmām, mākoņdatoru pakalpojumiem (īpaši AWS) un konteineru tehnoloģijām, piemēram, Docker. Viņš ir uzrakstījis grāmatu "Learn Amazon Web Services in a Month of Lunches" (Manning, 2017). Daudzas viņa mācību videokursus var atrast vietnē Pluralsight.com, un saites uz citām viņa grāmatām (par Linux administrēšanu un serveru virtualizāciju) pieejamas adresē bootstrap-it.com.

» Sīkāk ar grāmatu var iepazīties izdevniecības mājaslapā
» Saturs
» Fragments

Habr iedzīvotājiem atlaide 25% ar kuponu — Linux
Pēc maksāšanas par grāmatas papīra versiju uz e-pastu tiek nosūtīta elektroniskā grāmata.

Avots: habr.com

Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster