Linux í aðgerð bók

Linux í aðgerð bók Halló, Khabro íbúar! Í bókinni lýsir David Clinton 12 raunverulegum verkefnum, þar á meðal að gera sjálfvirkan öryggisafrit og endurheimtarkerfi, setja upp persónulegt skráaský í Dropbox-stíl og búa til þinn eigin MediaWiki netþjón. Þú munt kanna sýndarvæðingu, hörmungabata, öryggi, öryggisafrit, DevOps og kerfisbilanaleit í gegnum áhugaverðar dæmisögur. Hverjum kafla lýkur með yfirferð yfir bestu starfsvenjur, orðalista yfir ný hugtök og æfingum.

Útdráttur „10.1. Að búa til OpenVPN göng“

Ég hef þegar talað mikið um dulkóðun í þessari bók. SSH og SCP geta verndað gögn sem flutt eru yfir fjartengingar (kafli 3), dulkóðun skráa getur verndað gögn á meðan þau eru geymd á þjóninum (kafli 8) og TLS/SSL vottorð geta verndað gögn sem eru flutt á milli vefsvæða og vafra viðskiptavina (kafli 9). . En stundum þarf að vernda gögnin þín yfir fjölbreyttari tengingar. Til dæmis, kannski sumir af liðsmönnum þínum vinna á veginum á meðan þeir tengjast Wi-Fi í gegnum opinbera netkerfi. Þú ættir örugglega ekki að gera ráð fyrir að allir slíkir aðgangsstaðir séu öruggir, en fólkið þitt þarf leið til að tengjast auðlindum fyrirtækisins - og það er þar sem VPN getur hjálpað.

Rétt hönnuð VPN göng veita beina tengingu milli fjarlægra viðskiptavina og netþjónsins á þann hátt sem felur gögn þegar þau ferðast um óöruggt net. Og hvað? Þú hefur nú þegar séð mörg verkfæri sem geta gert þetta með dulkóðun. Raunverulegt gildi VPN er að með því að opna göng geturðu tengt fjarnet eins og þau væru öll staðbundin. Í vissum skilningi ertu að nota framhjá.

Með því að nota þetta útbreidda net geta stjórnendur framkvæmt vinnu sína á netþjónum sínum hvar sem er. En mikilvægara er að fyrirtæki með fjármagn sem er dreift á marga staði getur gert þau öll sýnileg og aðgengileg öllum hópum sem þurfa á þeim að halda, hvar sem þeir eru (Mynd 10.1).

Göngin sjálf tryggja ekki öryggi. En einn af dulkóðunarstöðlunum getur verið innifalinn í netskipulaginu, sem eykur öryggið verulega. Göng búin til með opnum OpenVPN pakka nota sömu TLS/SSL dulkóðun og þú hefur þegar lesið um. OpenVPN er ekki eini göngvalkosturinn sem til er, en hann er einn sá þekktasti. Það er talið vera örlítið hraðvirkara og öruggara en önnur Layer 2 göng samskiptareglur sem notar IPsec dulkóðun.

Viltu að allir í teyminu þínu eigi samskipti sín á milli á öruggan hátt á meðan þú ert á veginum eða vinnur í mismunandi byggingum? Til að gera þetta þarftu að búa til OpenVPN netþjón til að leyfa samnýtingu forrita og aðgang að staðarnetsumhverfi miðlarans. Til að þetta virki þarftu bara að keyra tvær sýndarvélar eða tvo gáma: einn til að starfa sem þjónn/gestgjafi og einn til að starfa sem viðskiptavinur. Að byggja upp VPN er ekki einfalt ferli, svo það er líklega þess virði að taka nokkrar mínútur til að fá heildarmyndina í huga.

Linux í aðgerð bók

10.1.1. OpenVPN netþjónsstillingar

Áður en þú byrjar mun ég gefa þér gagnleg ráð. Ef þú ætlar að gera það sjálfur (og ég mæli eindregið með að þú gerir það), muntu líklega finna sjálfan þig að vinna með marga flugstöðvarglugga opna á skjáborðinu þínu, hver tengdur við aðra vél. Það er hætta á að þú slærð inn ranga skipun á einhverjum tímapunkti í gluggann. Til að forðast þetta geturðu notað hostname skipunina til að breyta nafni vélarinnar sem birtist á skipanalínunni í eitthvað sem segir þér greinilega hvar þú ert. Þegar þú hefur gert þetta þarftu að skrá þig út af þjóninum og skrá þig aftur inn til að nýju stillingarnar taki gildi. Svona lítur það út:

Linux í aðgerð bók
Með því að fylgja þessari nálgun og gefa viðeigandi nöfnum á hverja vél sem þú vinnur með geturðu auðveldlega fylgst með hvar þú ert.

Eftir að hafa notað hýsingarheiti gætirðu lent í pirrandi Ófær um að leysa Host OpenVPN-Server skilaboð þegar þú framkvæmir síðari skipanir. Uppfærsla á /etc/hosts skránni með viðeigandi nýju hýsingarheiti ætti að leysa málið.

Að undirbúa netþjóninn þinn fyrir OpenVPN

Til að setja upp OpenVPN á netþjóninum þínum þarftu tvo pakka: openvpn og easy-rsa (til að stjórna dulkóðunarlyklaframleiðsluferlinu). CentOS notendur ættu fyrst að setja upp epel-release geymsluna ef þörf krefur, eins og þú gerðir í kafla 2. Til að geta prófað aðgang að netþjónaforritinu geturðu líka sett upp Apache vefþjóninn (apache2 á Ubuntu og httpd á CentOS).

Á meðan þú ert að setja upp netþjóninn þinn mæli ég með því að virkja eldvegg sem lokar á allar portar nema 22 (SSH) og 1194 (sjálfgefin tengi OpenVPN). Þetta dæmi sýnir hvernig ufw myndi virka á Ubuntu, en ég er viss um að þú manst enn eftir CentOS eldveggsforritinu frá 9. kafla:

# ufw enable
# ufw allow 22
# ufw allow 1194

Til að virkja innri leið á milli netviðmóta á þjóninum þarftu að afskrifa eina línu (net.ipv4.ip_forward = 1) í /etc/sysctl.conf skránni. Þetta gerir kleift að beina ytri viðskiptavinum eftir þörfum þegar þeir eru tengdir. Til að láta nýja valkostinn virka skaltu keyra sysctl -p:

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

Miðlaraumhverfið þitt er nú að fullu stillt, en það er enn eitt sem þarf að gera áður en þú ert tilbúinn: þú þarft að ljúka eftirfarandi skrefum (við munum fjalla ítarlega um þau næst).

  1. Búðu til sett af dulkóðunarlykla fyrir almenningslykilinnviði (PKI) á þjóninum með því að nota forskriftirnar sem fylgja easy-rsa pakkanum. Í meginatriðum virkar OpenVPN netþjónninn einnig sem eigin vottorðsyfirvald (CA).
  2. Útbúa viðeigandi lykla fyrir viðskiptavininn
  3. Stilltu server.conf skrána fyrir netþjóninn
  4. Settu upp OpenVPN viðskiptavin þinn
  5. Athugaðu VPN þinn

Búa til dulkóðunarlykla

Til að hafa hlutina einfalda geturðu sett upp lykilinnviði þína á sömu vél og OpenVPN netþjónninn er í gangi. Hins vegar, bestu starfsvenjur í öryggi benda venjulega til þess að nota sérstakan CA netþjón fyrir framleiðsluuppsetningar. Ferlið við að búa til og dreifa dulkóðunarlyklaauðlindum til notkunar í OpenVPN er sýnt á mynd. 10.2.

Linux í aðgerð bók
Þegar þú settir upp OpenVPN var /etc/openvpn/ skráin búin til sjálfkrafa, en það er ekkert í henni ennþá. Openvpn og easy-rsa pakkarnir eru með dæmi um sniðmátsskrár sem þú getur notað sem grunn fyrir uppsetningu þína. Til að hefja vottunarferlið skaltu afrita easy-rsa sniðmátasafnið frá /usr/share/ til /etc/openvpn og breyta í easy-rsa/ möppuna:

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

Easy-rsa skráin mun nú innihalda töluvert af skriftum. Í töflu 10.1 sýnir verkfærin sem þú munt nota til að búa til lykla.

Linux í aðgerð bók

Ofangreindar aðgerðir krefjast rótarréttinda, svo þú þarft að verða rót í gegnum sudo su.

Fyrsta skráin sem þú munt vinna með heitir vars og inniheldur umhverfisbreyturnar sem easy-rsa notar við að búa til lykla. Þú þarft að breyta skránni til að nota þín eigin gildi í stað sjálfgefna gilda sem þegar eru til staðar. Svona mun skráin mín líta út (skráning 10.1).

Skráning 10.1. Helstu brot af skránni /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="[email protected]"
export KEY_OU="IT"

Að keyra vars skrána mun senda gildi hennar til skeljaumhverfisins, þar sem þau verða innifalin í innihaldi nýju lyklanna þinna. Af hverju virkar sudo skipunin ekki ein og sér? Vegna þess að í fyrsta skrefinu breytum við handritinu sem heitir vars og notum það síðan. Að sækja um og þýðir að vars skráin sendir gildi sín í skel umhverfið, þar sem þau verða innifalin í innihaldi nýju lyklanna þinna.

Vertu viss um að keyra skrána aftur með því að nota nýja skel til að ljúka óloknu ferlinu. Þegar þessu er lokið mun handritið biðja þig um að keyra annað handrit, clean-all, til að fjarlægja allt efni í /etc/openvpn/easy-rsa/keys/ möppunni:

Linux í aðgerð bók
Næsta skref er náttúrulega að keyra clean-all forskriftina og síðan build-ca, sem notar pkitool forskriftina til að búa til rótarvottorðið. Þú verður beðinn um að staðfesta auðkennisstillingarnar sem vars:

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

Næst kemur build-key-server handritið. Þar sem það notar sama pkitool handritið ásamt nýja rótarskírteininu muntu sjá sömu spurningar til að staðfesta stofnun lyklaparsins. Lyklarnir verða nefndir út frá röksemdunum sem þú sendir, sem, nema þú sért að keyra mörg VPN á þessari vél, verða venjulega netþjónn, eins og í dæminu:

# ./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 notar færibreytur sem eru búnar til af Diffie-Hellman reikniritinu (með build-dh) til að semja um auðkenningu fyrir nýjar tengingar. Skráin sem er búin til hér þarf ekki að vera leynileg heldur verður hún að vera búin til með build-dh forskriftinni fyrir RSA lyklana sem eru virkir núna. Ef þú býrð til nýja RSA lykla í framtíðinni þarftu einnig að uppfæra Diffie-Hellman skrána:

# ./build-dh

Hliðarlyklar þjónsins þíns munu nú lenda í /etc/openvpn/easy-rsa/keys/ skránni, en OpenVPN veit þetta ekki. Sjálfgefið mun OpenVPN leita að lyklum í /etc/openvpn/, svo afritaðu þá:

# 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

Að undirbúa dulkóðunarlykla viðskiptavinar

Eins og þú hefur þegar séð notar TLS dulkóðun pör af samsvarandi lyklum: einn uppsettur á þjóninum og einn uppsettur á ytri biðlaranum. Þetta þýðir að þú þarft viðskiptavinalykla. Gamli vinur okkar pkitool er nákvæmlega það sem þú þarft fyrir þetta. Í þessu dæmi, þegar við keyrum forritið í /etc/openvpn/easy-rsa/ möppunni, sendum við því biðlararrök til að búa til skrár sem kallast client.crt og client.key:

# ./pkitool client

Biðlaraskrárnar tvær, ásamt upprunalegu ca.crt skránni sem enn er í keys/ möppunni, ættu nú að vera fluttar á öruggan hátt til viðskiptavinarins. Vegna eignarhalds þeirra og aðgangsréttar er þetta kannski ekki svo auðvelt. Einfaldasta aðferðin er að afrita innihald frumskrárinnar (og ekkert nema það efni) handvirkt í útstöð sem keyrir á skjáborði tölvunnar þinnar (veldu textann, hægrismelltu á hann og veldu Afrita í valmyndinni). Límdu þetta síðan inn í nýja skrá með sama nafni og þú býrð til í annarri útstöð sem er tengdur við viðskiptavininn þinn.

En hver sem er getur klippt og límt. Í staðinn skaltu hugsa eins og stjórnandi vegna þess að þú munt ekki alltaf hafa aðgang að GUI þar sem klippa/líma aðgerðir eru mögulegar. Afritaðu skrárnar í heimamöppu notandans þíns (svo að ytri scp aðgerðin geti fengið aðgang að þeim) og notaðu síðan chown til að breyta eignarhaldi skránna úr rót yfir í venjulegan notanda sem ekki er rót þannig að hægt sé að framkvæma ytri scp aðgerðina. Gakktu úr skugga um að allar skrárnar þínar séu uppsettar og aðgengilegar. Þú færð þá til viðskiptavinarins aðeins síðar:

# 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

Með fullt sett af dulkóðunarlyklum tilbúið til notkunar þarftu að segja þjóninum hvernig þú vilt búa til VPN. Þetta er gert með því að nota server.conf skrána.

Að fækka ásláttum

Er of mikið vélritað? Stækkun með sviga mun hjálpa til við að minnka þessar sex skipanir í tvær. Ég er viss um að þú getur kynnt þér þessi tvö dæmi og skilið hvað er að gerast. Meira um vert, þú munt geta skilið hvernig á að beita þessum meginreglum við aðgerðir sem fela í sér tugi eða jafnvel hundruð þætti:

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

Setja upp server.conf skrána

Hvernig geturðu vitað hvernig server.conf skráin ætti að líta út? Mundu eftir easy-rsa skráarsniðmátinu sem þú afritaðir frá /usr/share/? Þegar þú settir upp OpenVPN varstu eftir með þjappaða stillingarsniðmátsskrá sem þú getur afritað í /etc/openvpn/. Ég mun byggja á þeirri staðreynd að sniðmátið er í geymslu og kynna þér gagnlegt tól: zcat.

Þú veist nú þegar um að prenta textainnihald skráar á skjáinn með cat skipuninni, en hvað ef skráin er þjappuð með gzip? Þú getur alltaf pakkað niður skránni og þá sendir cat hana glaður út, en það er einu eða tveimur skrefum meira en nauðsynlegt er. Í staðinn, eins og þú gætir hafa giskað á, geturðu gefið út zcat skipunina til að hlaða ópakkaðan texta inn í minnið í einu skrefi. Í eftirfarandi dæmi, í stað þess að prenta texta á skjáinn, muntu vísa honum á nýja skrá sem heitir server.conf:

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

Við skulum leggja til hliðar hin umfangsmiklu og gagnlegu skjöl sem fylgja skránni og sjá hvernig hún gæti litið út þegar þú ert búinn að breyta. Athugaðu að semíkomma (;) segir OpenVPN að lesa ekki eða framkvæma næstu línu (Skrá 10.2).

Linux í aðgerð bók
Við skulum fara í gegnum nokkrar af þessum stillingum.

  • Sjálfgefið er að OpenVPN keyrir á höfn 1194. Þú getur breytt þessu til dæmis til að fela starfsemi þína frekar eða forðast árekstra við önnur virk göng. Þar sem 1194 krefst lágmarks samhæfingar við viðskiptavini er best að gera það á þennan hátt.
  • OpenVPN notar annað hvort Transmission Control Protocol (TCP) eða User Datagram Protocol (UDP) til að senda gögn. TCP gæti verið aðeins hægara, en það er áreiðanlegra og líklegra að forritum sem keyra á báðum endum ganganna skilja það.
  • Þú getur tilgreint dev tun þegar þú vilt búa til einfaldari, skilvirkari IP göng sem bera gagnaefni og ekkert annað. Ef þú þarft aftur á móti að tengja mörg netviðmót (og netin sem þau tákna), búa til Ethernet brú, verður þú að velja dev tap. Ef þú skilur ekki hvað þetta þýðir, notaðu þá tun rök.
  • Næstu fjórar línur gefa OpenVPN nöfnin á þremur auðkenningarskrám á þjóninum og dh2048 valkostaskránni sem þú bjóst til áðan.
  • Miðlaralínan stillir svið og undirnetmaska ​​sem verður notuð til að úthluta IP-tölum til viðskiptavina við innskráningu.
  • Valfrjálsa þrýstibreytan „leið 10.0.3.0 255.255.255.0“ gerir ytri viðskiptavinum kleift að fá aðgang að einkaundirnetum á bak við netþjóninn. Til að þetta virki þarf líka að setja upp netið á þjóninum sjálfum þannig að einkaundirnetið viti um OpenVPN undirnetið (10.8.0.0).
  • Port-share localhost 80 línan gerir þér kleift að beina viðskiptavinaumferð sem kemur á port 1194 yfir á staðbundinn vefþjón sem hlustar á port 80. (Þetta mun vera gagnlegt ef þú ætlar að nota vefþjóninn til að prófa VPN þinn.) Þetta virkar bara síðan þegar tcp samskiptareglan er valin.
  • Notandinn enginn og hóplínur verða að vera virkjaðar með því að fjarlægja semíkommur (;). Með því að neyða ytri viðskiptavini til að keyra sem enginn og nogroup tryggir það að fundir á þjóninum séu án forréttinda.
  • log tilgreinir að núverandi skráningarfærslur muni skrifa yfir gamlar færslur í hvert sinn sem OpenVPN er ræst, en log-append bætir nýjum færslum við núverandi annálsskrá. Openvpn.log skráin sjálf er skrifuð í /etc/openvpn/ möppuna.

Að auki er gildi viðskiptavinar til viðskiptavinar einnig oft bætt við stillingarskrána svo að margir viðskiptavinir geti séð hver annan auk OpenVPN netþjónsins. Ef þú ert ánægður með stillingarnar þínar geturðu ræst OpenVPN netþjóninn:

# systemctl start openvpn

Vegna breytilegs eðlis sambandsins milli OpenVPN og systemd, getur eftirfarandi setningafræði stundum verið krafist til að hefja þjónustu: systemctl start openvpn@server.

Að keyra IP-addr til að skrá netviðmót netþjónsins þíns ætti nú að gefa út tengil á nýtt viðmót sem kallast tun0. OpenVPN mun búa til það til að þjóna komandi viðskiptavinum:

$ 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

Þú gætir þurft að endurræsa netþjóninn áður en allt fer að virka að fullu. Næsta stopp er biðlaratölvan.

10.1.2. Stillir OpenVPN biðlarann

Hefð eru göng byggð með að minnsta kosti tveimur útgönguleiðum (annars myndum við kalla þá hella). Rétt stillt OpenVPN á þjóninum beinir umferð inn og út úr göngunum á annarri hliðinni. En þú þarft líka hugbúnað sem keyrir á biðlara megin, það er, á hinum enda ganganna.

Í þessum hluta ætla ég að einbeita mér að því að setja upp einhvers konar Linux tölvu handvirkt til að starfa sem OpenVPN viðskiptavinur. En þetta er ekki eina leiðin sem þetta tækifæri er í boði. OpenVPN styður biðlaraforrit sem hægt er að setja upp og nota á borðtölvum og fartölvum sem keyra Windows eða macOS, sem og Android og iOS snjallsíma og spjaldtölvur. Sjá openvpn.net fyrir frekari upplýsingar.

OpenVPN pakkann verður að vera settur upp á biðlaravélinni eins og hann var settur upp á þjóninum, þó það sé engin þörf á easy-rsa hér þar sem lyklarnir sem þú ert að nota eru þegar til. Þú þarft að afrita client.conf sniðmátsskrána í /etc/openvpn/ möppuna sem þú bjóst til. Að þessu sinni verður skráin ekki þjöppuð, þannig að venjuleg cp skipun mun gera verkið vel:

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

Flestar stillingar í client.conf skránni munu skýra sig nokkuð sjálfar: þær ættu að passa við gildin á þjóninum. Eins og þú sérð af eftirfarandi dæmiskrá er einstaka færibreytan fjarstýring 192.168.1.23 1194, sem segir viðskiptavininum IP tölu netþjónsins. Aftur, vertu viss um að þetta sé netfang netþjónsins þíns. Þú ættir líka að þvinga biðlaratölvuna til að sannreyna áreiðanleika netþjónsvottorðsins til að koma í veg fyrir mögulega mann-í-miðju árás. Ein leið til að gera þetta er að bæta við línunni remote-cert-tls þjóninum (Skrá 10.3).

Linux í aðgerð bók
Þú getur nú farið í /etc/openvpn/ möppuna og dregið út vottunarlyklana af þjóninum. Skiptu um IP tölu eða lén netþjónsins í dæminu fyrir gildin þín:

Linux í aðgerð bók
Ekkert spennandi mun líklega gerast fyrr en þú keyrir OpenVPN á viðskiptavininum. Þar sem þú þarft að fara framhjá nokkrum rökum muntu gera það frá skipanalínunni. --tls-client rökin segja OpenVPN að þú munt starfa sem viðskiptavinur og tengjast með TLS dulkóðun og --config bendir á stillingarskrána þína:

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

Lestu skipanaúttakið vandlega til að ganga úr skugga um að þú sért rétt tengdur. Ef eitthvað fer úrskeiðis í fyrsta skiptið gæti það verið vegna misræmis í stillingum á milli þjóns og stillingarskráa biðlara eða nettengingar/eldveggsvandamála. Hér eru nokkrar ábendingar um bilanaleit.

  • Lestu vandlega úttakið af OpenVPN aðgerðinni á viðskiptavininum. Það inniheldur oft dýrmæt ráð um hvað nákvæmlega er ekki hægt að gera og hvers vegna.
  • Athugaðu villuboðin í openvpn.log og openvpn-status.log skránum í /etc/openvpn/ möppunni á þjóninum.
  • Athugaðu kerfisskrárnar á þjóninum og biðlaranum fyrir OpenVPN-tengd og tímasett skilaboð. (journalctl -ce mun birta nýjustu færslurnar.)
  • Gakktu úr skugga um að þú sért með virka nettengingu milli þjónsins og biðlarans (nánar um þetta í kafla 14).

Um höfundinn

David Clinton - kerfisstjóri, kennari og rithöfundur. Hann hefur gefið út, skrifað um og búið til fræðsluefni fyrir margar mikilvægar tæknigreinar, þar á meðal Linux kerfi, tölvuský (sérstaklega AWS) og gámatækni eins og Docker. Hann skrifaði bókina Learn Amazon Web Services in a Month of Lunches (Manning, 2017). Mörg myndbandanámskeiða hans er að finna á Pluralsight.com og tenglar á aðrar bækur hans (um Linux stjórnun og sýndarvæðingu netþjóna) eru fáanlegar á bootstrap-it.com.

» Nánari upplýsingar um bókina má finna á heimasíðu útgefanda
» efnisyfirlit
» Útdráttur

Fyrir Khabrozhiteley 25% afslátt með afsláttarmiða - Linux
Við greiðslu á pappírsútgáfu bókarinnar er rafbók send með tölvupósti.

Heimild: www.habr.com

Bæta við athugasemd