වෘත්තියෙන් මම පරිගණක පද්ධති සහ ජාලවල පරිපාලකයෙක් (කෙටියෙන්: පද්ධති පරිපාලක) වන අතර, වසර 10 කට වඩා ටිකක් වැඩි කාලයක් මහාචාර්යවරයාට පැවසීමට මට අවස්ථාව ලැබුණි. [අතිශයින්ම] ආරක්ෂක පියවරයන් අවශ්ය ඒවා ඇතුළුව විවිධ පද්ධතිවල ක්රියාකාරකම්. කලකට පෙර මට එය සිත්ගන්නාසුළු වූ බවත් එය සිදු විය dev
, ඉතින්, මම පසුකරමින් සිටියෙමි). නමුත් මම කතා කරන්නේ සංවර්ධනය ගැන නොවේ, මම යෙදුම් සඳහා ආරක්ෂිත සහ කාර්යක්ෂම පරිසරයක් ගැන කතා කරමි.
මූල්ය තාක්ෂණය (fintech) ඊළඟට යන්න තොරතුරු ආරක්ෂාව (infosec) සහ පළමුවැන්නාට දෙවැන්න නොමැතිව වැඩ කළ හැකි නමුත් දිගු කලක් නොවේ. මගේ අත්දැකීම් සහ මා භාවිතා කරන මෙවලම් කට්ටලය බෙදා ගැනීමට මට අවශ්ය වන්නේ එබැවිනි fintech, සහ infosec, සහ ඒ සමගම, සහ පුළුල් හෝ සම්පූර්ණයෙන්ම වෙනස් අරමුණක් සඳහා ද භාවිතා කළ හැක. මෙම ලිපියෙන් මම ඔබට කියන්නේ බිට්කොයින් ගැන එතරම් නොවේ, නමුත් මූල්ය (සහ පමණක් නොව) සේවාවන් සංවර්ධනය කිරීම සහ ක්රියාත්මක කිරීම සඳහා යටිතල පහසුකම් ආකෘතිය ගැන - වචනයෙන් කියනවා නම්, “බී” වැදගත් වන සේවාවන්. මෙය Bitcoin හුවමාරුවට සහ කිසිදු ආකාරයකින් Bitcoin සමඟ සම්බන්ධ නොවූ කුඩා සමාගමක වඩාත් සාමාන්ය ආයතනික සත්වෝද්යාන සේවා සඳහා අදාළ වේ.
මම මූලධර්මවල ආධාරකරුවෙකු බව සටහන් කිරීමට කැමැත්තෙමි "එය මෝඩ සරලව තබා ගන්න" и "අඩු වැඩි", එබැවින්, ලිපිය සහ එහි විස්තර කර ඇති දේ යන දෙකටම මෙම මූලධර්මවල ගුණාංග ඇත.
මනඃකල්පිත දර්ශනය: බිට්කොයින් හුවමාරුවක උදාහරණය භාවිතා කර සියල්ල දෙස බලමු. අපි bitcoins සහ ආපසු සඳහා රුබල්, ඩොලර්, යුරෝ හුවමාරුව දියත් කිරීමට තීරණය කළ අතර, අපට දැනටමත් වැඩ කරන විසඳුමක් ඇත, නමුත් qiwi සහ webmoney වැනි අනෙකුත් ඩිජිටල් මුදල් සඳහා, i.e. අපි සියලු නීතිමය ගැටළු වසා දමා ඇත, අපි රූබල්, ඩොලර් සහ යුරෝ සහ අනෙකුත් ගෙවීම් පද්ධති සඳහා ගෙවීම් දොරටුවක් ලෙස සේවය කරන සූදානම් කළ අයදුම්පතක් ඇත. එය අපගේ බැංකු ගිණුම් හා සම්බන්ධ වී ඇති අතර අපගේ අවසාන යෙදුම් සඳහා යම් ආකාරයක API ඇත. සාමාන්ය qiwi හෝ webmoney ගිණුමක් වැනි පරිශීලකයන් සඳහා හුවමාරුකාරකයක් ලෙස ක්රියා කරන වෙබ් යෙදුමක් ද අප සතුව ඇත - ගිණුමක් සාදන්න, කාඩ්පතක් එක් කරන්න, සහ යනාදිය. එය ප්රාදේශීය ප්රදේශයේ REST API හරහා වුවද අපගේ ද්වාර යෙදුම සමඟ සන්නිවේදනය කරයි. ඒ නිසා අපි බිට්කොයින් සම්බන්ධ කිරීමටත් ඒ සමඟම යටිතල පහසුකම් වැඩිදියුණු කිරීමටත් තීරණය කළෙමු, මන්ද ... මුලදී, මේසය යට කාර්යාලයේ අථත්ය පෙට්ටි මත සෑම දෙයක්ම කඩිමුඩියේ තබා ඇත ... වෙබ් අඩවිය භාවිතා කිරීමට පටන් ගත් අතර, අපි අතිකාල සහ කාර්ය සාධනය ගැන කනස්සල්ලට පත් විය.
ඉතින්, අපි ප්රධාන දෙය සමඟ ආරම්භ කරමු - සේවාදායකයක් තෝරා ගැනීම. නිසා අපගේ උදාහරණයේ ව්යාපාරය කුඩා වන අතර අපි තෝරා ගන්නා සත්කාරක (OVH) විශ්වාස කරමු
සේවාදායක ස්ථාපනය
මෙහි සෑම දෙයක්ම සරලයි. අපි අපේ අවශ්යතාවයට ගැලපෙන දෘඩාංග තෝරා ගනිමු. ඉන්පසු FreeBSD රූපය තෝරන්න. හොඳයි, නැතහොත් අපි IPMI හරහා හෝ මොනිටරයක් සමඟ සම්බන්ධ කර (වෙනත් සත්කාරක සහ අපගේ දෘඩාංග සම්බන්ධයෙන්) .iso FreeBSD රූපය බාගත කිරීම සඳහා පෝෂණය කරන්නෙමු. වාද්ය වෘන්දයක් සඳහා මම භාවිතා කරමි
පද්ධතිය ස්ථාපනය කිරීම සම්මත ආකාරයකින් සිදු වේ, මම මේ ගැන වාසය නොකරමි, ක්රියාත්මක වීමට පෙර එය අවධානය යොමු කිරීම වටී බව පමණක් සටහන් කරමි. ඝන එය ඉදිරිපත් කරන විකල්ප bsdinstaller
ස්ථාපනය අවසානයේ (ඔබ විසින්ම පද්ධතිය ස්ථාපනය කරන්නේ නම්):
ඇත
දැනටමත් ස්ථාපනය කර ඇති පද්ධතියක ඉහත සඳහන් පරාමිතීන් සක්රිය කිරීමටද හැකිය. මෙය සිදු කිරීම සඳහා, ඔබ ඇරඹුම් කාරක ගොනුව සංස්කරණය කර කර්නල් පරාමිති සක්රිය කළ යුතුය. *ee යනු BSD හි මෙවැනි සංස්කාරකයකි
# ee /etc/rc.conf
...
#sec hard
clear_tmp_enable="YES"
syslogd_flags="-ss"
sendmail_enable="NONE"
# ee /etc/sysctl.conf
...
#sec hard
security.bsd.see_other_uids=0
security.bsd.see_other_gids=0
security.bsd.unprivileged_read_msgbuf=0
security.bsd.unprivileged_proc_debug=0
kern.randompid=$(jot -r 1 9999)
security.bsd.stack_guard_page=1
ඔබ පද්ධතියේ නවතම අනුවාදය ස්ථාපනය කර ඇති බවටද ඔබ සහතික විය යුතුය, සහ
ඊට පස්සේ අපි configure කරනවා aide
, පද්ධති මානකරන ගොනු වල තත්ත්වය නිරීක්ෂණය කිරීම. ඔබට වඩාත් විස්තරාත්මකව කියවිය හැකිය
pkg install aide
සහ අපගේ crontab සංස්කරණය කරන්න
crontab -e
06 01 * * 0-6 /root/chkaide.sh
#! /bin/sh
#chkaide.sh
MYDATE=`date +%Y-%m-%d`
MYFILENAME="Aide-"$MYDATE.txt
/bin/echo "Aide check !! `date`" > /tmp/$MYFILENAME
/usr/local/bin/aide --check > /tmp/myAide.txt
/bin/cat /tmp/myAide.txt|/usr/bin/grep -v failed >> /tmp/$MYFILENAME
/bin/echo "**************************************" >> /tmp/$MYFILENAME
/usr/bin/tail -20 /tmp/myAide.txt >> /tmp/$MYFILENAME
/bin/echo "****************DONE******************" >> /tmp/$MYFILENAME
අපි ඇතුළත් කරමු
sysrc auditd_enable=YES
# service auditd start
මෙම කාරණය පරිපාලනය කරන්නේ කෙසේද යන්න හොඳින් විස්තර කර ඇත
දැන් අපි නැවත ආරම්භ කර සේවාදායකයේ මෘදුකාංගයට යන්නෙමු. සෑම සේවාදායකයක්ම බහාලුම් හෝ සම්පූර්ණ අථත්ය යන්ත්ර සඳහා අධි වයිසරයකි. එබැවින්, අපි සම්පූර්ණ අථත්යකරණය භාවිතා කිරීමට අදහස් කරන්නේ නම්, ප්රොසෙසරය VT-x සහ EPT සඳහා සහය දැක්වීම වැදගත් වේ.
මම භාවිතා කරන බහාලුම් සහ අතථ්ය යන්ත්ර කළමනාකරණය කිරීමට
බහාලුම්? නැවතත් ඩොකර් හෝ කුමක් ද?
නමුත් නැහැ. cbsd
සෛල ලෙස හඳුන්වන මෙම බහාලුම් සංවිධානය කිරීමට.
කූඩුව යනු විවිධ අරමුණු සඳහා යටිතල පහසුකම් ගොඩනැගීම සඳහා අතිශයින්ම ඵලදායී විසඳුමක් වන අතර, තනි තනි සේවාවන් හෝ ක්රියාවලීන් සම්පූර්ණයෙන් හුදකලා කිරීම අවසානයේ අවශ්ය වේ. අත්යවශ්යයෙන්ම, එය ධාරක පද්ධතියේ ක්ලෝනයකි, නමුත් එය සම්පූර්ණ දෘඪාංග අථත්යකරණය අවශ්ය නොවේ. මෙයට ස්තූතිවන්ත වන්නට, සම්පත් “ආගන්තුක මෙහෙයුම් පද්ධතිය” සඳහා වැය නොකෙරේ, නමුත් සිදු කරන වැඩ සඳහා පමණි. සෛල අභ්යන්තර අවශ්යතා සඳහා භාවිතා කරන විට, මෙය ප්රශස්ත සම්පත් භාවිතය සඳහා ඉතා පහසු විසඳුමකි - එක් දෘඪාංග සේවාදායකයක සෛල පොකුරක් අවශ්ය නම් එක් එක් තනි තනිව සම්පූර්ණ සේවාදායක සම්පත භාවිතා කළ හැකිය. සාමාන්යයෙන් විවිධ උපසේවා සඳහා අතිරේක අවශ්ය බව සලකන විට. විවිධ කාලවලදී සම්පත්, ඔබ නිවැරදිව සැලසුම් කර සේවාදායකයන් අතර සෛල තුලනය කරන්නේ නම්, ඔබට එක් සේවාදායකයකින් උපරිම කාර්ය සාධනය ලබා ගත හැක. අවශ්ය නම්, සෛල භාවිතා කරන සම්පත සඳහා සීමාවන් ද ලබා දිය හැකිය.
සම්පූර්ණ අථත්යකරණය ගැන කුමක් කිව හැකිද?
මා දන්නා තරමින් cbsd
වැඩ සඳහා සහාය වේ bhyve
සහ XEN හයිපර්වයිසර්. මම කවදාවත් දෙවැන්න භාවිතා කර නැත, නමුත් පළමු එක සාපේක්ෂව අලුත් ය bhyve
පහත උදාහරණයේ.
සත්කාරක පරිසරය ස්ථාපනය කිරීම සහ වින්යාස කිරීම
අපි FS භාවිතා කරමු
gpart add -t freebsd-zfs /dev/ada0
/dev/ada0p4 added!
ඉතිරි අවකාශයට තැටි කොටසක් එක් කරන්න
geli init /dev/ada0p4
අපගේ සංකේතාංකන මුරපදය ඇතුළත් කරන්න
geli attach /dev/ada0p4
අපි නැවත මුරපදය ඇතුළත් කරන අතර අපට /dev/ada0p4.eli උපාංගයක් ඇත - මෙය අපගේ සංකේතනය කළ අවකාශයයි. ඉන්පසුව අපි /dev/ada1 සඳහා සහ අරාවේ ඉතිරි තැටි සඳහා එයම නැවත නැවත කරන්නෙමු. ඒ වගේම අපි අලුත් එකක් හදනවා
zpool create vms mirror /dev/ada0p4.eli /dev/ada1p4.eli /dev/ada3p4.eli
- හොඳයි, අපි අවම සටන් කට්ටලය සූදානම්. තුනෙන් එකක් අසමත් වුවහොත් දර්පණ තැටි පෙළක්.
නව "සංචිතයක්" මත දත්ත කට්ටලයක් නිර්මාණය කිරීම
zfs create vms/jails
pkg install cbsd
- අපි කණ්ඩායමක් දියත් කර අපගේ සෛල සඳහා කළමනාකාරීත්වය සකස් කළෙමු.
පසුව cbsd
ස්ථාපනය කර ඇත, එය ආරම්භ කළ යුතුය:
# env workdir="/vms/jails" /usr/local/cbsd/sudoexec/initenv
හොඳයි, අපි බොහෝ විට පෙරනිමි පිළිතුරු සමඟ ප්රශ්න රාශියකට පිළිතුරු දෙන්නෙමු.
*ඔබ සංකේතනය භාවිතා කරන්නේ නම්, එය වැදගත් වන්නේ ඩීමන් ය cbsdd
ඔබ තැටි අතින් හෝ ස්වයංක්රීයව විකේතනය කරන තෙක් ස්වයංක්රීයව ආරම්භ නොවේ (අපගේ උදාහරණයේ මෙය සිදු කරනු ලබන්නේ zabbix විසිනි)
**මමත් NAT පාවිච්චි කරන්නේ නෑ cbsd
, සහ මම එය මා විසින්ම වින්යාස කරමි pf
.
# sysrc pf_enable=YES
# ee /etc/pf.conf
IF_PUBLIC="em0"
IP_PUBLIC="1.23.34.56"
JAIL_IP_POOL="192.168.0.0/24"
#WHITE_CL="{ 127.0.0.1 }"
icmp_types="echoreq"
set limit { states 20000, frags 20000, src-nodes 20000 }
set skip on lo0
scrub in all
#NAT for jails
nat pass on $IF_PUBLIC from $JAIL_IP_POOL to any -> $IP_PUBLIC
## Bitcoin network port forward
IP_JAIL="192.168.0.1"
PORT_JAIL="{8333}"
rdr pass on $IF_PUBLIC proto tcp from any to $IP_PUBLIC port $PORT_JAIL -> $IP_JAIL
# service pf start
# pfctl -f /etc/pf.conf
ෆයර්වෝල් ප්රතිපත්ති සැකසීම ද වෙනම මාතෘකාවකි, එබැවින් මම සියලු ප්රතිපත්තිය අවහිර කිරීමට සහ සුදු ලැයිස්තු සැකසීමට ගැඹුරට නොයමි, ඔබට එය කියවීමෙන් කළ හැකිය
හොඳයි... අපි cbsd ස්ථාපනය කර ඇත, අපගේ පළමු වැඩ අශ්වයා නිර්මාණය කිරීමට කාලයයි - කූඩු කළ Bitcoin යක්ෂයා!
cbsd jconstruct-tui
මෙන්න අපි සෛල නිර්මාණ සංවාදය දකිනවා. සියලුම අගයන් සැකසූ පසු, අපි නිර්මාණය කරමු!
ඔබේ පළමු කොටුව නිර්මාණය කරන විට, ඔබ සෛල සඳහා පදනම ලෙස භාවිතා කළ යුතු දේ තෝරාගත යුතුය. මම විධානය සමඟ FreeBSD ගබඩාවෙන් බෙදාහැරීමක් තෝරා ගන්නෙමි repo
. මෙම තේරීම සිදු කරනු ලබන්නේ නිශ්චිත අනුවාදයක පළමු කොටුව නිර්මාණය කිරීමේදී පමණි (ඔබට සත්කාරක අනුවාදයට වඩා පැරණි ඕනෑම අනුවාදයක සෛල සත්කාරකත්වය ලබා ගත හැක).
සෑම දෙයක්ම ස්ථාපනය කිරීමෙන් පසුව, අපි කූඩුව දියත් කරමු!
# cbsd jstart bitcoind
නමුත් අපි කූඩුව තුළ මෘදුකාංග ස්ථාපනය කළ යුතුයි.
# jls
JID IP Address Hostname Path
1 192.168.0.1 bitcoind.space.com /zroot/jails/jails/bitcoind
jexec bitcoind
සෛල කොන්සෝලයට ඇතුළු වීමට
සහ දැනටමත් සෛලය තුළ අපි මෘදුකාංගය එහි පරායත්තතා සමඟ ස්ථාපනය කරමු (අපගේ සත්කාරක පද්ධතිය පිරිසිදුව පවතී)
bitcoind:/@[15:25] # pkg install bitcoin-daemon bitcoin-utils
bitcoind:/@[15:30] # sysrc bitcoind_enable=YES
bitcoind:/@[15:30] # service bitcoind start
කූඩුවේ Bitcoin ඇත, නමුත් අපට TOP ජාලය හරහා සමහර කූඩුවලට සම්බන්ධ වීමට අවශ්ය නිසා අපට නිර්නාමික භාවය අවශ්ය වේ. සාමාන්යයෙන්, අපි බොහෝ සෛල සැක සහිත මෘදුකාංග සමඟ ප්රොක්සියක් හරහා පමණක් ධාවනය කිරීමට සැලසුම් කරමු. ස්තුති වන්නට pf
ඔබට දේශීය ජාලයේ නිශ්චිත පරාසයක IP ලිපින සඳහා NAT අක්රිය කළ හැකි අතර, අපගේ TOR node සඳහා පමණක් NAT ඉඩ දෙන්න. මේ අනුව, අනිෂ්ට මෘදුකාංග සෛලයට ඇතුළු වුවද, එය බොහෝ විට බාහිර ලෝකය සමඟ සන්නිවේදනය නොකරනු ඇත, එසේ වුවහොත් එය අපගේ සේවාදායකයේ IP හෙළිදරව් නොකරනු ඇත. එබැවින්, අපි ". ලූනු" සේවාවක් ලෙස සහ තනි තනි සෛල වෙත අන්තර්ජාලයට ප්රවේශ වීම සඳහා ප්රොක්සියක් ලෙස සේවා "ඉදිරියට" තවත් කොටුවක් සාදන්නෙමු.
# cbsd jsconstruct-tui
# cbsd jstart tor
# jexec tor
tor:/@[15:38] # pkg install tor
tor:/@[15:38] # sysrc tor_enable=YES
tor:/@[15:38] # ee /usr/local/etc/tor/torrc
ප්රාදේශීය ලිපිනයකින් සවන් දීමට සකසන්න (සියලු කොටු සඳහා තිබේ)
SOCKSPort 192.168.0.2:9050
සම්පූර්ණ සතුට සඳහා අපට තවත් අවශ්ය වන්නේ කුමක්ද? ඔව්, අපට අපගේ වෙබ් සඳහා සේවාවක් අවශ්ය වේ, සමහර විට එකකට වඩා වැඩිය. අපි nginx දියත් කරමු, එය ප්රතිලෝම-ප්රොක්සියක් ලෙස ක්රියා කරන අතර සහතිකය සංකේතනය කරමු
# cbsd jsconstruct-tui
# cbsd jstart nginx-rev
# jexec nginx-rev
nginx-rev:/@[15:47] # pkg install nginx py36-certbot
එබැවින් අපි 150 MB පරායත්තතා කූඩුවක තැබුවෙමු. සහ සත්කාරක තවමත් පිරිසිදුයි.
අපි පසුව nginx පිහිටුවීමට ආපසු යමු, nodejs සහ rust මත අපගේ ගෙවීම් ද්වාරය සඳහා තවත් සෛල දෙකක් සහ Apache සහ PHP හි ඇති වෙබ් යෙදුමක් සඳහා අපට අවශ්ය වේ, දෙවැන්නට MySQL දත්ත ගබඩාවක් ද අවශ්ය වේ.
# cbsd jsconstruct-tui
# cbsd jstart paygw
# jexec paygw
paygw:/@[15:55] # pkg install git node npm
paygw:/@[15:55] # curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
සහ තවත් 380 MB පැකේජ හුදකලා කර ඇත
ඊළඟට, අපි අපගේ යෙදුම git සමඟ බාගත කර එය දියත් කරමු.
# cbsd jsconstruct-tui
# cbsd jstart webapp
# jexec webapp
webapp:/@[16:02] # pkg install mariadb104-server apache24 php74 mod_php74 php74-pdo_mysql
450 MB පැකේජ. කූඩුවක.
මෙන්න අපි සංවර්ධකයාට SSH හරහා කෙලින්ම සෛලයට ප්රවේශය ලබා දෙන්නෙමු, ඔවුන් එහි සෑම දෙයක්ම කරනු ඇත:
webapp:/@[16:02] # ee /etc/ssh/sshd_config
Port 2267
- සෛලයේ SSH වරාය ඕනෑම අත්තනෝමතික එකකට වෙනස් කරන්න
webapp:/@[16:02] # sysrc sshd_enable=YES
webapp:/@[16:02] # service sshd start
හොඳයි, සේවාව ක්රියාත්මක වේ, ඉතිරිව ඇත්තේ රීතිය එකතු කිරීම පමණි pf
ගිනි පවුර
අපගේ සෛලවල ඇති IP මොනවාද සහ අපගේ "දේශීය ප්රදේශය" සාමාන්යයෙන් පෙනෙන්නේ කෙසේද යන්න බලමු.
# jls
JID IP Address Hostname Path
1 192.168.0.1 bitcoind.space.com /zroot/jails/jails/bitcoind
2 192.168.0.2 tor.space.com /zroot/jails/jails/tor
3 192.168.0.3 nginx-rev.space.com /zroot/jails/jails/nginx-rev
4 192.168.0.4 paygw.space.com /zroot/jails/jails/paygw
5 192.168.0.5 webapp.my.domain /zroot/jails/jails/webapp
සහ රීතියක් එකතු කරන්න
# ee /etc/pf.conf
## SSH for web-Devs
IP_JAIL="192.168.0.5"
PORT_JAIL="{ 2267 }"
rdr pass on $IF_PUBLIC proto tcp from any to $IP_PUBLIC port $PORT_JAIL -> $IP_JAIL
හොඳයි, අපි මෙහි සිටින නිසා, ප්රතිලෝම-ප්රොක්සි සඳහා රීතියක් ද එකතු කරමු:
## web-ports for nginx-rev
IP_JAIL="192.168.0.3"
PORT_JAIL="{ 80, 443 }"
rdr pass on $IF_PUBLIC proto tcp from any to $IP_PUBLIC port $PORT_JAIL -> $IP_JAIL
# pfctl -f /etc/pf.conf
හොඳයි, දැන් bitcoins ගැන ටිකක්
අප සතුව ඇත්තේ බාහිරව නිරාවරණය වන වෙබ් යෙදුමක් වන අතර එය අපගේ ගෙවීම් ද්වාරය සමඟ දේශීයව කථා කරයි. දැන් අපි Bitcoin ජාලය සමඟ අන්තර් ක්රියා කිරීම සඳහා වැඩ කරන පරිසරයක් සකස් කළ යුතුයි - නෝඩය bitcoind
එය බ්ලොක්චේන් හි දේශීය පිටපත යාවත්කාලීනව තබා ගන්නා ඩීමන් එකක් පමණි. මෙම ඩීමන් සතුව RPC සහ පසුම්බි ක්රියාකාරිත්වය ඇත, නමුත් යෙදුම් සංවර්ධනය සඳහා වඩාත් පහසු “ඇතුම්” ඇත. ආරම්භ කිරීමට, අපි තැබීමට තීරණය කළා electrum
CLI පසුම්බියකි.
ලැප්ටොප්. දැනට අපි පොදු සේවාදායකයන් සමඟ ඉලෙක්ට්රම් භාවිතා කරන්නෙමු, පසුව අපි එය වෙනත් කොටුවක ඔසවන්නෙමු
# cbsd jsconstruct-tui
# cbsd jstart electrum
# jexec electrum
electrum:/@[8:45] # pkg install py36-electrum
අපේ කූඩුවේ තවත් 700 MB මෘදුකාංගයක්
electrum:/@[8:53] # adduser
Username: wallet
Full name:
Uid (Leave empty for default):
Login group [wallet]:
Login group is wallet. Invite wallet into other groups? []:
Login class [default]:
Shell (sh csh tcsh nologin) [sh]: tcsh
Home directory [/home/wallet]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]: no
Lock out the account after creation? [no]:
Username : wallet
Password : <disabled>
Full Name :
Uid : 1001
Class :
Groups : wallet
Home : /home/wallet
Home Mode :
Shell : /bin/tcsh
Locked : no
OK? (yes/no): yes
adduser: INFO: Successfully added (wallet) to the user database.
Add another user? (yes/no): no
Goodbye!
electrum:/@[8:53] # su wallet
electrum:/@[8:53] # su wallet
wallet@electrum:/ % electrum-3.6 create
{
"msg": "Please keep your seed in a safe place; if you lose it, you will not be able to restore your wallet.",
"path": "/usr/home/wallet/.electrum/wallets/default_wallet",
"seed": "jealous win pig material ribbon young punch visual okay cactus random bird"
}
දැන් අපි මුදල් පසුම්බිය නිර්මාණය කර ඇත.
wallet@electrum:/ % electrum-3.6 listaddresses
[
"18WEhbjvMLGRMfwudzUrUd25U5C7uZYkzE",
"14XHSejhxsZNDRtk4eFbqAX3L8rftzwQQU",
"1KQXaN8RXiCN1ne9iYngUWAr6KJ6d4pPas",
...
"1KeVcAwEYhk29qEyAfPwcBgF5mMMoy4qjw",
"18VaUuSeBr6T2GwpSHYF3XyNgLyLCt1SWk"
]
wallet@electrum:/ % electrum-3.6 help
අපේ දාමය මින් ඉදිරියට මුදල් පසුම්බියට සම්බන්ධ විය හැක්කේ සීමිත පිරිසකට පමණි. පිටතින් මෙම කොටුවට ප්රවේශය විවෘත නොකිරීමට, SSH හරහා සම්බන්ධතා TOP (VPN හි විමධ්යගත අනුවාදයක්) හරහා සිදුවේ. අපි සෛලය තුළ SSH දියත් කරන්නෙමු, නමුත් ධාරකයෙහි අපගේ pf.conf ස්පර්ශ නොකරන්න.
electrum:/@[9:00] # sysrc sshd_enable=YES
electrum:/@[9:00] # service sshd start
දැන් අපි පසුම්බියේ අන්තර්ජාල ප්රවේශය සමඟ සෛලය අක්රිය කරමු. අපි ඒකට NATed නැති වෙනත් subnet Space එකකින් IP address එකක් දෙමු. මුලින්ම අපි වෙනස් වෙමු /etc/pf.conf
සත්කාරක මත
# ee /etc/pf.conf
JAIL_IP_POOL="192.168.0.0/24"
අපි එය වෙනස් කරමු JAIL_IP_POOL="192.168.0.0/25"
, මේ අනුව සියලුම ලිපින 192.168.0.126-255 සඳහා අන්තර්ජාලයට සෘජු ප්රවේශයක් නොමැත. මෘදුකාංග "වායු පරතරය" ජාලයක්. තවද NAT රීතිය එලෙසම පවතී
nat pass on $IF_PUBLIC from $JAIL_IP_POOL to any -> $IP_PUBLIC
නීති අධික ලෙස පැටවීම
# pfctl -f /etc/pf.conf
දැන් අපි අපේ කොටුව ගනිමු
# cbsd jconfig jname=electrum
jset mode=quiet jname=electrum ip4_addr="192.168.0.200"
Remove old IP: /sbin/ifconfig em0 inet 192.168.0.6 -alias
Setup new IP: /sbin/ifconfig em0 inet 192.168.0.200 alias
ip4_addr: 192.168.0.200
හ්ම්, නමුත් දැන් පද්ධතියම අපට වැඩ කිරීම නවත්වනු ඇත. කෙසේ වෙතත්, අපට පද්ධති ප්රොක්සියක් නියම කළ හැක. නමුත් එක් දෙයක් තිබේ, TOR හි එය SOCKS5 ප්රොක්සියක් වන අතර පහසුව සඳහා අපි HTTP ප්රොක්සියකටද කැමති වෙමු.
# cbsd jsconstruct-tui
# cbsd jstart polipo
# jexec polipo
polipo:/@[9:28] # pkg install polipo
polipo:/@[9:28] # ee /usr/local/etc/polipo/config
socksParentProxy = "192.168.0.2:9050"
socksProxyType = socks5
polipo:/@[9:42] # sysrc polipo_enable=YES
polipo:/@[9:43] # service polipo start
හොඳයි, දැන් අපගේ පද්ධතියේ ප්රොක්සි සේවාදායකයන් දෙකක් ඇති අතර, දෙකම TOR හරහා ප්රතිදානය කරයි: socks5://192.168.0.2:9050 සහ
දැන් අපට අපගේ පසුම්බි පරිසරය වින්යාසගත කළ හැකිය
# jexec electrum
electrum:/@[9:45] # su wallet
wallet@electrum:/ % ee ~/.cshrc
#in the end of file proxy config
setenv http_proxy http://192.168.0.6:8123
setenv https_proxy http://192.168.0.6:8123
හොඳයි, දැන් ෂෙල් එක ප්රොක්සි යටතේ සිට ක්රියා කරයි. අපට පැකේජ ස්ථාපනය කිරීමට අවශ්ය නම්, අපි එයට එකතු කළ යුතුය /usr/local/etc/pkg.conf
කූඩුවේ මුල යටින්
pkg_env: {
http_proxy: "http://my_proxy_ip:8123",
}
හොඳයි, දැන් TOR සැඟවුණු සේවාව අපගේ SSH සේවාවේ ලිපිනය ලෙස මුදල් පසුම්බි කූඩුවට එක් කිරීමට කාලයයි.
# jexec tor
tor:/@[9:59] # ee /usr/local/etc/tor/torrc
HiddenServiceDir /var/db/tor/electrum/
HiddenServicePort 22 192.168.0.200:22
tor:/@[10:01] # mkdir /var/db/tor/electrum
tor:/@[10:01] # chown -R _tor:_tor /var/db/tor/electrum
tor:/@[10:01] # chmod 700 /var/db/tor/electrum
tor:/@[10:03] # service tor restart
tor:/@[10:04] # cat /var/db/tor/electrum/hostname
mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion
මෙය අපගේ සම්බන්ධතා ලිපිනයයි. දේශීය යන්ත්රයෙන් පරීක්ෂා කරමු. නමුත් පළමුව අපි අපගේ SSH යතුර එක් කළ යුතුය:
wallet@electrum:/ % mkdir ~/.ssh
wallet@electrum:/ % ee ~/.ssh/authorized_keys
ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAG9Fk2Lqi4GQ8EXZrsH3EgSrVIQPQaAlS38MmJLBabihv9KHIDGXH7r018hxqLNNGbaJWO/wrWk7sG4T0yLHAbdQAFsMYof9kjoyuG56z0XZ8qaD/X/AjrhLMsIoBbUNj0AzxjKNlPJL4NbHsFwbmxGulKS0PdAD5oLcTQi/VnNdU7iFw== user@local
හොඳයි, Linux සේවාදායක යන්ත්රයකින්
user@local ~$ nano ~/.ssh/config
#remote electrum wallet
Host remotebtc
User wallet
Port 22
Hostname mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion
ProxyCommand /bin/ncat --proxy localhost:9050 --proxy-type socks5 %h %p
සම්බන්ධ කරන්න (මෙය වැඩ කිරීමට, ඔබට 9050 මත සවන් දෙන දේශීය TOR ඩීමන් අවශ්ය වේ)
user@local ~$ ssh remotebtc
The authenticity of host 'mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion (<no hostip for proxy command>)' can't be established.
ECDSA key fingerprint is SHA256:iW8FKjhVF4yyOZB1z4sBkzyvCM+evQ9cCL/EuWm0Du4.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion' (ECDSA) to the list of known hosts.
FreeBSD 12.1-RELEASE-p1 GENERIC
To save disk space in your home directory, compress files you rarely
use with "gzip filename".
-- Dru <[email protected]>
wallet@electrum:~ % logout
සාර්ථකත්වය!
ක්ෂණික සහ ක්ෂුද්ර ගෙවීම් සමඟ වැඩ කිරීමට, අපට නෝඩයක් ද අවශ්ය වේ c-lightning
ක්රියාකාරීත්වය සඳහා අවශ්ය වේ bitcoind
නමුත් ඔව්.
*විවිධ භාෂාවලින් අකුණු ජාල ප්රොටෝකෝලය විවිධ ක්රියාත්මක කිරීම් තිබේ. අප විසින් පරීක්ෂා කරන ලද ඒවායින්, c-අකුණු (C වලින් ලියා ඇත) වඩාත්ම ස්ථායී සහ සම්පත්-කාර්යක්ෂම බව පෙනේ.
# cbsd jsconstruct-tui
# cbsd jstart cln
# jexec cln
lightning:/@[10:23] # adduser
Username: lightning
...
lightning:/@[10:24] # pkg install git
lightning:/@[10:23] # su lightning
cd ~ && git clone https://github.com/ElementsProject/lightning
lightning@lightning:~ % exit
lightning:/@[10:30] # cd /home/lightning/lightning/
lightning:/home/lightning/lightning@[10:31] # pkg install autoconf automake gettext git gmp gmake libtool python python3 sqlite3 libsodium py36-mako bash bitcoin-utils
lightning:/home/lightning/lightning@[10:34] # ./configure && gmake && gmake install
අවශ්ය සියල්ල සම්පාදනය කර ස්ථාපනය කර ඇති අතර, අපි RPC පරිශීලකයෙකු නිර්මාණය කරමු lightningd
в bitcoind
# jexec bitcoind
bitcoind:/@[10:36] # ee /usr/local/etc/bitcoin.conf
rpcbind=192.168.0.1
rpcuser=test
rpcpassword=test
#allow only c-lightning
rpcallowip=192.168.0.7/32
bitcoind:/@[10:39] # service bitcoind restart
ඔබ උපයෝගීතාව සටහන් කළහොත් සෛල අතර මගේ අවුල් සහගත මාරුවීම එතරම් අවුල් සහගත නොවේ tmux
, එය ඔබට එක් සැසියක් තුළ බහු පර්යන්ත උප සැසි නිර්මාණය කිරීමට ඉඩ සලසයි. ප්රතිසම: screen
එබැවින්, අපගේ නෝඩයේ සැබෑ IP හෙළි කිරීමට අපට අවශ්ය නැති අතර, TOP හරහා සියලුම මූල්ය ගනුදෙනු සිදු කිරීමට අපට අවශ්යය. එබැවින් තවත් .ළූණු අවශ්ය නොවේ.
# jexec tor
tor:/@[9:59] # ee /usr/local/etc/tor/torrc
HiddenServiceDir /var/db/tor/cln/
HiddenServicePort 9735 192.168.0.7:9735
tor:/@[10:01] # mkdir /var/db/tor/cln
tor:/@[10:01] # chown -R _tor:_tor /var/db/tor/cln
tor:/@[10:01] # chmod 700 /var/db/tor/cln
tor:/@[10:03] # service tor restart
tor:/@[10:04] # cat /var/db/tor/cln/hostname
en5wbkavnytti334jc5uzaudkansypfs6aguv6kech4hbzpcz2ove3yd.onion
දැන් අපි c-lightning සඳහා config එකක් සාදා ගනිමු
lightning:/home/lightning/lightning@[10:31] # su lightning
lightning@lightning:~ % mkdir .lightning
lightning@lightning:~ % ee .lightning/config
alias=My-LN-Node
bind-addr=192.168.0.7:9735
rgb=ff0000
announce-addr=en5wbkavnytti334jc5uzaudkansypfs6aguv6kech4hbzpcz2ove3yd.onion:9735
network=bitcoin
log-level=info
fee-base=0
fee-per-satoshi=1
proxy=192.168.0.2:9050
log-file=/home/lightning/.lightning/c-lightning.log
min-capacity-sat=200000
# sparko plugin
# https://github.com/fiatjaf/lightningd-gjson-rpc/tree/master/cmd/sparko
sparko-host=192.168.0.7
sparko-port=9737
sparko-tls-path=sparko-tls
#sparko-login=mywalletusername:mywalletpassword
#sparko-keys=masterkey;secretread:+listchannels,+listnodes;secretwrite:+invoice,+listinvoices,+delinvoice,+decodepay,+waitpay,+waitinvoice
sparko-keys=masterkey;secretread:+listchannels,+listnodes;ultrawrite:+invoice,+listinvoices,+delinvoice,+decodepay,+waitpay,+waitinvoice
# for the example above the initialization logs (mixed with lightningd logs) should print something like
lightning@lightning:~ % mkdir .lightning/plugins
lightning@lightning:~ % cd .lightning/plugins/
lightning@lightning:~/.lightning/plugins:% fetch https://github.com/fiatjaf/sparko/releases/download/v0.2.1/sparko_full_freebsd_amd64
lightning@lightning:~/.lightning/plugins % mkdir ~/.lightning/sparko-tls
lightning@lightning:~/.lightning/sparko-tls % cd ~/.lightning/sparko-tls
lightning@lightning:~/.lightning/sparko-tls % openssl genrsa -out key.pem 2048
lightning@lightning:~/.lightning/sparko-tls % openssl req -new -x509 -sha256 -key key.pem -out cert.pem -days 3650
lightning@lightning:~/.lightning/plugins % chmod +x sparko_full_freebsd_amd64
lightning@lightning:~/.lightning/plugins % mv sparko_full_freebsd_amd64 sparko
lightning@lightning:~/.lightning/plugins % cd ~
ඔබට සන්නිවේදනය කරන උපයෝගිතා වන bitcoin-cli සඳහා වින්යාස ගොනුවක් සෑදිය යුතුය. bitcoind
lightning@lightning:~ % mkdir .bitcoin
lightning@lightning:~ % ee .bitcoin/bitcoin.conf
rpcconnect=192.168.0.1
rpcuser=test
rpcpassword=test
චෙක් පත
lightning@lightning:~ % bitcoin-cli echo "test"
[
"test"
]
දියත් කිරීම lightningd
lightning@lightning:~ % lightningd --daemon
උන් වහන්සේට lightningd
ඔබට උපයෝගීතාව පාලනය කළ හැකිය lightning-cli
උදාහරණයක් ලෙස:
lightning-cli newaddr
නව එන ගෙවීමක් සඳහා ලිපිනය ලබා ගන්න
{
"address": "bc1q2n2ffq3lplhme8jufcxahfrnfhruwjgx3c78pv",
"bech32": "bc1q2n2ffq3lplhme8jufcxahfrnfhruwjgx3c78pv"
}
lightning-cli withdraw bc1jufcxahfrnfhruwjgx3cq2n2ffq3lplhme878pv all
මුදල් පසුම්බියේ ඇති සියලුම මුදල් ලිපිනයට යවන්න (සියලු දාම ලිපින)
Off-chain මෙහෙයුම් සඳහා ද විධාන lightning-cli invoice
, lightning-cli listinvoices
, lightning-cli pay
ආදිය.
හොඳයි, යෙදුම සමඟ සන්නිවේදනය සඳහා අපට REST Api ඇත
curl -k https://192.168.0.7:9737/rpc -d '{"method": "pay", "params": ["lnbc..."]}' -H 'X-Access masterkey'
ප්රතිඵල සාරාංශ කරමු
# jls
JID IP Address Hostname Path
1 192.168.0.1 bitcoind.space.com /zroot/jails/jails/bitcoind
2 192.168.0.2 tor.space.com /zroot/jails/jails/tor
3 192.168.0.3 nginx-rev.space.com /zroot/jails/jails/nginx-rev
4 192.168.0.4 paygw.space.com /zroot/jails/jails/paygw
5 192.168.0.5 webapp.my.domain /zroot/jails/jails/webapp
7 192.168.0.200 electrum.space.com /zroot/jails/jails/electrum
8 192.168.0.6 polipo.space.com /zroot/jails/jails/polipo
9 192.168.0.7 lightning.space.com /zroot/jails/jails/cln
අප සතුව බහාලුම් කට්ටලයක් ඇත, ඒ සෑම එකක්ම ප්රාදේශීය ජාලයෙන් සහ ඊටම ආවේණික ප්රවේශ මට්ටමක් ඇත.
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
zroot 279G 1.48T 88K /zroot
zroot/ROOT 1.89G 1.48T 88K none
zroot/ROOT/default 1.89G 17.6G 1.89G /
zroot/home 88K 1.48T 88K /home
zroot/jails 277G 1.48T 404M /zroot/jails
zroot/jails/bitcoind 190G 1.48T 190G /zroot/jails/jails-data/bitcoind-data
zroot/jails/cln 653M 1.48T 653M /zroot/jails/jails-data/cln-data
zroot/jails/electrum 703M 1.48T 703M /zroot/jails/jails-data/electrum-data
zroot/jails/nginx-rev 190M 1.48T 190M /zroot/jails/jails-data/nginx-rev-data
zroot/jails/paygw 82.4G 1.48T 82.4G /zroot/jails/jails-data/paygw-data
zroot/jails/polipo 57.6M 1.48T 57.6M /zroot/jails/jails-data/polipo-data
zroot/jails/tor 81.5M 1.48T 81.5M /zroot/jails/jails-data/tor-data
zroot/jails/webapp 360M 1.48T 360M /zroot/jails/jails-data/webapp-data
ඔබට පෙනෙන පරිදි, bitcoind සියළුම 190 GB ඉඩ ලබා ගනී. පරීක්ෂා කිරීම සඳහා අපට තවත් නෝඩයක් අවශ්ය නම් කුමක් කළ යුතුද? ZFS ප්රයෝජනවත් වන්නේ මෙහිදීය. උදව් ඇතිව cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com
ඔබට ස්නැප්ෂොට් එකක් සාදා මෙම ස්නැප්ෂොට් එකට නව සෛලයක් ඇමිණිය හැක. නව සෛලයට තමන්ගේම ඉඩක් ඇත, නමුත් ගොනු පද්ධතියේ වත්මන් තත්වය සහ මුල් පිටපත අතර වෙනස පමණක් සැලකිල්ලට ගනු ලැබේ (අපි අවම වශයෙන් 190 GB වත් ඉතිරි කරමු)
සෑම සෛලයක්ම එහි වෙනම ZFS දත්ත කට්ටලයක් වන අතර මෙය අතිශයින්ම පහසු වේ.
අප සතුව ඇති මෙම අරමුණු සඳහා ධාරකයේ දුරස්ථ අධීක්ෂණයේ අවශ්යතාවය ද සඳහන් කිරීම වටී
B - ආරක්ෂාව
ආරක්ෂාව සම්බන්ධයෙන්, යටිතල පහසුකම් සන්දර්භය තුළ ප්රධාන මූලධර්ම වලින් පටන් ගනිමු:
රහස්යභාවය — UNIX වැනි පද්ධතිවල සම්මත මෙවලම් මෙම මූලධර්මය ක්රියාත්මක කිරීම සහතික කරයි. අපි තාර්කිකව පද්ධතියේ එක් එක් තාර්කිකව වෙනම මූලද්රව්ය සඳහා ප්රවේශය වෙන් කරමු - සෛලයකි. පරිශීලකයන්ගේ පුද්ගලික යතුරු භාවිතයෙන් සම්මත පරිශීලක සත්යාපනය හරහා ප්රවේශය සපයනු ලැබේ. සෛල අතර සහ අවසානය දක්වා සියලු සන්නිවේදනයන් සංකේතාත්මක ආකාරයෙන් සිදු වේ. තැටි සංකේතනයට ස්තූතියි, තැටියක් ප්රතිස්ථාපනය කිරීමේදී හෝ වෙනත් සේවාදායකයකට සංක්රමණය කිරීමේදී දත්තවල ආරක්ෂාව ගැන අපට කරදර විය යුතු නැත. එවැනි ප්රවේශයක් සාමාන්යයෙන් බහාලුම් තුළ ඇති දත්ත වෙත ප්රවේශය සපයන බැවින් එකම තීරණාත්මක ප්රවේශය වන්නේ සත්කාරක පද්ධතියට ප්රවේශ වීමයි.
අඛණ්ඩතාව "මෙම මූලධර්මය ක්රියාත්මක කිරීම විවිධ මට්ටම් කිහිපයකින් සිදු වේ. පළමුවෙන්ම, සේවාදායක දෘඩාංග, ECC මතකය, ZFS දැනටමත් "කොටුවෙන් පිටත" තොරතුරු බිටු මට්ටමේ දත්ත අඛණ්ඩතාව ගැන සැලකිලිමත් වන බව සැලකිල්ලට ගැනීම වැදගත්ය. ක්ෂණික ස්නැප්ෂොට් ඔබට පියාසර කරන ඕනෑම වේලාවක උපස්ථ කිරීමට ඉඩ සලසයි. පහසු සෛල අපනයන/ආනයන මෙවලම් සෛල අනුකරණය සරල කරයි.
ලබාගත හැකිය - මෙය දැනටමත් විකල්ප වේ. ඔබේ කීර්තියේ මට්ටම සහ ඔබට වෛර කරන්නන් සිටින බව මත රඳා පවතී. අපගේ උදාහරණයේදී, මුදල් පසුම්බිය TOP ජාලයෙන් පමණක් ප්රවේශ විය හැකි බව අපි සහතික කළෙමු. අවශ්ය නම්, ඔබට ෆයර්වෝලයේ ඇති සියල්ල අවහිර කර උමං මාර්ග හරහා පමණක් සේවාදායකයට ප්රවේශ වීමට ඉඩ දිය හැකිය (TOR හෝ VPN වෙනත් කාරණයකි). මේ අනුව, සේවාදායකය හැකිතාක් බාහිර ලෝකයෙන් කපා හරිනු ඇති අතර, එහි ඇති බවට බලපෑම් කිරීමට අපට හැකි වනු ඇත.
ප්රතික්ෂේප කිරීමේ නොහැකියාව - තවද මෙය තවදුරටත් ක්රියාත්මක වීම සහ පරිශීලක අයිතිවාසිකම්, ප්රවේශය යනාදිය සඳහා නිවැරදි ප්රතිපත්තිවලට අනුකූල වීම මත රඳා පවතී. නමුත් නිවැරදි ප්රවේශය සමඟ, සියලුම පරිශීලක ක්රියා විගණනය කරනු ලබන අතර, ගුප්ත ලේඛන විසඳුම් වලට ස්තූතිවන්ත වන අතර, ඇතැම් ක්රියාවන් සිදු කළේ කවුරුන්ද සහ කවදාද යන්න පැහැදිලිව හඳුනාගත හැකිය.
ඇත්ත වශයෙන්ම, විස්තර කරන ලද වින්යාසය එය සැමවිටම විය යුතු ආකාරය පිළිබඳ නිරපේක්ෂ උදාහරණයක් නොවේ, එය ඉතා නම්යශීලී පරිමාණය සහ අභිරුචිකරණ හැකියාවන් රඳවා තබා ගනිමින් එය විය හැකි ආකාරය පිළිබඳ එක් උදාහරණයකි.
සම්පූර්ණ අථත්යකරණය ගැන කුමක් කිව හැකිද?
ඔබට හැකි cbsd භාවිතයෙන් සම්පූර්ණ අථත්යකරණය ගැන bhyve
ඔබට කර්නල් විකල්ප කිහිපයක් සක්රීය කිරීමට අවශ්ය වේ.
# cat /etc/rc.conf
...
kld_list="vmm if_tap if_bridge nmdm"
...
# cat /boot/loader.conf
...
vmm_load="YES"
...
එබැවින් ඔබට හදිසියේම ඩොකර් එකක් ආරම්භ කිරීමට අවශ්ය නම්, ඩෙබියන් කිහිපයක් ස්ථාපනය කර ඉදිරියට යන්න!
එච්චරයි
මම හිතන්නේ මට බෙදා ගැනීමට අවශ්ය වූයේ එපමණයි. ඔබ ලිපියට කැමති නම්, ඔබට මට බිට්කොයින් කිහිපයක් එවිය හැකිය -
මූලාශ්රය: www.habr.com