Кроки для забезпечення нашого VPS

Цей підручник показує, як підготувати та захистити віртуальний приватний сервер (VPS) за допомогою Debian GNU / Linux. Перед початком роботи передбачається кілька речей:

  1. Ви володієте середнім рівнем знайомства з GNU / Linux.
  2. Існує VPS для особистого користування, до якого ми маємо доступ через SSH.
  3. VPS має спеціальний зовнішній ipv4 250.250.250.155, а наш постачальник володіє блоком 250.250.0.0/16. (1)
  4. У нашому VPS у нас будуть доступні лише служби http, https та ssh для доступу ззовні.
  5. Зовнішній DNS не буде ввімкнено, оскільки це зазвичай робиться на панелі нашого постачальника. (2)
  6. Це буде працювати як суперкористувач.

Установка

На першому кроці, давайте оновимо сервер та встановимо кілька необхідних нам пакетів:

# aptitude update & aptitude safe-upgrade # aptitude -RvW install dropbear gesftpserver sslh iptables-persistent ulogd fail2ban nginx-light apache2-utils dnsutils telnet ghostscript poppler-utils zip unzip unrar-free p7zip-full multitail tee mc

конфігурація

Зараз ми збираємося створити робочого користувача. Працювати як сервер root на сервері небезпечно, тому спочатку ми створимо спеціального користувача:

adduser operator usermod -aG sudo operator

Перша команда створює оператора-користувача, друга додає його до групи Суду, що дозволить вам запускати програми як root.

Налаштуйте дозволи для супер користувачів

Що стосується регулярної роботи, ми будемо використовувати користувача оператор раніше створений, нам потрібно налаштувати параметри виконання команди як суперкористувача, для чого ми виконуємо таку команду:

видудо

Ця команда в основному дозволяє змінювати файл / etc / sudoers; в якому ми повинні містити ці рядки:

За замовчуванням env_reset, timestamp_timeout = 0% sudo ALL = (ALL: ALL) ALL

У першому рядку опція додається до значень за замовчуванням timestamp_timeout що дозволяє встановити час закінчення дії (у хвилинах) пароля при виконанні команди sudo. За замовчуванням 5, але це іноді небезпечно з двох причин:

  1. Якщо ми ненавмисно залишимо наш комп’ютер увійти в систему до закінчення терміну дії пароля, хтось може виконати команду як суперкористувач без будь-яких обмежень.
  2. Якщо через незнання ми виконаємо програму або сценарій, що містить шкідливий код, до закінчення терміну дії пароля, програма може отримати доступ до нашої системи як суперкористувач без нашої явної згоди.

Тому, щоб уникнути ризиків, ми встановили значення нулем, тобто кожного разу, коли виконується команда sudo, потрібно буде вводити пароль. Якщо від'ємне значення встановлено як -1, ефект полягає в тому, що термін дії пароля ніколи не закінчується, що призведе до протилежного результату того, що ми хочемо.

У другому рядку пояснюється, що група sudo може виконувати будь-яку команду на будь-якому комп'ютері, що є звичним, хоча її можна налаштувати. (3) Є ті, хто для зручності ставить такий рядок, щоб уникнути необхідності вводити пароль:

% sudo ALL = (ALL: ALL) NOPASSWD: ALL

Однак, як ми вже пояснювали раніше, це ризиковано, а тому не рекомендується.

Вимкнути перезапуск

З міркувань безпеки ми також вимкнемо перезапуск за допомогою комбінації клавіш Ctrl + Alt + Del, для якого ми повинні додати цей рядок у файл / etc / inittab:

ca: 12345: ctrlaltdel: / bin / echo "Ctrl + Alt + Del вимкнено."

Замініть OpenSSH на DropBear

Більшість VPS поставляються з встановленим OpenSSH, що, безумовно, дуже корисно, але якщо нам не потрібно використовувати всю функціональність OpenSSH, існують більш легкі альтернативи для VPS, такі як Крапля, що зазвичай достатньо для регулярного вживання. Однак недоліком цієї програми є те, що вона не постачається з інтегрованим сервером SFTP, і саме тому на початку ми встановили пакет gesftpserver.

Щоб налаштувати Dropbear, ми змінимо файл / etc / default / dropbear так що він містить ці два рядки:

NO_START = 0 DROPBEAR_EXTRA_ARGS = "- w -p 127.0.0.1:22 -I 1200 -m"

Перший рядок просто включає послугу, а другий робить кілька речей:

  1. Уникайте кореневого доступу.
  2. Це змушує службу прослуховувати порт 22 локального інтерфейсу (ми пояснимо, чому пізніше).
  3. Встановлює час очікування (20 хвилин).

SSLH

Порт 22 (SSH) добре відомий і, як правило, один із перших, який хакери намагаються зламати, тому замість нього ми використовуватимемо порт 443 (SSL). Трапляється, що цей порт використовується для безпечного перегляду через HTTPS.

З цієї причини ми будемо використовувати пакет sslh, який є нічим іншим, як мультиплексором, який аналізує пакети, що надходять до порту 443, і направляє їх внутрішньо до тієї чи іншої служби залежно від того, тип трафіку SSH або SSL.

SSLH не може слухати на інтерфейсі, де вже слухає інша служба, саме тому раніше ми змусили Dropbear слухати на локальному інтерфейсі.

Тепер нам потрібно вказати sslh інтерфейс і порт, через який він повинен прослуховувати, і куди перенаправляти пакети залежно від типу послуги, і для цього ми змінимо файл конфігурації / etc / default / sslh:

DAEMON = / usr / sbin / sslh DAEMON_OPTS = "- користувач sslh --listen 250.250.250.155:443 --ssh 127.0.0.1:22 --ssl 127.0.0.1:443 --pidfile / var / run / sslh / sslh. pid "RUN = так

Нарешті, ми перезапустимо служби:

service ssh stop && service dropbear start && service sslh restart

Після попередньої команди наш захищений сеанс, ймовірно, буде перерваний, і в цьому випадку достатньо ввійти ще раз, але цього разу з робочим користувачем та за допомогою порту 443. Якщо сеанс не перервано, бажано закрити його та Почніть спочатку з відповідними значеннями.

Якщо все працює правильно, ми можемо продовжувати працювати як root, а якщо хочемо, видаліть OpenSSH:

sudo su - aptitude -r очищення openssh-сервера

Брандмауер

Наступне, що ми зробимо - це відокремити журнали від брандмауера в окремий файл /var/log/firewall.log для полегшення подальшого аналізу, саме тому ми встановили пакет ulogd під час запуску. Для цього ми відредагуємо файл /etc/logd.conf для налаштування відповідного розділу:

[LOGEMU] file = "/ var / log / firewall.log" sync = 1

Далі ми змінимо файл обертання запису / etc / logrotate / ulogd для збереження щоденного обертання (з датою) та збереження стиснених залпів у каталозі / var / log / ulog /:

/var/log/ulog/*.log /var/log/firewall.log {щоденний текстовий текст пропущенийok стиснення затримка стиснення спільних сценаріїв створити 640 кореневих адм установ /etc/init.d/ulogd reload mv /var/log/firewall.log-* .gz / var / log / ulog / endcript}

Потім ми створимо правила netfilter, виконавши наступне:

IPT = $ (які iptables) IPEXT = 250.250.250.155 IPEXTBLK = 250.250.0.0 / 16 IPBCAST = 255.255.255.255 $ IPT -F $ IPT -X $ IPT -Z $ IPT -A INPUT -i lo -j ACCEPT $ IPT - P INPUT DROP $ IPT -P FORWARD DROP $ IPT -P OUTPUT ACCEPT $ IPT -A INPUT -m state - state INVALID -j ULOG --ulog-prefix IN_INVALID $ IPT -A INPUT -p igmp -j ULOG --ulog -префікс IN_IGMP $ IPT -A ВХІД -m pkttype -pkt-тип трансляція -j ULOG --ulog-префікс IN_BCAST $ IPT -A INPUT -m pkttype --pkt-type multicast -j ULOG --ulog-префікс IN_MCAST $ IPT -A FORWARD -j ULOG --ulog-префікс FORWARD $ IPT -N ICMP_IN $ IPT -A INPUT!  -i lo -p icmp -j ICMP_IN $ IPT -A ICMP_IN -p icmp -f -j ULOG --ulog-префікс IN_ICMP_FRAGMENTED $ IPT -A ICMP_IN -p icmp -m icmp -m довжина!  - довжина 28: 1322 -j ULOG --ulog-префікс IN_ICMP_INVALIDSIZE $ IPT -A ICMP_IN -p icmp -m icmp -m hashlimit --hashlimit-над 4 / sec --hashlimit-mode srcip --hashlimit-srcmask 24 - -hashlimit-name icmpflood -j ULOG --ulog-prefix IN_ICMP_FLOOD $ IPT -A ICMP_IN -p icmp -m icmp -m hashlimit --hashlimit-upto 64kb / min --hashlimit-mode srcip --hashlimit-srcmask 24 - hashlimit -name icmpattack -j ULOG --ulog-префікс IN_ICMP_FLOOD $ IPT -A ICMP_IN -p icmp -m icmp -m u32!  --u32 "0x4 & 0x3fff = 0x0" -j ULOG --ulog-префікс IN_ICMP_ATTACK $ IPT -A ICMP_IN -p icmp -m icmp!  - emp-type echo-request -m state --state NEW -j ULOG --ulog-prefix IN_ICMP_INVALID $ IPT -A ICMP_IN -p icmp -m icmp - emp-type -mpmp -j ULOG --ulog- префікс IN_ICMP $ IPT -A ICMP_IN -p icmp -m icmp - тип-emp-запит echo-limit -limit 1 / sec --limit-burst 4 -j ACCEPT $ IPT -A ICMP_IN -p icmp -m icmp --icmp-type echo-reply -m limit --limit 2 / sec --limit-burst 4 -j ACCEPT $ IPT -A ICMP_IN -p icmp -m icmp --icmp-type destination-unreachable -m limit - limit 2 / sec --limit-burst 4 -j ACCEPT $ IPT -A ICMP_IN -p icmp -m icmp --icmp-type over-time over--limit --limit 2 / sec --limit-burst 4 -j ACCEPT $ IPT -A ICMP_IN -p icmp -m icmp - параметр типу -mpmp-проблема -м обмеження --ліміт 2 / сек --ліміт-пакет 4 -j ПРИЙМІТЬ IPT -А ICMP_IN -j ВОЗВРАТИ $ IPT -N UDP_IN $ IPT -А ВХОД!  -i lo -p udp -j UDP_IN $ IPT -A UDP_IN!  -і ось!  -p udp -f -j ULOG --ulog-префікс IN_UDP_FRAGMENTED $ IPT -A UDP_IN -p udp -m udp --sport 53 -m length!  - довжина 28: 576 -j ULOG --ulog-префікс IN_UDP_DNS_INVALIDSIZE $ IPT -A UDP_IN -p udp -m udp --dport 53 -m -state --state NEW -j ULOG --ulog-префікс IN_UDP_DNSREQUEST $ IPT - A UDP_IN -p udp -m udp --dport 53 -m -state --state NEW -j REJECT --reject-with icmp-port-unreachable $ IPT -A UDP_IN -p udp -m udp!  --спорт 53!  -s $ IPEXTBLK!  -d $ IPBCAST -m state --state NEW -j ULOG --ulog-prefix IN_UDP $ IPT -A UDP_IN -p udp -m udp -m state --state СТВОРЕНО, ПОВ'ЯЗАНО -j ACCEPT $ IPT -A UDP_IN -j ПОВЕРНІТЬ $ IPT -N TCP_IN $ IPT -А ВХОД!  -i lo -p tcp -j TCP_IN $ IPT -A TCP_IN!  -і ось!  -p tcp -f -j ULOG --ulog-префікс IN_TCP_FRAGMENTED $ IPT -A TCP_IN -p tcp -m tcp --sport 53 -m state --state ВСТАНОВЛЕНО, ПОВ'ЯЗАНО -m довжина!  - довжина 513: 1500 -j ULOG --ulog-префікс IN_TCP_DNS_INVALIDSIZE $ IPT -A TCP_IN -p tcp -m tcp --dport 53 -m стан - стан NEW -j ULOG --ulog-префікс IN_TCP_DNS $ IPT -A TCP_IN -p tcp -m tcp --dport 53 -m state --state NEW -j REJECT --reject-with icmp-port-unreachable $ IPT -A TCP_IN -p tcp -m tcp -m multiport!  --dports 80,443 -m state --state NEW -j ULOG --ulog-prefix IN_TCP $ IPT -A TCP_IN -p tcp -m tcp -m multiport --dports 80,443 -m state --state NEW -m hashlimit - hashlimit -до 4 / сек --hashlimit-burst 16 --hashlimit-mode srcip --hashlimit-name navreq -j ACCEPT $ IPT -A TCP_IN -p tcp -m tcp -m multiport --dports 80,443 -m state - state ВСТАНОВЛЕНО -m connlimit!  --connlimit-over 16 -j ACCEPT $ IPT -A TCP_IN -p tcp -m tcp -m multiport! 

З попередньою конфігурацією наш VPS повинен бути достатньо захищений, але якщо ми хочемо, ми можемо захистити його трохи більше, для чого ми можемо використати кілька вдосконалених правил.

Не всі VPS дозволяють встановлювати додаткові модулі для netfilter, але дуже корисний PSD, що дозволяє уникнути сканування портів. На жаль, цей модуль не інтегрований в netfilter за замовчуванням, тому необхідно встановити певні пакети, а потім побудувати модуль:

aptitude -RvW встановити iptables-dev xtables-addons-source модуль-помічник модуль-помічник --verbose --text-mode auto-install xtables-addons-source

Як тільки вищезазначене буде зроблено, ми можемо додати таке правило:

iptables -A INPUT -m psd --psd-вага-поріг 15 --psd-затримка-поріг 2000 --psd-lo-порт-вага 3 --psd-hi-ports-вага 1 -j ULOG --ulog- префікс IN_PORTSCAN

Попереднє правило в основному означає, що ми створимо лічильник, який буде збільшуватися на 3 щоразу, коли робиться спроба отримати доступ до порту нижче 1024, і на 1 кожного разу, коли робиться спроба отримати доступ до порту вище 1023, і коли цей лічильник досягає 15 протягом періоду менше 20 секунд, пакунки будуть зареєстровані ulog як спроба сканування портів. Пакети все ще могли бути відкинуті відразу, але в цьому випадку ми маємо намір використовувати fail2ban, який ми налаштуємо пізніше.

Після створення правил ми повинні вжити певних запобіжних заходів, щоб зробити їх стійкими, інакше ми втратимо їх при перезапуску сервера. Є кілька способів досягти цього; У цьому посібнику ми використовуватимемо пакет iptables-persistent, який ми встановили на початку, і в якому зберігаються правила /etc/iptables/rules.v4 y /etc/iptables/rules.v6 для ipv6.

iptables-save> /etc/iptables/rules.v4

Насправді, хоча використання ipv6 на Кубі ще не широко поширене, ми могли б створити деякі основні правила:

IPT = $ (які ip6tables) $ IPT -P ВХІД ПАДАННЯ $ IPT -P ВПЕРЕД ПАДАННЯ $ IPT -P ВИХІД ПРИЙНЯТИ IPT -A ВХОД -i lo -j ПРИЙМІТЬ $ IPT -A ВХОД! -i lo -m state --state ВСТАНОВЛЕНО, ПОВ'ЯЗАНО -j ACCEPT скасовано IPT

Ці правила також можна зробити стійкими:

ip6tables-save> /etc/iptables/rules.v6

Нарешті, для більшої безпеки ми очищаємо реєстр брандмауера та перезапускаємо служби:

echo -n> /var/log/firewall.log послуга logrotate restart service ulogd restart service iptables-persistent restart

Nginx

Ми будемо використовувати Nginx як веб-сервер, оскільки VPS, як правило, мають менший обсяг оперативної пам'яті порівняно з реальним сервером, тому загалом зручно мати щось легше, ніж Apache.

Перед налаштуванням Nginx ми створимо сертифікат (без пароля) для використання через HTTPS:

cd / etc / nginx openssl genrsa -des3 -out cert.key 4096 cp -v cert.key cert.key.original openssl req -new -key cert.key -out cert.csr openssl rsa -in cert.key.original - вийти cert.key openssl x509 -req -days 365 -in cert.csr -signkey cert.key -out cert.crt

Після цього ми створимо файл пароля для користувача "elusuario":

htpasswd -c .htpasswd користувача

Далі ми змінимо файл / etc / nginx / sites-available / default щоб встановити параметри сайту за замовчуванням. Це може виглядати так:

сервер {ім'я_сервера localhost; index index.html index.htm default.html default.htm; root / var / www; location / {# встановити порядок перевірки та сторінку для завантаження, якщо URI не знайдено, try_files $ uri $ uri / /index.html; }} сервер {прослухати 127.0.0.1:443; ім'я_сервера localhost; index index.html index.htm default.html default.htm; root / var / www; ssl увімкнено; ssl_certificate cert.crt; ssl_certificate_key cert.key; ssl_session_timeout 5м; # Увімкнути HTTPS лише через TLS (більш безпечний, ніж SSL) ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # надайте перевагу високоміцним шифрам [HIGH], # перемістіть середньоміцні шифри [MEDIUM] до кінця списку, # вимкніть низькоміцні шифри [LOW] (40 та 56 біт) # відключіть шифри за допомогою алгоритмів експорту [ EXP] # вимкнути нульові шифри [eNULL], без автентифікації [aNULL], SSL (версії 2 та 3) та DSS (дозволяють лише ключі до 1024 біт) ssl_ciphers HIGH: + MEDIUM :! LOW :! EXP:! ANULL :! eNULL :! SSLv3 :! SSLv2 :! DSS; # Віддайте перевагу методам шифрування сервера (за замовчуванням використовуються клієнтські) ssl_prefer_server_ciphers on; location / {# enable enable authentication auth_basic "Login"; auth_basic_user_file /etc/nginx/.htpasswd; # встановити порядок перевірки та код сторінки для завантаження, якщо URI try_files $ uri $ uri / = 404 не знайдено; # дозволити створення індексу для ввімкненого автоіндексу для автентифікованих користувачів; autoindex_exact_size off; autoindex_localtime увімкнено; }}

Перевіряємо правильність конфігурації:

nginx -t

Нарешті, ми перезапустимо службу:

сервіс nginx перезавантаження

Fail2Ban

Перш ніж налаштовувати Fail2Ban, для більшої безпеки ми зупиняємо службу та чистимо реєстр:

fail2ban-client stop echo -n> /var/log/fail2ban.log

Далі ми створюємо файл конфігурації /etc/fail2ban/jail.local із таким користувацьким вмістом:

# Власний файл конфігурації /etc/fail2ban/jail.local # [DEFAULT] findtime = 43200; 12 годин випробувань = 86400; 1 день максретрі = 3; заборона набуде чинності після 4-ї спроби [ssh] enabled = false [nginx-auth] enabled = true filter = nginx-auth action = iptables-multiport [name = NoAuthFailures, port = "http, https"] logpath = / var / log / nginx * / * error * .log [nginx-badbots] увімкнено = true filter = apache-badbots action = iptables-multiport [name = BadBots, port = "http, https"] logpath = / var / log / nginx * /*access*.log bantime = 604800; 1 тиждень maxretry = 0 [nginx-login] увімкнено = true filter = nginx-login action = iptables-multiport [name = NoLoginFailures, port = "http, https"] logpath = / var / log / nginx * / * access *. журнал бантима = 1800; 30 хвилин [nginx-noscript] увімкнено = true action = iptables-multiport [name = NoScript, port = "http, https"] filter = nginx-noscript logpath = /var/log/nginx*/*access*.log maxretry = 0 [nginx-proxy] увімкнено = true action = iptables-multiport [name = NoProxy, port = "http, https"] filter = nginx-proxy logpath = /var/log/nginx*/*access*.log bantime = 604800 ; 1 тиждень maxretry = 0 [брандмауер] увімкнено = true action = iptables-multiport [name = Брандмауер] filter = брандмауер logpath = /var/log/firewall.log maxretry = 0

Після цього ми створюємо в каталозі /etc/fail2ban/filters.d/ наступні файли:

# /etc/fail2ban/filter.d/nginx-auth.conf # Фільтр авторизації # Блокує IP-адреси, які не вдається автентифікувати за допомогою базової автентифікації # [Визначення] failregex = для базової автентифікації не вказано користувача / пароля. * клієнт: user. * не знайдено в. * клієнт: користувач. * невідповідність паролю. * клієнт: ignoreregex =
# /etc/fail2ban/filter.d/nginx-login.conf # Вхідний фільтр # Блокує IP-адреси, які не вдається пройти автентифікацію за допомогою сторінки входу веб-програми # Сканувати журнал доступу для HTTP 200 + POST / session => не вдалося ввійти # [Визначення ] failregex = ^ -. * POST / сеанси HTTP / 1 \ .. "200 ignoreregex =
# /etc/fail2ban/filter.d/nginx-noscript.conf # Noscript filter # Блокувати IP-адреси, які намагаються виконати такі сценарії, як .php, .pl, .exe та інші смішні сценарії. # Збіги, наприклад # 192.168.1.1 - - "GET /something.php # [Визначення] failregex = ^ -. * GET. * (\. Php | \ .asp | \ .exe | \ .pl | \ .cgi | \ scgi) ignoreregex =
# /etc/fail2ban/filter.d/proxy.conf # Проксі-фільтр # Блокувати IP-адреси, які намагаються використовувати сервер як проксі-сервер. # Збіги, наприклад # 192.168.1.1 - - "ОТРИМАТИ http://www.something.com/ # [Визначення] failregex = ^ -. * ОТРИМАТИ http. * Ignoreregex =
# /etc/fail2ban/filter.d/firewall.conf # Фільтр брандмауера # [Визначення] failregex = ^. * IN_ (НЕПРАВИЛЬНИЙ | PORTSCAN | UDP | TCP |). * SRC = . * $ ignoreregex =

Нарешті, ми запускаємо службу і завантажуємо конфігурацію:

fail2ban-service -b fail2ban-client перезавантажити

Перевірка

На останньому етапі ми можемо переглянути записи за допомогою хвіст -f o багатохвильовий - слідувати всім. Насправді, остання програма пропонує ту перевагу, що вона дозволяє переглядати кілька файлів одночасно та забезпечує основне підсвічування синтаксису.

Якщо обліковий запис електронної пошти не налаштований у VPS, доцільно відключити попереджувальне повідомлення, що з’являється під час запуску багатопоточної пошти, для чого ми виконаємо таку команду:

echo "check_mail: 0"> ~ / .multitailrc

Насправді ми могли б створити псевдонім (4) для швидкого перегляду журналів за допомогою короткої команди, наприклад, "flog":

псевдонім flog = 'multitail --follow-all /var/log/firewall.log /var/log/fail2ban.log'

1) Це вигадані цінності.
2) Увімкнути інші сервіси легко, як тільки ви зрозумієте, як це працює.
3) Щоб отримати докладнішу інформацію, запустіть man sudoers.
4) За бажанням може бути доданий до файлу ~ / .bash_aliases


Зміст статті відповідає нашим принципам редакційна етика. Щоб повідомити про помилку, натисніть тут.

6 коментарі, залиште свій

Залиште свій коментар

Ваша електронна адреса не буде опублікований. Обов'язкові для заповнення поля позначені *

*

*

  1. Відповідальний за дані: Мігель Анхель Гатон
  2. Призначення даних: Контроль спаму, управління коментарями.
  3. Легітимація: Ваша згода
  4. Передача даних: Дані не передаватимуться третім особам, за винятком юридичних зобов’язань.
  5. Зберігання даних: База даних, розміщена в мережі Occentus Networks (ЄС)
  6. Права: Ви можете будь-коли обмежити, відновити та видалити свою інформацію.

  1.   MSX - сказав він

    Є кілька цікавих речей, +1

  2.   Юкітеру - сказав він

    @Hugo цей рядок у конфігурації:

    ssl_protocols SSLv3 TLSv1;

    Я б вийняв із нього SSLv3, оскільки цей протокол уже не захищений, навіть у Debian Jessie багато служб налаштовано так, щоб уникнути використання цього протоколу з цієї причини.

    Інформація по темі тут:

    https://www.linode.com/docs/security/security-patches/disabling-sslv3-for-poodle
    http://disablessl3.com/

    1.    Хьюго - сказав він

      Ідея полягала не в тому, щоб запропонувати основні послуги через HTTPS, а в тому, щоб пояснити, як використовувати порт 443 для SSH, не втрачаючи можливості використовувати його для HTTPS, якщо це необхідно, але дякую за попередження.

      У будь-якому випадку я оновив статтю, щоб трохи змінити конфігурацію nginx і, до речі, включити деякі коментарі, щоб трохи більше пояснити ситуацію з цим механізмом шифрування та виправити деякі незначні помилки.

  3.   Даніель П.З. - сказав він

    Щиро дякую за цей чудовий підручник, зараз я застосую його на практиці! : D, Так тримати з Linux, ти мене завжди дивуєш, Привіт з Перу.

  4.   Сандекура - сказав він

    Щиро дякую за обмін.

  5.   Фернандо - сказав він

    дуже хороший путівник, і це походить від перлів зараз, коли я розпочав роботу в цьому блозі, але тим більше зараз, коли я збираюся встановити свій перший vps і все ще з багатьма проблемами, але ця стаття вивела мене з багатьох сумнівів, подяк та привітань