Системное администрирование linux

Создайте запрос сертификата сервера и сгенерируйте закрытый ключ

Теперь мы сгенерируем закрытый ключ и запросим сертификат на сервере OpenVPN. Далее мы передадим файл запроса сертификата на сервер центра сертификации (ЦА). который будет подписан, чтобы создать необходимый сертификат

Находясь в той же папке, мы можем сгенерировать запрос  Следующая команда создает файл закрытого ключа с именем openvpn-server.key и файл запроса сертификата с именем openvpn-server.req.

Вывод в терминале:

Теперь скопируйте файл ключа сервера с именем openvpn-server.key в каталог с именем /etc/openvpn/server.

Затем скопируйте файл запроса сертификата на сервер ЦА (центра сертификации):

На сервере ЦА перейдите в каталог easyrsa,

Чтобы импортировать запрос, выполните следующую команду:

Ответ в терминале:

А теперь подпишите запрос. Поскольку мы подписываем запрос сервера, мы должны использовать директиву  перед общим именем нашего сервера openvpn. Если бы это был запрос клиента, мы должны были бы использовать директиву вместо .

Подписать запрос:

Ответ в терминале:

Теперь запрос сертификата сервера OpenVPN подписан сервером ЦА, нам нужно передать подписанный запрос и открытый сертификат на сервер OpenVPN.

Теперь мы сгенерируем предварительный общий ключ tls-crypt. Это гарантирует что наш OpenVPN-сервер способен справляться с не аутентифицированным трафиком, сканированием портов и некоторыми атаками, которые могут использовать много ресурсов сервера.

Ответ в терминале:

Далее вводим команду

Теперь скопируйте ключ и pem файлы в каталог /etc/openvpn/server:

Установка OpenVPN

Подготовка

Установка OpenVPN на Ubuntu 18.04 начинается с установки пакетов OpenVPN и Easy-rsa из репозитория. Утилита Easy-rsa необходима для управления ключами и сертификатами.

Перед инсталляцией необходимо обновить список пакетов:

sudo apt update

Теперь нужно выполнить установку OpenVPN и Easy–rsa:

sudo apt install openvpn easy-rsa

Также в процессе работы пригодится пакет NetTOOLS, включающий в себя все необходимые сетевые инструменты. Установка выполняется командой:

sudo apt install net-tools

Настройка центра сертификации

Настройка сервера OpenVPN на Ubuntu начинается с установки центра сертификации и создания корневого сертификата:

sudo cp -R /usr/share/easy-rsa /etc/openvpn/
cd /etc/openvpn/easy-rsa 	
export EASYRSA=$(pwd)	
sudo ./easyrsa init-pki	
sudo ./easyrsa build-ca

При выполнении последней команды программа попросит пользователя придумать пароль. Созданный код доступа будет использоваться в последующих действиях для подписи сертификатов и ключей.

В результате создаются файлы:

  • /etc/openvpn/easy-rsa/pki/ca.crt – сертификат CA. Он необходим клиентам и серверу для проверки подписи CA.
  • /etc/openvpn/easy-rsa/pki/private/ca.key – приватный ключ CA.

Для удобства нужно создать каталог, в котором будут храниться все необходимые сертификаты и ключи OpenVPN:

mkdir /etc/openvpn/certs/

Теперь необходимо скопировать корневой сертификат OpenVPN в созданную папку:

cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/certs/ca.crt

Ключи OpenVPN для сервера

Генерация ключей для сервера OpenVPN выполняется следующей командой:

./easyrsa gen-req server nopass

Далее созданный сертификат подписывается ключом CA:

./easyrsa sign-req server server

Появится предупреждение с запросом подтвердить подпись. Нужно написать «yes» и ввести пароль центра сертификации.

Созданные файлы копируются в каталог для сертификатов:

cp /etc/openvpn/easy-rsa/pki/issued/server.crt /etc/openvpn/certs/
cp /etc/openvpn/easy-rsa/pki/private/server.key /etc/openvpn/certs/

Теперь нужно создать файл параметров Diffie–Hellman:

openssl dhparam -out /etc/openvpn/certs/dh2048.pem 2048

Последним создаётся ключ HMAC (hash-based message authentication code):

openvpn --genkey --secret /etc/openvpn/certs/ta.key

Теперь в папке, созданной для хранения сертификатов, должно быть 5 файлов. Проверить их наличие можно командой:

ls -l /etc/openvpn/certs/

Создание ключей клиентов OpenVPN

Сгенерировать ключи и выполнить их подпись можно следующей командой:

./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1

На вопрос о намерении подписать нужно ответить «yes» и ввести пароль CA.

Генерация клиентских конфигураций

Теперь вы можете легко генерировать клиентские конфигурационные файлы.

Если вы выполняли действия из статьи «OpenVPN на Ubuntu 16.04: установка», то у вас уже есть клиентский сертификат и ключ client1.и client1.key. Созданный выше скрипт можно использовать для того, чтобы создать конфигурацию для этих файлов (но перед этим нужно перейти в соответствующую директорию):

$ cd ~/client-configs
$ ./make_config.sh client1

Если все было выполнено правильно, у вас должен появиться файл client1.ovpn в директории ~/client-configs/files. Проверьте:

$ ls ~/client-configs/files

Вывод на экране:

client1.ovpn

Передача конфигурации клиентским машинам
После создания клиентского конфигурационного файла необходимо его передать на соответствующее устройство (к примеру, компьютер или смартфон).

То, как вы будете передавать файл, напрямую зависит от того, какую операционную систему использует ваш компьютер, и вашего личного желания. Однако лучше все-таки использовать SFTP (протокол для безопасного копирования файлов) либо SCP на бэкенде. Таким образом файлы будут переданы по защищенному соединению.

Например, если вы хотите использовать SFTP для передачи client1.ovpn с компьютера на Linux или Mac OS, то используйте такую команду:

$ sftp sammy@openvpn_server_ip:client-configs/files/client1.ovpn ~/

Файл будет перемещен в домашнюю директорию.

Встраивание сертификатов в файл .ovpn

Содержимое сертификатов и ключей можно указать в конфигурационном файле .ovpn. Это позволяет использовать только один документ для переноса всех аутентификационных данных, что существенно ускоряет процесс подготовки клиентской части.

Данные сертификатов заносятся в парные теги, которые имеют такое же наименование, как и стандартные опции (ca, cert, dh, tls–auth, key и т. д.). Далее это будет показано на примере ранее созданного конфигурационного файла client.conf.

Для начала нужно удалить из файла прописанные сертификаты и ключи:

ca "C:\\Program Files\\OpenVPN\\certs\\ca.crt"
cert "C:\\Program Files\\OpenVPN\\certs\\client1.crt"
key "C:\\Program Files\\OpenVPN\\certs\\client1.key"
tls–auth "C:\\Program Files\\OpenVPN\\certs\\ta.key" 1

Так как «tls–auth» – дополнительная опция, то её необходимо добавить отдельной строкой, введя:

key-direction 1

Далее нужно создать парные теги, как ниже, и перенести данные о ключах:

<ca>
 
</ca>
<cert>

</cert>
<key>
 
</key>
<tls-auth>
 
</tls-auth>

Вместо многоточия указывается содержание публичного или приватного ключа между заголовками «BEGIN» и «END».

После сохранения настроек файл можно передать клиентам OpenVPN.

Configuration

The configuration is done with help of the uci-configuration file: , but you can use this together with the file .

Depending on the setting in the uci-file, you may also use the files and additionally.

/etc/config/dhcp

→ /etc/config/dhcp is a UCI configuration file and as such documented exclusively in uci. Almost all settings can be configured with it!

/etc/dnsmasq.conf

You can use in addition, see above.

Example:
By default, dnsmasq comes configured to put your hosts into the domain. This is specified in the configuration file as:

# allow /etc/hosts and dhcp lookups via *.lan
local=/lan/
domain=lan

You can change this to whatever you’d like your home domain to be. Also, if you want your hosts to be available via your home domain without having to specify the domain in your

/etc/hosts

file, add the directive to your -file.

As an example, without , you can only reach router, ubuntu-desktop and ubuntu-laptop.
With expand-hosts on, you can reach router, router.lan, ubuntu-desktop, ubuntu-desktop.lan, etc.
This probably matches what you’re looking for anyway.

Without this setting, you’ll have to add .lan entries to your .

/etc/hosts

In DNS entries are configured. dnsmasq will utilize these entries to answer DNS queries on your network.

Format:

 host_name host_name_short ...

Example:

192.168.1.1 router OpenWrt localhost
192.168.1.2 debian-server
192.168.1.3 ubuntu-laptop

DNS and DHCP Ports

DNS needs TCP and UDP port 53 open on the firewall. DHCP needs UDP ports 67 and 68 open from your zone to/from the firewall. See http://wiki.openwrt.org/doc/recipes/guest-wlan and http://www.thekelleys.org.uk/dnsmasq/docs/dnsmasq-man.html (viz “–dhcp-alternate-port”) for more information.

Запуск OpenVPN

Наконец все готово для того, чтобы запустить OpenVPN на вашем сервере. Для этого нужно использовать команду systemd.

Для запуска сервера OpenVPN нужно обязательно указать название конфигурационного файла в качестве образца переменной после названия файла systemd. Конфигурационный файл в данном случае имеет название /etc/openvpn/server.conf, а значит, в конце юнит-файла надо написать @server.

Команда будет выглядеть так:

$ sudo systemctl start openvpn@server

Проверьте, что все запустилось корректно:

$ sudo systemctl status openvpn@server

Если все нормально, то вы увидите на экране вывод, который будет выглядеть примерно так:

Output
● openvpn@server.service - OpenVPN connection to server
 Loaded: loaded (/lib/systemd/system/openvpn@.service; disabled; vendor preset: enabled)
 Active: active (running) since Tue 2016-05-03 15:30:05 EDT; 47s ago
 Docs: man:openvpn(8)
 https://community.openvpn.net/openvpn/wiki/Openvpn23ManPage
 https://community.openvpn.net/openvpn/wiki/HOWTO
 Process: 5852 ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --status /run/openvpn/%i.status 10 --cd /etc/openvpn --script-security 2 --config /etc/openvpn/%i.conf --writepid /run/openvpn/%i.pid (code=exited, sta
Main PID: 5856 (openvpn)
 Tasks: 1 (limit: 512)
 CGroup: /system.slice/system-openvpn.slice/openvpn@server.service
 └─5856 /usr/sbin/openvpn --daemon ovpn-server --status /run/openvpn/server.status 10 --cd /etc/openvpn --script-security 2 --config /etc/openvpn/server.conf --writepid /run/openvpn/server.pid

May 03 15:30:05 openvpn2 ovpn-server: /sbin/ip addr add dev tun0 local 10.8.0.1 peer 10.8.0.2
May 03 15:30:05 openvpn2 ovpn-server: /sbin/ip route add 10.8.0.0/24 via 10.8.0.2
May 03 15:30:05 openvpn2 ovpn-server: GID set to nogroup
May 03 15:30:05 openvpn2 ovpn-server: UID set to nobody
May 03 15:30:05 openvpn2 ovpn-server: UDPv4 link local (bound): 
May 03 15:30:05 openvpn2 ovpn-server: UDPv4 link remote: 
May 03 15:30:05 openvpn2 ovpn-server: MULTI: multi_init called, r=256 v=256
May 03 15:30:05 openvpn2 ovpn-server: IFCONFIG POOL: base=10.8.0.4 size=62, ipv6=0
May 03 15:30:05 openvpn2 ovpn-server: IFCONFIG POOL LIST
May 03 15:30:05 openvpn2 ovpn-server: Initialization Sequence Completed

Проверьте также и доступность OpenVPN интерфейса tun0:

$ ip addr show tun0

В выводе вы увидите конфигурацию интерфейса:

Output
4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 100
 link/none
 inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
 valid_lft forever preferred_lft forever

Если все запущено и работает корректно, то вы можете сразу настроить сервис так, чтобы он автоматически включался при запуске сервера:

$ sudo systemctl enable openvpn@server

Клиентская инфраструктура

Теперь необходимо настроить систему, которая позволит вам легко и быстро создавать клиентские конфигурационные файлы.

Создание структуры клиентской конфигурационной директории

Создайте структуру директорий внутри вашей домашней директории – это место будет использоваться для хранения файлов:

$ mkdir -p ~/client-configs/files

Так как клиентские конфигурационные файлы будут также содержать клиентские ключи, необходимо закрыть права доступа для этих директорий:

$ chmod 700 ~/client-configs/files

Создание базовой конфигурации

Скопируйте пример клиентской конфигурации в используемую директорию для того, чтобы этот файл можно было использовать как базовую конфигурацию:

$ cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf

Откройте этот новый файл в текстовом редакторе, так как сейчас в него нужно будет внести несколько изменений:

$ nano ~/client-configs/base.conf

Начните с директивы remote. Она указывает клиенту, какой IP-адрес имеет сервер OpenVPN. Этот адрес обязательно должен быть публичным. Если ранее вы изменили порт для сервера OpenVPN, то измените его в этом файле тоже:

. . .
# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote server_IP_address 1194
. . .

И проверьте, что протокол в файле совпадает с тем, который указан в конфигурации сервера:

proto udp

Раскомментируйте директивы user и group, удалив точку с запятой:

# Downgrade privileges after initialization (non-Windows only)
user nobody
group nogroup

Найдите директивы, которые задают ca, cert и key, и закомментируйте их, так как сертификаты и ключи будут заданы внутри самого файла:

# SSL/TLS parms.
# See the server config file for more
# description. It's best to use
# a separate .crt/.key file pair
# for each client. A single ca
# file can be used for all clients.
#ca ca.crt
#cert client.crt
#key client.key

А настройки cipher и auth скопируйте из файла /etc/openvpn/server.conf:

cipher AES-128-CBC
auth SHA256

И еще куда-нибудь в файл вам нужно добавить директиву key-direction, задав ей обязательно значение 1:

key-direction 1

Наконец, добавьте и несколько закомментированных строк, которые будут использоваться только для клиентов Linux, использующих файл /etc/openvpn/update-resolv-conf.

# script-security 2
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf

Поэтому если клиент использует Linux, и у него есть файл /etc/openvpn/update-resolv-conf, нужно раскомментировать эти строки в сгенерированном клиентском конфигурационном файле OpenVPN.

После всех этих изменений сохраните файл.

Примеры настройки dnsmasq

Переходим к основной части инструкции. Приведем примеры использования и соответствующей настройки dnsmasq.

1. Перевод запросов на другой DNS-сервер для определенного домена

Предположим, у нас есть задача — переводить все запросы для имен с доменом consul на другой DNS-сервер, который находится в нашей сети. Также, данный сервер слушает не на стандартном для NS-сервера порту (53), а на порту 8600. Кстати, это реальный пример работы при настройке кластера consul.

Создаем конфигурационный файл:

vi /etc/dnsmasq.d/consul

В него добавим одну строку:

server=/consul/127.0.0.1#8600

* в данном примере мы будем переводить все запросы для домена consul на сервер 127.0.0.1 (в этом примере локальный сервер, но может быть любой) и порт 8600.

Чтобы настройки вступили в силу, перезапускаем dnsmasq:

systemctl restart dnsmasq

2. Настройка кэширования

По умолчанию, dnsmasq работает как кэширующий сервер. Мы же подредактируем настройки.

Создаем конфигурационный файл:

vi /etc/dnsmasq.d/cache

cache-size=10000
all-servers
no-negcache

* где:

  • cache-size — размер кэша (количество хостов).
  • all-servers — задает поведение, при котором наш сервер будет отправлять запрос всем доступным ему серверам DNS и принимать ответ от того, кто первый ему ответит.
  • no-negcache — не кэшировать негативные ответы.

Чтобы настройки вступили в силу, перезапускаем dnsmasq:

systemctl restart dnsmasq

3. Подмена IP-адресов

Есть несколько вариантов подмены IP-адресов в dnsmasq. Для настройки создадим файл:

vi /etc/dnsmasq.d/replacement

В зависимости от ситуации, применяем один из вариантов, описанных ниже.

а) Подмена одного адреса:

alias=1.1.1.1,2.2.2.2

* в данном примере если наш сервер получит ответ 1.1.1.1, он его заменит на 2.2.2.2.

б) Подмена адресов в подсети:

alias=1.1.1.0,2.2.2.0,255.255.255.0

* в данном примере все адреса из подсети 1.1.1.0/24 будут заменены на соответствующие адреса подсети 2.2.2.2/24.

в) Диапазоны:

alias=1.1.1.100-1.1.1.200,192.168.0.0,255.255.255.0

* в данном примере адреса в диапазоне от 1.1.1.100 до 1.1.1.200 будут переопределены в адреса в диапазоне от 192.168.0.100 до 192.168.0.200.

После внесения необходимых строк, нужно перезагрузить сервис.

Выполняем команду:

systemctl restart dnsmasq

Это, далеко, не все возможности dnsmasq. По мере необходимости, они будут дополняться в данной инструкции.

OpenDNS¶

OpenDNS — интернет-служба, предоставляющая общедоступные DNS-серверы. Имеет платный и бесплатный режим, может исправлять опечатки в набираемых адресах, фильтровать фишинговые сайты и осуществлять дополнительную фильтрацию контента при поиске DNS.

Примечание

Для работы данной слубы вам необходима учетная запись OpenDNS и корректно выполненная настройка службы со стороны OpenDNS.

Для настройки OpenDNS перейдите в закладку Службы -> OpenDNS и выполните следующие настройки:

Включен

Включить модуль.

Имя пользователя

Имя пользователя для входа в инструментальную панель OpenDNS.

Пароль

Пароль пользователя.

Сеть

Имя сети настроенной в Networks инструментальной панели сетей OpenDNS на странице «Управление вашими сетями»

При включении службы OpenDNS, DNS-серверы, настроенные на странице «Общие настройки», будут перезаписаны, DNS-серверы, полученные DHCP/PPP на WAN-интерфейсе, будут игнорироваться, а использоваться будут DNS-серверы из opendns.com

Примечание

После выключения службы, проверьте, что DNS-серверы, настроенные на странице «Общие настройки» вернулись к предыдущим значениям.

Troubleshooting

log continuously filled with DHCPINFORM / DHCPACK

Windows 7 among others ask for proxy settings using DHCP. The issue is that they do not stop asking until they have received an answer. This results in that the log contains a lot information about these requests, an example can be found below (thanks for http://wiki.excito.org for the info).

Jul 1 06:34:09 MorganB3 dnsmasq-dhcp: DHCPINFORM(br0) 10.69.10.59 00:23:14:c5:33:fc
Jul 1 06:34:09 MorganB3 dnsmasq-dhcp: DHCPACK(br0) 10.69.10.59 00:23:14:c5:33:fc MorgansVaioF12Z

To solve this, edit /etc/dnsmasq.conf and add the following lines:

# This will tell DHCP clients to not ask for proxy information
# Some clients, like Windows 7, will constantly ask if not told NO
dhcp-option=252,"\n"

and restart dnsmasq with /etc/init.d/dnsmasq restart

Assigning dnsmasq Queryport

The queryport is not the dns server port used by dhcp clients, it is the outgoing port dnsmasq uses to query other servers, and is integral to dnsmasq succesfully assigning DNS values to the DHCP clients. The default settings create arbitrary high port number connections on a range of ports. By assigning an option line like “ option queryport ‘30000’ ” in /etc/config/dhcp, one can constrain those connections to a port you assign. Be certain that your firewall allows outbound connections from the router on the query port that you assign.

As a caution, dnsmasq runs as user “nobody” on openwrt so it is not allowed to create listening sockets on ports < 1024. Using the standard DNS port 53 for these queries will fail. The failure can be found in the logs. Logread will show an “ignoring nameserver” error line like:

Jan 01 01:01:01 MyRoutersName daemon.warn dnsmasq: ignoring nameserver 8.8.8.8 - cannot make/bind socket: Permission denied

Do not assign query ports less than 1024 to the queryport.

BIND¶

BIND — открытая и распространённая реализация DNS-сервера, обеспечивающая выполнение преобразования DNS-имени в IP-адрес и наоборот.

Установка

Перейдите в раздел Система -> Прошивка -> Плагины

На вкладке Плагины нажмите на кнопку + напротив плагина os-bind для его установки.

Основная настройка

Перейдите в раздел Службы -> BIND -> Конфигурация

Настройте следующие параметры:

Включить службу BIND

Включить службу BIND

IP для прослушивания

Список IP адресов, на которых служба будет принимать запросы

Порт прослушивания

Номер порта для прослушивания

DNS-серверы пересылки

Список IP адресов серверов пересылки, куда BIND будет пересылать неизвестные запросы. Если поле пустое, то BIND будет выполнять резолвинг с помощью корневых серверов.

Размер журнала в Мб

Максимальный размер каждого файла журнала

Максимальный размер кэша

Размер ОЗУ (RAM) в процентах, до которого может увеличиваться кэш

Рекурсия

, для которых разрешены рекурсивные запросы

Проверка DNSSEC

Использовать ли DNSSec проверку

Примечание

По умолчанию номер порта . Если вы хотите использовать стандартный порт , убедитесь, что другие DNS службы его не используют (выключены)

Нажмите кнопку Сохранить

Черные списки

Данный функционал позволяет повысить безопасность путем ограничения запросов к ресурсам, которые находятся в черных списках.

Перейдите в раздел Службы -> BIND -> DNSBL

Настройте следующие параметры:

Включить DNSBL и RPZ

Включить DNSBL службу

Тип DNSBL

Выберите используемые списки

Белый список доменов

Список исключений доменов, которые входят в выбранные выше списки, но доступ к которым необходим

Включить безопасный поиск Google

Усиление безопасного поиска путем дополнительной защиты популярных сервисов

Включить безопасный поиск DuckDuckGo

Включить в Youtube ограничения для взрослых

Включить строгий поиск Bing

Нажмите кнопку Сохранить

Списки контроля доступа

В данной секции настраиваются списки сетей, которые используются в настроках доступа для рекурсивных запросов и для настроек доступа в настройках зон.

Перейдите в раздел Службы -> BIND -> Списки контроля доступа

Создайте список, нажав на символ +

Настройте следующие параметры:

Включен

Включить список

Имя

Имя списка

Список сети

Список IP адресов и сетей (в формате <IP>/<маска>)

Нажмите кнопку Сохранить

Теория

Что такое VPN

VPN-соединение создаётся за счёт связки клиент-серверной архитектуры. Клиенты подключаются к серверу VPN, объединяются в виртуальную сеть, безопасно обмениваются данными. Для подключения к Интернету клиент обращается к серверу VPN, а тот, в свою очередь, получает данные из глобальной сети и передаёт их обратно клиенту.

Другими словами, VPN создаёт безопасный коридор между вашими устройствами и сетью. Этот коридор незаметен, а данные, находящиеся в нём, невозможно перехватить. Все соединения идут не напрямую, а через сервер, который может находиться в любой точке мира.

OpenVPN

Один из способов создания виртуальной частной сети – использование бесплатной программы OpenVPN. Утилиту или её исходный код можно скачать на официальном сайте. OpenVPN работает при помощи сертификатов и асимметричного шифрования. То есть передаваемые данные шифруются одним ключом, а расшифровываются другим.

Пара ключей шифрования

  • Публичный ключ – сертификат, который может быть в свободном доступе, производит шифрование данных (email сообщения, проверка ЭЦП).
  • Приватный ключ – хранящийся в ограниченном доступе, только у заинтересованных лиц, расшифровывает данные, зашифрованные публичным ключом.

Для того чтобы такая пара ключей работала, они должны быть подписаны центром авторизации (certification authority, CA). При этом CA имеет свой сертификат и приватный ключ, которые нужны для идентификации созданной пары ключей.

Что нужно для работы OpenVPN

Для настройки VPN необходим виртуальный частный сервер (virtual private server, VPS/VDS). В  качестве ОС будет использоваться Ubuntu — один из самых популярных и стабильных серверных дистрибутивов на базе Linux.

VPS можно арендовать у подходящего хостинг-провайдера

При выборе виртуального сервера важно, чтобы он подходил под следующие условия:

  • Оперативная память (RAM) — не менее 512 МБ.
  • Скорость сетевого интерфейса — 100 мб/сек или выше.
  • Физический сервер должен находиться максимально близко к будущему пользователю. Это обеспечит минимальную задержку (пинг) и позволит соответствовать местным законам.

Такие факторы, как объём постоянной памяти и тип накопителя, практически не имеют значения.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: