Үзінді «10.1. OpenVPN туннелін жасау»
Дұрыс жобаланған VPN туннелі қашықтағы клиенттер мен сервер арасында қауіпті желі арқылы өтетін деректерді жасыратындай тікелей байланысты қамтамасыз етеді. Енді не? Сіз мұны шифрлау арқылы жасай алатын көптеген құралдарды көрдіңіз. VPN-дің нақты құндылығы - туннельді ашу арқылы қашықтағы желілерді олардың барлығы жергілікті сияқты қосуға болады. Бір мағынада сіз айналма жолды пайдаланасыз.
Осы кеңейтілген желіні пайдалана отырып, әкімшілер өз серверлеріндегі жұмыстарын кез келген жерден орындай алады. Бірақ одан да маңыздысы, ресурстары бірнеше орындарға таралған компания олардың барлығын көрінетін және қажет ететін барлық топтарға, қай жерде болса да қолжетімді ете алады (10.1-сурет).
Туннельдің өзі қауіпсіздікке кепілдік бермейді. Бірақ шифрлау стандарттарының бірі желі құрылымына қосылуы мүмкін, бұл қауіпсіздік деңгейін айтарлықтай арттырады. Ашық бастапқы OpenVPN бумасы арқылы жасалған туннельдер сіз бұрын оқыған TLS/SSL шифрлауын пайдаланады. OpenVPN қол жетімді туннель жасаудың жалғыз нұсқасы емес, бірақ ол ең танымалдардың бірі. Ол IPsec шифрлауын қолданатын балама 2-деңгей туннель протоколына қарағанда сәл жылдамырақ және қауіпсізрек деп саналады.
Жолда немесе әртүрлі ғимараттарда жұмыс істегенде сіздің командаңыздың барлығы бір-бірімен қауіпсіз байланыста болғанын қалайсыз ба? Бұл әрекетті орындау үшін қолданбаларды ортақ пайдалануға және сервердің жергілікті желі ортасына кіруге рұқсат беру үшін OpenVPN серверін жасау керек. Бұл жұмыс істеу үшін сізге тек екі виртуалды машинаны немесе екі контейнерді іске қосу қажет: біреуі сервер/хост ретінде әрекет ету үшін және екіншісі клиент ретінде әрекет ету үшін. VPN құру қарапайым процесс емес, сондықтан үлкен суретті есте сақтау үшін бірнеше минут жұмсауға тұрарлық.
10.1.1. OpenVPN сервер конфигурациясы
Бастамас бұрын мен сізге пайдалы кеңес беремін. Егер сіз мұны өзіңіз жасағыңыз келсе (және мен сізге өте кеңес беремін), жұмыс үстеліңізде әрқайсысы басқа құрылғыға қосылған бірнеше терминал терезелерімен жұмыс істеп жатқаныңызды табасыз. Бір кезде терезеге қате пәрменді енгізу қаупі бар. Бұған жол бермеу үшін пәрмен жолында көрсетілген құрылғы атауын қай жерде екеніңізді анық көрсететін нәрсеге өзгерту үшін хост атауы пәрменін пайдалануға болады. Мұны істегеннен кейін, жаңа параметрлер күшіне енуі үшін серверден шығып, қайта кіруіңіз керек. Мынадай көрінеді:
Осы тәсілді қолданып және сіз жұмыс істейтін әрбір машинаға сәйкес атаулар беру арқылы сіз қай жерде екеніңізді оңай қадағалай аласыз.
Хост атауын пайдаланғаннан кейін келесі пәрмендерді орындау кезінде тітіркендіргіш OpenVPN-сервер хостын шешу мүмкін емес хабарларына тап болуыңыз мүмкін. /etc/hosts файлын сәйкес жаңа хост атауымен жаңарту мәселені шешуі керек.
Серверіңізді OpenVPN үшін дайындау
Серверге OpenVPN орнату үшін сізге екі пакет қажет: openvpn және easy-rsa (шифрлау кілтін жасау процесін басқару үшін). CentOS пайдаланушылары қажет болса, алдымен epel-релиз репозиторийін орнатуы керек, 2-тарауда орындағаныңыздай. Сервер қолданбасына кіру мүмкіндігін тексеру мүмкіндігін алу үшін Apache веб-серверін (Ubuntu жүйесінде apache2 және CentOS жүйесінде httpd) орнатуға болады.
Серверді реттеп жатқанда, 22 (SSH) және 1194 (OpenVPN әдепкі порты) порттарынан басқа барлық порттарды блоктайтын брандмауэрді белсендіруді ұсынамын. Бұл мысал Ubuntu жүйесінде ufw қалай жұмыс істейтінін көрсетеді, бірақ 9-тараудағы CentOS брандмауэр бағдарламасы әлі есіңізде екеніне сенімдімін:
# ufw enable
# ufw allow 22
# ufw allow 1194
Сервердегі желі интерфейстері арасында ішкі маршруттауды қосу үшін /etc/sysctl.conf файлында бір жолды (net.ipv4.ip_forward = 1) алып тастау керек. Бұл қашықтағы клиенттерге қосылғаннан кейін қажетінше қайта бағыттауға мүмкіндік береді. Жаңа опция жұмыс істеуі үшін sysctl -p іске қосыңыз:
# nano /etc/sysctl.conf
# sysctl -p
Сіздің сервер ортаңыз енді толық конфигурацияланды, бірақ дайын болғанға дейін тағы бір нәрсе істеу керек: келесі қадамдарды аяқтау керек (біз оларды келесіде егжей-тегжейлі қарастырамыз).
- Easy-rsa бумасымен қамтамасыз етілген сценарийлерді пайдаланып серверде ашық кілттер инфрақұрылымының (PKI) шифрлау кілттерінің жинағын жасаңыз. Негізінде, OpenVPN сервері өзінің сертификаттау органы (CA) ретінде де әрекет етеді.
- Клиент үшін сәйкес кілттерді дайындаңыз
- Сервер үшін server.conf файлын конфигурациялаңыз
- OpenVPN клиентін орнатыңыз
- VPN-ді тексеріңіз
Шифрлау кілттерін жасау
Қарапайым істерді сақтау үшін OpenVPN сервері жұмыс істеп тұрған құрылғыда негізгі инфрақұрылымды орнатуға болады. Дегенмен, қауіпсіздіктің ең жақсы тәжірибелері әдетте өндірісті орналастыру үшін бөлек CA серверін пайдалануды ұсынады. OpenVPN-де пайдалану үшін шифрлау кілтінің ресурстарын жасау және тарату процесі суретте көрсетілген. 10.2.
OpenVPN орнатқан кезде /etc/openvpn/ каталогы автоматты түрде жасалды, бірақ онда әлі ештеңе жоқ. Openvpn және easy-rsa пакеттері конфигурацияңыз үшін негіз ретінде пайдалануға болатын үлгі файлдарымен бірге келеді. Сертификаттау процесін бастау үшін easy-rsa үлгі каталогын /usr/share/ ішінен /etc/openvpn ішіне көшіріп, easy-rsa/ каталогына өзгертіңіз:
# cp -r /usr/share/easy-rsa/ /etc/openvpn
$ cd /etc/openvpn/easy-rsa
Easy-rsa каталогында енді бірнеше сценарий болады. Кестеде 10.1 кілттерді жасау үшін қолданылатын құралдардың тізімі берілген.
Жоғарыда көрсетілген әрекеттер түбірлік артықшылықтарды қажет етеді, сондықтан sudo su арқылы root болу керек.
Сіз жұмыс істейтін бірінші файл vars деп аталады және кілттерді жасау кезінде easy-rsa пайдаланатын ортаның айнымалы мәндерін қамтиды. Бұрыннан бар әдепкі мәндердің орнына өз мәндеріңізді пайдалану үшін файлды өңдеуіңіз керек. Менің файлым осылай көрінеді (Listing 10.1).
Листинг 10.1. /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"
Vars файлын іске қосу оның мәндерін қабық ортасына береді, онда олар сіздің жаңа кілттеріңіздің мазмұнына қосылады. Неліктен sudo командасы өздігінен жұмыс істемейді? Өйткені бірінші қадамда біз vars деп аталатын сценарийді өңдеп, содан кейін оны қолданамыз. Қолдану және бұл vars файлы өз мәндерін қабық ортасына жіберетінін білдіреді, онда олар сіздің жаңа кілттеріңіздің мазмұнына қосылады.
Аяқталмаған процесті аяқтау үшін жаңа қабық арқылы файлды қайта іске қосуды ұмытпаңыз. Бұл орындалғанда, сценарий /etc/openvpn/easy-rsa/keys/ каталогындағы кез келген мазмұнды жою үшін басқа сценарийді, барлығын тазалауды іске қосуды ұсынады:
Әрине, келесі қадам - барлығын тазалау сценарийін іске қосу, одан кейін түбірлік куәлікті жасау үшін pkitool сценарийін пайдаланатын build-ca. Сізден vars ұсынған сәйкестендіру параметрлерін растау сұралады:
# ./clean-all
# ./build-ca
Generating a 2048 bit RSA private key
Содан кейін құрастыру-кілт-сервер сценарийі келеді. Ол бірдей pkitool сценарийін жаңа түбірлік сертификатпен бірге пайдаланатындықтан, кілттер жұбының жасалуын растау үшін бірдей сұрақтарды көресіз. Кілттер сіз берген дәлелдер негізінде аталады, егер сіз осы құрылғыда бірнеше VPN қосылмасаңыз, әдетте мысалдағыдай сервер болады:
# ./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 жаңа қосылымдар үшін аутентификацияны келіссөздер үшін Diffie-Hellman алгоритмімен (Build-dh көмегімен) жасалған параметрлерді пайдаланады. Мұнда жасалған файл құпия болуы қажет емес, бірақ қазіргі уақытта белсенді RSA кілттері үшін build-dh сценарийі арқылы жасалуы керек. Болашақта жаңа RSA кілттерін жасасаңыз, сонымен қатар Diffie-Hellman файлын жаңарту қажет болады:
# ./build-dh
Сервер жағындағы кілттер енді /etc/openvpn/easy-rsa/keys/ каталогында аяқталады, бірақ OpenVPN мұны білмейді. Әдепкі бойынша, OpenVPN кілттерді /etc/openvpn/ ішінен іздейді, сондықтан оларды көшіріңіз:
# 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
Клиенттік шифрлау кілттерін дайындау
Көріп отырғаныңыздай, TLS шифрлауы сәйкес кілттердің жұптарын пайдаланады: біреуі серверде орнатылған және біреуі қашықтағы клиентте орнатылған. Бұл сізге клиент кілттері қажет болады дегенді білдіреді. Біздің ескі досымыз pkitool - бұл сізге қажет нәрсе. Бұл мысалда, бағдарламаны /etc/openvpn/easy-rsa/ каталогында іске қосқан кезде, клиент.crt және client.key деп аталатын файлдарды жасау үшін оған клиент аргументін береміз:
# ./pkitool client
Екі клиенттік файл, әлі кілттерде/каталогта тұрған бастапқы ca.crt файлымен бірге клиентке қауіпсіз түрде тасымалдануы керек. Олардың иелену және қол жеткізу құқықтарына байланысты бұл оңай болмауы мүмкін. Ең қарапайым әдіс - бастапқы файлдың мазмұнын (және осы мазмұннан басқа ештеңені) компьютердің жұмыс үстелінде жұмыс істейтін терминалға қолмен көшіру (мәтінді таңдап, оны тінтуірдің оң жақ түймешігімен басып, мәзірден Көшіру пәрменін таңдаңыз). Содан кейін оны клиентке қосылған екінші терминалда жасаған атпен жаңа файлға қойыңыз.
Бірақ кез келген адам кесіп, қоюға болады. Оның орнына, әкімші сияқты ойлаңыз, өйткені кесу/қою әрекеттері мүмкін болатын GUI-ге әрқашан қол жеткізе алмайсыз. Файлдарды пайдаланушының үй каталогына көшіріңіз (қашықтағы scp әрекеті оларға қол жеткізе алатындай), содан кейін қашықтағы scp әрекетін орындау үшін файлдардың иелігін түбірден кәдімгі root емес пайдаланушыға өзгерту үшін chown пайдаланыңыз. Барлық файлдарыңыздың қазіргі уақытта орнатылғанын және қолжетімді екенін тексеріңіз. Сіз оларды клиентке сәл кейінірек жылжытасыз:
# 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
Шифрлау кілттерінің толық жинағы пайдалануға дайын болғанда, серверге VPN-ді қалай жасағыңыз келетінін айтуыңыз керек. Бұл server.conf файлы арқылы орындалады.
Пернелерді басу санын азайту
Тым көп теру бар ма? Жақшалармен кеңейту осы алты пәрменді екіге дейін азайтуға көмектеседі. Сіз бұл екі мысалды зерттеп, не болып жатқанын түсіне алатыныңызға сенімдімін. Ең бастысы, сіз ондаған немесе тіпті жүздеген элементтерді қамтитын операцияларға осы принциптерді қалай қолдану керектігін түсіне аласыз:
# cp /etc/openvpn/easy-rsa/keys/{ca.crt,client.{key,crt}} /home/ubuntu/ # chown ubuntu:ubuntu /home/ubuntu/{ca.crt,client.{key,crt}}
server.conf файлын орнату
server.conf файлының қандай болуы керектігін қайдан білуге болады? /usr/share/ ішінен көшірген easy-rsa каталог үлгісі есіңізде ме? OpenVPN орнатқан кезде сізде /etc/openvpn/ ішіне көшіруге болатын қысылған конфигурация үлгісі файлы қалды. Мен шаблонның мұрағатталғандығына негізделемін және сізді пайдалы құралмен таныстырамын: zcat.
Сіз файлдың мәтіндік мазмұнын cat пәрмені арқылы экранға басып шығару туралы бұрыннан білесіз, бірақ файл gzip арқылы қысылса ше? Сіз әрқашан файлды аша аласыз, содан кейін мысық оны қуана шығарады, бірақ бұл қажет болғаннан бір немесе екі қадам артық. Оның орнына, сіз болжағандай, сіз бір қадамда қаптамадан шығарылған мәтінді жадқа жүктеу үшін zcat пәрменін бере аласыз. Келесі мысалда мәтінді экранға басып шығарудың орнына оны server.conf деп аталатын жаңа файлға қайта бағыттайсыз:
# zcat
/usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz
> /etc/openvpn/server.conf
$ cd /etc/openvpn
Файлмен бірге келетін ауқымды және пайдалы құжаттаманы бір жаққа қойып, өңдеуді аяқтаған кезде оның қалай көрінетінін көрейік. Нүктелі үтір (;) OpenVPN-ге келесі жолды оқымауды немесе орындамауды айтады (Listing 10.2).
Осы параметрлердің кейбірін қарастырайық.
- Әдепкі бойынша, OpenVPN 1194 портында жұмыс істейді. Мұны, мысалы, әрекеттеріңізді одан әрі жасыру немесе басқа белсенді туннельдермен қайшылықтарды болдырмау үшін өзгертуге болады. 1194 клиенттермен минималды үйлестіруді қажет ететіндіктен, мұны осылай жасаған дұрыс.
- OpenVPN деректерді жіберу үшін Transmission Control Protocol (TCP) немесе User Datagram Protocol (UDP) пайдаланады. TCP сәл баяуырақ болуы мүмкін, бірақ ол сенімдірек және туннельдің екі жағында да жұмыс істейтін қолданбаларға түсінікті болуы мүмкін.
- Деректер мазмұнын және басқа ештеңені тасымалдайтын қарапайым, тиімдірек IP туннелін жасағыңыз келгенде dev tun параметрін көрсетуге болады. Егер, керісінше, Ethernet көпірін жасай отырып, бірнеше желілік интерфейстерді (және олар көрсететін желілерді) қосу қажет болса, dev tap опциясын таңдауға тура келеді. Мұның бәрі нені білдіретінін түсінбесеңіз, tun аргументін пайдаланыңыз.
- Келесі төрт жолда OpenVPN сервердегі үш аутентификация файлының және бұрын жасалған dh2048 опциялар файлының атын береді.
- Сервер желісі жүйеге кірген кезде клиенттерге IP мекенжайларын тағайындау үшін пайдаланылатын ауқым мен ішкі желі маскасын орнатады.
- Қосымша push параметрі "бағыт 10.0.3.0 255.255.255.0" қашықтағы клиенттерге сервер артындағы жеке ішкі желілерге кіруге мүмкіндік береді. Бұл жұмысты орындау жеке ішкі желі OpenVPN ішкі желісі (10.8.0.0) туралы білуі үшін сервердің өзінде желіні орнатуды қажет етеді.
- Port-share localhost 80 желісі 1194 портында келетін клиенттік трафикті 80 портты тыңдайтын жергілікті веб-серверге қайта бағыттауға мүмкіндік береді. (Бұл VPN серверін тексеру үшін веб-серверді пайдаланатын болсаңыз пайдалы болады.) Бұл тек жұмыс істейді. содан кейін tcp протоколы таңдалғанда.
- Пайдаланушы ешкімді және топсыз топ жолдарын нүктелі үтірлерді (;) алып тастау арқылы қосу керек. Қашықтағы клиенттерді ешкім және ешкім тобы ретінде іске қосуға мәжбүрлеу сервердегі сеанстардың артықшылықсыз болуын қамтамасыз етеді.
- log ағымдағы журнал жазбалары OpenVPN іске қосылған сайын ескі жазбаларды қайта жазатынын көрсетеді, ал log-append бар журнал файлына жаңа жазбаларды қосады. openvpn.log файлының өзі /etc/openvpn/ каталогына жазылған.
Сонымен қатар, OpenVPN серверіне қосымша бірнеше клиенттер бір-бірін көре алатындай конфигурация файлына клиенттен клиентке мән де жиі қосылады. Егер конфигурацияңызға қанағаттансаңыз, OpenVPN серверін іске қосуға болады:
# systemctl start openvpn
OpenVPN және systemd арасындағы қатынастың өзгеретін сипатына байланысты кейде қызметті бастау үшін келесі синтаксис қажет болуы мүмкін: systemctl start openvpn@server.
Серверіңіздің желілік интерфейстерін тізімдеу үшін ip адресін іске қосу енді tun0 деп аталатын жаңа интерфейске сілтеме шығаруы керек. OpenVPN оны кіріс клиенттеріне қызмет көрсету үшін жасайды:
$ 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
Барлығы толық жұмыс істей бастағанға дейін серверді қайта жүктеу қажет болуы мүмкін. Келесі аялдама – клиенттік компьютер.
10.1.2. OpenVPN клиентін конфигурациялау
Дәстүр бойынша туннельдер кем дегенде екі шығу арқылы салынады (әйтпесе оларды үңгір деп атайтын едік). Сервердегі дұрыс конфигурацияланған OpenVPN трафикті туннельге бір жағынан бағыттайды. Бірақ сізге клиент жағында, яғни туннельдің екінші жағында жұмыс істейтін кейбір бағдарламалық жасақтама қажет болады.
Бұл бөлімде мен Linux компьютерінің кейбір түрін OpenVPN клиенті ретінде әрекет ету үшін қолмен орнатуға назар аударамын. Бірақ бұл мүмкіндіктің жалғыз жолы емес. OpenVPN Windows немесе macOS операциялық жүйесі жұмыс істейтін жұмыс үстелдері мен ноутбуктерде, сондай-ақ Android және iOS смартфондары мен планшеттерінде орнатылып, пайдалануға болатын клиенттік қолданбаларды қолдайды. Толық ақпаратты openvpn.net сайтынан қараңыз.
OpenVPN бумасы серверде орнатылғандықтан клиенттік құрылғыда орнатылуы керек, дегенмен мұнда оңай-rsa қажет емес, себебі сіз пайдаланып жатқан кілттер бұрыннан бар. client.conf үлгі файлын жаңа ғана жасаған /etc/openvpn/ каталогына көшіру керек. Бұл жолы файл ықшамдалмайды, сондықтан кәдімгі cp пәрмені тапсырманы жақсы орындайды:
# apt install openvpn
# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf
/etc/openvpn/
Client.conf файлындағы параметрлердің көпшілігі өздігінен түсінікті болады: олар сервердегі мәндерге сәйкес келуі керек. Келесі мысал файлынан көріп отырғаныңыздай, бірегей параметр қашықтағы 192.168.1.23 1194 болып табылады, ол клиентке сервердің IP мекенжайын айтады. Тағы да, бұл сіздің сервер мекенжайыңыз екеніне көз жеткізіңіз. Сондай-ақ, ықтимал ортадағы адам шабуылының алдын алу үшін клиенттік компьютерді сервер сертификатының түпнұсқалығын тексеруге мәжбүрлеу керек. Мұны істеудің бір жолы remote-cert-tls серверін қосу болып табылады (Listing 10.3).
Енді /etc/openvpn/ каталогына өтіп, серверден сертификаттау кілттерін шығаруға болады. Мысалдағы сервердің IP мекенжайын немесе домен атын мәндермен ауыстырыңыз:
Клиентте OpenVPN іске қоспайынша, қызықты ештеңе болмайды. Бірнеше аргумент беру қажет болғандықтан, оны пәрмен жолынан жасайсыз. --tls-client аргументі OpenVPN-ге клиент ретінде әрекет ететініңізді және TLS шифрлау арқылы қосылатыныңызды айтады және --config конфигурация файлына нұсқайды:
# openvpn --tls-client --config /etc/openvpn/client.conf
Дұрыс қосылғаныңызға көз жеткізу үшін пәрмен шығысын мұқият оқып шығыңыз. Бірінші рет бірдеңе дұрыс болмаса, бұл сервер мен клиент конфигурация файлдары арасындағы параметрлердің сәйкес келмеуі немесе желі қосылымы/брандмауэр мәселесі болуы мүмкін. Міне, ақауларды жою бойынша кеңестер.
- Клиенттегі OpenVPN операциясының нәтижесін мұқият оқып шығыңыз. Онда көбінесе нақты не істеуге болмайтыны және неліктен екендігі туралы құнды кеңестер бар.
- Сервердегі /etc/openvpn/ каталогындағы openvpn.log және openvpn-status.log файлдарындағы қате туралы хабарларды тексеріңіз.
- OpenVPN-қа қатысты және уақытты хабарлар үшін сервер мен клиенттегі жүйелік журналдарды тексеріңіз. (journalctl -ce ең соңғы жазбаларды көрсетеді.)
- Сервер мен клиент арасында белсенді желі байланысы бар екеніне көз жеткізіңіз (бұл туралы толығырақ 14-тарауда).
Автор туралы
Дэвид Клинтон - жүйелік әкімші, оқытушы және жазушы. Ол Linux жүйелерін, бұлтты есептеулерді (әсіресе AWS) және Docker сияқты контейнерлік технологияларды қоса алғанда, көптеген маңызды техникалық пәндер үшін оқу материалдарын басқарды, жазды және жасады. Ол Amazon веб-қызметтерін түскі ас айында үйреніңіз (Маннинг, 2017) кітабын жазды. Оның көптеген бейне оқыту курстарын Pluralsight.com сайтынан табуға болады және оның басқа кітаптарына сілтемелер (Linux әкімшілігі және серверді виртуализациялау туралы) мына жерден қол жетімді:
» Кітап туралы толық ақпаратты мына жерден табуға болады
»
»
Khabrozhiteley үшін купонды пайдалану арқылы 25% жеңілдік - Linux
Кітаптың қағаз нұсқасын төлегеннен кейін электронды кітап электронды поштаға жіберіледі.
Ақпарат көзі: www.habr.com