Tun2socks: прокси-сервер в качестве шлюза, или vpn через прокси

Настройка и подключение клиента

DNS

Клиентские компьютеры должны быть настроены на использование DNS-сервера, который мы сконфигурировали на сервере FreeIPA во время его установки. В сетевых настройках указываем использовать наш сервер ipa для разрешения имен:

  1. Пример настройки сети в CentOS / Rocky Linux
  2. Настройка сети с помощью netplan (Debian, Ubuntu).
  3. В устаревающих системах на основе deb настройка выполняется в файле /etc/network/interfaces (опция dns-nameservers) или /etc/resolv.conf (опция nameserver).

Время

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

В первую очередь, укажем часовой пояс:

timedatectl set-timezone Europe/Moscow

* командой timedatectl list-timezones можно посмотреть список всех часовых поясов.

Устанавливаем утилиту для синхронизации времени, разрешаем запуск демона и стартуем его.

а) если на системе Ubuntu / Debian:

apt-get install chrony

systemctl enable chrony

б) если на системе Rocky Linux / CentOS / Red Hat:

yum install chrony

systemctl enable chronyd —now

Подключение к домену

Устанавливаем freeipa-client.

а) на компьютеры с Red Hat / CentOS:

yum install freeipa-client

б) на компьютеры с Debian / Ubuntu:

apt-get install freeipa-client

Выполним конфигурирование клиента:

ipa-client-install —mkhomedir

Система на основе данных из DNS попробует определить настройки и либо попросит ввести наш домен (если не сможет найти данные автоматически):

DNS discovery failed to determine your DNS domain
Provide the domain name of your IPA server (ex: example.com): dmosk.local

… либо отобразить настройки в консоли, например:

Discovery was successful!
Client hostname: freeipa-client.dmosk.local
Realm: DMOSK.LOCAL
DNS Domain: DMOSK.LOCAL
IPA Server: ipa-server.dmosk.local
BaseDN: dc=dmosk,dc=local

Если эти настройки верны, отвечаем положительно на запрос Continue to configure the system with these values?

Continue to configure the system with these values? : yes

Система спросит, от какого пользователя производить настройку — вводим admin:

User authorized to enroll computers: admin

… и пароль:

Password for [email protected]:

Начнется процесс конфигурации — после его завершения:


Configured /etc/openldap/ldap.conf
NTP enabled
Configured /etc/ssh/ssh_config
Configured /etc/ssh/sshd_config
Configuring DMOSK.LOCAL as NIS domain.
Client configuration complete.
The ipa-client-install command was successful

… сразу проверим, что клиент может получать билет от сервера:

kinit admin

…  и вводим пароль от пользователя admin.

Проверяем, что билет получен:

klist

Ответ должен быть, примерно, следующим:

Ticket cache: KEYRING:persistent:0:0
Default principal: [email protected]
Valid starting       Expires              Service principal
25.07.2019 23:39:56  26.07.2019 23:39:52  krbtgt/[email protected]

Клиент настроен.

Настройка сети

Чтобы изучить подключения выполните одну из команд:

  • sudo ls /sys/class/net/
  • ip a s
  • ifconfig
  • nmcli conn show

Например:

nmcli conn show

NAME UUID TYPE DEVICE
enp0s3 64486a76-a4b0-4693-9110-205da942c9c5 ethernet enp0s3
enp0s8 fc26857f-4cb0-3756-a7fa-95ec246b3981 ethernet enp0s8

Если какой-то интерфейс, например enp0s3, выключен у него в столбце DEVICE будет стоять —

Обычно неактивный интерфейс выделен серым цветом а активный зелёным.

NAME UUID TYPE DEVICE
enp0s3 64486a76-a4b0-4693-9110-205da942c9c5 ethernet —
enp0s8 fc26857f-4cb0-3756-a7fa-95ec246b3981 ethernet enp0s8

Включить интерфейс можно командой

nmcli conn up enp0s3

Ограничение доступа к сайтам

Мы рассмотрим простой пример блокировки двух сайтов. Доступ к ним будет ограничен в рабочее и ночное время для пользователей группы squidusers. Пользователи группы squidsuperusers будут иметь полный доступ ко всем сайтам.

Открываем конфигурационный файл squid:

vi /etc/squid/squid.conf

В разделе с ACL добавим 2 строки:

acl BLOCKED url_regex -i «/etc/squid/denysite»
acl BLOCKED_ACCESS time 18:00-23:59

* в данном примере мы создаем acl BLOCKED для сайтов, доступ к которым будем блокировать; список сайтов будем хранить в файле /etc/squid/denysite. Второй acl BLOCKED_ACCESS будем использовать для предоставления доступа к заблокированным сайтам, но с промежуток с 18:00 до 23:59.

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

http_access allow squid_superusers_acl_krb
http_access allow squid_superusers_acl_ntlm
http_access allow BLOCKED BLOCKED_ACCESS
http_access deny BLOCKED
http_access allow squid_users_acl_krb
http_access allow squid_users_acl_ntlm

* как видим, мы добавили правила блокировки после пользователей группы squidsuperusers — таким образом, на последних они не будут распространяться. Данные правила разрешают заблокированные сайты в указанный ранее промежуток времени и блокируют доступ к сайтам, перечисленным в файле /etc/squid/denysite.

Создаем файл /etc/squid/denysite:

vi /etc/squid/denysite

* в данном примере мы блокируем доступ к социальным сетям facebook и ВКонтакте.

Перечитываем конфигурацию squid:

squid -k reconfigure

Установка ifconfig

yum provides ifconfig

или

yum whatprovides ifconfig

Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.funet.fi
* epel: www.nic.funet.fi
* extras: ftp.funet.fi
* updates: ftp.funet.fi
base/7/x86_64/filelists_db | 7.2 MB 00:00:01
epel/x86_64/filelists_db | 12 MB 00:00:03
extras/7/x86_64/filelists_db | 224 kB 00:00:00
ssh-products/x86_64/filelists_db | 89 kB 00:00:00
updates/7/x86_64/filelists_db | 3.4 MB 00:00:01
net-tools-2.0-0.25.20131004git.el7.x86_64 : Basic networking tools
Repo : base
Matched from:
Filename : /sbin/ifconfig

ifconfig входит, например, в состав net-tools

Установим net-tools

sudo yum install net-tools

Установка и первоначальная настройка

Установка Debian Wheezy 7.0 происходит в текстовом режиме на русском языке и, как правило, не  вызывает сложностей. Отдельно стоит только остановится на списке ролей: из предложенного нас, пожалуй, может заинтересовать только OpenSSH, для удаленного доступа, однако воспользовавшись пунктом Manual package selection опытный пользователь может сразу установить необходимые ему пакеты.

Если же это ваш первый сервер, то лучше всего продолжить не выбирая никакого варианта, все необходимые пакеты мы доустановим позже. Это позволит иметь более четкое представлении о назначении того или иного пакета и позволит успешно справляться с возможными неполадками. По окончании установки система перезагрузится и встретит нас черным экраном командной строки. Непривычного к консоли Windows-администратора это может неприятно удивить, однако ситуация на сегодняшний день такова, что все серверные роли Linux настраиваются исключительно через консоль и файлы конфигурации.

В первую очередь настроим сетевые соединения. Вводим в консоли:

nano /etc/network/interfaces

Эта команда откроет в консольном редакторе nano конфигурационный файл с сетевыми интерфейсами, аналогичный рисунку ниже. 

Пока там прописан единственный интерфейс eth0, настроенный на работу по DHCP. К eth0 у нас подключен ADSL модем (или любая сеть провайдера), а eth1 смотрит во внутреннюю сеть. IP адрес на внешнем интерфейсе 192.168.1.2, шлюз (ADSL модем) 192.168.1.1, внутренняя сеть лежит в диапазоне 192.168.3.1 — 254. Тогда настройки будут выглядеть следующим образом:

auto eth0
iface eth0 inet static
address 192.168.1.2
netmask 255.255.255.0
gateway 192.168.1.1


auto eth1
iface eth1 inet static
address 192.168.3.1
netmask 255.255.255.0

Сохраняем изменения Ctrl+O и выходим Ctrl+X. Теперь нужно настроить DNS, для этого выполняем: 

nano /etc/resolv.conf

В этом файле необходимо указать адреса DNS серверов, лучше всего указать DNS провайдера или, как в нашем случае, Google DNS.

#Google DNS
nameserver 8.8.8.8
nameserver 8.8.4.4

Сохраняем. Теперь нужно перезапустить сетевые службы (либо перезагрузиться):

/etc/init.d/networking restart

Собственно сеть настроена, можно переходить к следующему этапу, однако мы рекомендуем установить еще несколько пакетов для удобства администрирования.  Сначала обновим список доступных пакетов:

aptitude update

Также рекомендуем обновить версии пакетов до актуальных:

aptitude upgrade

Теперь установим Midnight Commander (mc), файловый менеджер по образу и подобию Norton Commander или Far:

aptitude install mc

Для запуска Midnight Commander достаточно набрать в консоли его краткое имя: mc. Сразу рекомендуем включить встроенный редактор, более удобный чем nano: F9 — Настройки — Конфигурация — Встроенный редактор. 

Для удаленного управления сервером (не бегать же к нему каждый раз) установим OpenSSH, что позволит подключаться к нему из любого места, даже из дома, по защищенному протоколу:

aptitude install ssh

Для подключения с Windows станций можно использовать программу PuTTY (скачать), для корректного отображения символов перед подключением необходимо на закладке Window — Translation выбрать кодировку UTF8. 

Для ограничения доступа к серверу можно дописать в файл /etc/ssh/sshd_config параметр AllowUsers с указанием пользователя имеющего доступ по SSH, например для пользователя admin:

AllowUsers admin

Также можно разрешить доступ определенной группе пользователей используя параметр AllowGroups, либо запретить доступ определенным пользователям / группам использовав DenyUsers и DenyGroups.

Создание пользовательских зон

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

Например, создадим зону publicweb для веб-сервера. Для нее потребуется настроить дополнительную зону для DNS-сервиса, которая предоставляется в частной сети, назовем ее privateDNS.

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

sudo firewall-cmd --permanent --new-zone=publicweb
sudo firewall-cmd --permanent --new-zone=privateDNS

Проверим, что они присутствуют в постоянных правилах:

firewall-cmd --get-zones

Ответ:

block dmz drop external home internal public trusted work

Перезагрузим брандмауэр, чтобы получить доступ к новым зонам:

sudo firewall-cmd --reload
firewall-cmd --get-zones

Ответ:

block dmz drop external home internal privateDNS public publicweb trusted work

Теперь можно присвоить новым зонам нужные сервисы и порты. Рекомендуется внести изменения в активный экземпляр и протестировать, а затем перенести их в постоянные правила. Например, в зону publicweb можно добавить SSH, HTTP и HTTPS.

sudo firewall-cmd --zone=publicweb --add-service=ssh
sudo firewall-cmd --zone=publicweb --add-service=http
sudo firewall-cmd --zone=publicweb --add-service=https
sudo firewall-cmd --zone=publicweb --list-all

Ответ:

publicweb
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: ssh http https
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

Аналогично добавим DNS-сервис к зоне privateDNS:

sudo firewall-cmd --zone=privateDNS --add-service=dns
sudo firewall-cmd --zone=privateDNS --list-all

Ответ:

privateDNS
  interfaces: 
  sources: 
  services: dns
  ports: 
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules:

Затем мы можем перенести интерфейсы в новые зоны, чтобы проверить их:

sudo firewall-cmd --zone=publicweb --change-interface=eth0
sudo firewall-cmd --zone=privateDNS --change-interface=eth1

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

sudo firewall-cmd --zone=publicweb --permanent --add-service=ssh
sudo firewall-cmd --zone=publicweb --permanent --add-service=http
sudo firewall-cmd --zone=publicweb --permanent --add-service=https
sudo firewall-cmd --zone=privateDNS --permanent --add-service=dns

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

sudo systemctl restart network
sudo systemctl reload firewalld

Убедитесь, что зоны были присвоены правильно:

firewall-cmd --get-active-zones

Ответ:

privateDNS
  interfaces: eth1
publicweb
  interfaces: eth0

И проверьте, что в обеих зонах работают нужные сервисы:

sudo firewall-cmd --zone=publicweb --list-services

Ответ:

http https ssh
sudo firewall-cmd --zone=privateDNS --list-services

Ответ:

dns

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

sudo firewall-cmd --set-default-zone=publicweb

Настройка сети через консоль с помощью networking

Кроме NetworkManager, сетями управляет служба Networking. Она интегрирована с NetworkManager и позволяет настроить все необходимые вам параметры с помощью редактирования конфигурационных файлов. Сначала нам нужно посмотреть список сетевых интерфейсов:

У меня имя сетевого интерфейса enp2s0f0. Именно на его примере дальше будет выполняться подключение к сети centos 7. Все настройки для сети Networking хранятся в каталоге /etc/sysconfig/network-scripts/. Для нашего сетевого интерфейса конфигурационный файл будет называться /etc/sysconfig/network-scripts/ifcfg-enp2s0f0.

Давайте сначала рассмотрим основные параметры, которые вам придется рассмотреть:

  • TYPE — тип соединения, проводное (Ethernet), беспроводное(Wired) и т д;
  • BOOTPROTO — способ получения IP адреса, static, dhcp или none;
  • NAME — имя соединения;
  • DEVICE — имя сетевого интерфейса;
  • ONBOOT — необходимо ли запускать при старте системы;
  • IPADDR — IP адрес, который будет использован для этого компьютера;
  • GATEWAY — шлюз для доступа к интернету;
  • NETMASK — маска сети;
  • DNS1 — сервер для разрешения доменных имен DNS.

Фактически вы уже знаете большинство этих параметров. Теперь рассмотрим какой набор нужно задать для каждого способа получения IP адреса.

Настройка получения IP по DHCP

Настройка сети dhcp centos предусматривает использование значения BOOTPROTO dhcp, остальные параметры задавать необязательно:

Теперь сохраните изменения и перезапустите сеть. Все должно заработать.

Настройка сети со статическим IP

Для установки статического IP адреса нужно задать значение BOOTPROTO — static, а также указать IP адрес, шлюз, маску сети и DNS. Вот пример конфигурации сети CentOS для нашего интерфейса:

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

Затем вам останется проверить работу сети. Если все было сделано правильно сеть будет работать.

5: Настройка Heartbeat

Чтобы получить нужный кластер, необходимо создать и настроить следующие файлы Heartbeat на обоих серверах в каталогах /etc/ha.d.

ha.cf – глобальная конфигурация кластера Heartbeat, которая включает все ноды.
authkeys – содержит ключ безопасности, который позволяет нодам пройти аутентификацию в кластере.
haresources – определяет сервисы, которыми управляет кластер, и ноду, которая должна быть владельцем этих сервисов

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

Также необходимо предоставить сценарий, который будет выполнять переназначение плавающего IP-адреса в случае сбоя сервера 1.

Сбор информации о ноде

Прежде чем настроить файл ha.cf, нужно узнать имя каждой ноды. Heartbeat требует, чтобы имя ноды совпадало с ее выводом uname –n.

Следующую команду нужно запустить на обоих серверах.

Обратите внимание на вывод команды. Ноды должны иметь имена primary и secondary

Также нужно найти сетевой интерфейс и IP-адрес, который использует каждая нода для связи с остальной частью кластера. Вы можете использовать любой сетевой интерфейс, если каждая нода может взаимодействовать с остальными нодами в кластере. В руководстве используется публичный интерфейс серверов, eth0.

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

Примечание: Также узнать IP-адрес можно с помощью панели управления.

Обратите внимание на IP-адрес сетевого интерфейса (в примере он выделен красным). Не забудьте получить IP-адреса обоих серверов

Создание файл ha.cf

На обоих серверах откройте /etc/ha.d/ha.cf в редакторе:

Этот файл будет пустым. Сюда нужно добавить сетевые интерфейсы и имена каждой ноды в кластере.

Скопируйте и вставьте эту конфигурацию в файл, а затем замените имена и IP-адреса нод соответствующими значениями. В этом примере сервер 1 имеет IP-адрес 104.236.6.11, а сервер 2 – 104.236.6.22:

Сохраните и закройте файл.

Создание файла authkeys

Ключ авторизации позволяет нодам присоединиться к кластеру. Для этого можно просто создать случайный ключ. На сервере 1 запустите эти команды, чтобы создать ключ авторизации в переменной среды AUTH_KEY:

Затем добавьте ключ в /etc/ha.d/authkeys:

Проверьте содержимое файла authkeys:

Файл будет выглядеть так (ключ будет отличаться):

Право чтения файла должно быть только у пользователя root.

Скопируйте файл /etc/ha.d/authkeys с сервера 1 на сервер 2. Это можно сделать вручную или с помощью scp.

На сервере 2 нужно обновить права на файл:

На этом этапе оба сервера должны иметь идентичные файлы /etc/ha.d/authkeys.

Создание файла haresources

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

На обоих серверах откройте файл haresources в текстовом редакторе:

Добавьте в файл эту строку, указав имя ноды 1:

Сохраните и закройте файл.

Этот параметр настроит сервер 1 как предпочтительный хост для сервиса floatip, который в настоящее время не определен. Теперь нужно настроить сервис floatip.

Работа с учетными записями

Создадим пользователя. Для этого рассмотрим пример использования командной строки и веб-интерфейса.

Командная строка

Авторизуемся на FreeIPA:

kinit admin

Создаем нового пользователя командой:

ipa user-add dmosk —first=Дмитрий —last=Моск —password

* где dmosk — логин; first — имя пользователя; last — фамилия; password — ключ для запроса пароля.

… после ввода команды система запросит пароль для создаваемого пользователя — вводим его дважды.

Мы должны увидеть сводку по параметрам для созданного пользователя:

Добавлен пользователь «dmosk»
——————————
  Логин пользователя: dmosk
  Имя: Дмитрий
  Фамилия: Моск
  Полное имя: Дмитрий Моск
  Отображаемое имя: Дмитрий Моск
  Инициалы: ДМ
  Домашний каталог: /home/dmosk
  GECOS: Дмитрий Моск
  Оболочка входа: /bin/sh
  Principal name: [email protected]
  Principal alias: [email protected]
  User password expiration: 20190725205853Z
  Электронный адрес: [email protected]
  UID: 1798800001
  ID группы: 1798800001
  Пароль: True
  Member of groups: ipausers
  Kerberos ключей доступно: True

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

* в данном примере мы использовали дополнительные поля:

  • cn — полное имя.
  • displayname — отображаемое имя.
  • email — адрес электронной почты.

* более полный список атрибутов можно найти на странице с мануалом Fedora Project.

Веб-интерфейс

Открываем браузер и переходим по адресу имени сервера — в нашем примере, https://ipa-server.dmosk.local. Закрываем всплывающее окно с запросом пароля. В появившейся странице авторизации вводим логин admin и его пароль.

Откроется страница управления пользователями:

На панели справа (над списком пользователей) кликаем по Добавить:

В открывшемся окне заполняем поля для создания пользователя и нажимаем по Добавить:

Проверка

На компьютере с клиентом вводим команду для проверки:

kinit dmosk

… и вводим пароль от созданной учетной записи:

Password for [email protected]

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

Password expired.  You must change it now.
Enter new password: 
Enter it again:

Редактирование учетных записей

Редактирование выполняется командой:

ipa user-mod <имя записи> <опции>

Например, поменять пароль можно командой:

ipa user-mod username —password

* в данном примере будет запрошен новый пароль для учетной записи username.

Для удаления вводим:

ipa user-del <имя записи>

Например:

ipa user-del user_name

Подробная информация

Получить информацию мы можем о любой сущьности в LDAP с помощью командной строки.

Для пользователей:

ipa user-find —all

ipa user-find user_name —all

* первая команда вернет информацию по всем пользователям, вторая — по конкретному (в данном примере user_name).

Для групп:

ipa group-find —all

ipa group-find admins —all

* первая команда вернет информацию по всем группам, вторая — только для admins.

Подготовка серверов

Обновляем систему.

yum update

Настраиваем время.

Необходимо, чтобы на всех нодах было одинаковое время.

Устанавливаем утилиту для синхронизации даты и времени:

yum install ntpdate

Настраиваем синхронизацию по расписанию:

crontab -e

0 0 * * * /usr/sbin/ntpdate ru.pool.ntp.org

Выставляем нужный часовой пояс:

\cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime

* в моем примере московское время.

Синхронизируем время:

ntpdate ru.pool.ntp.org

Настройка брандмауэра.

Выполняется следующими 2-я командами:

firewall-cmd —permanent —add-service=high-availability

firewall-cmd —reload

Заключение

На этом статью по установке сервера на базе ОС CentOS 8 завершаю. Рекомендую сразу же заняться базовой настройкой. Надеюсь, было интересно и полезно. Я постарался подробно рассмотреть все основные нюансы установки, с которыми сам сталкиваюсь в процессе своей профессиональной деятельности. Основные отличия моих статей от подобных, которых развелось огромное количество в интернете в том, что они действительно уникальные и авторские. Я всегда стараюсь привнести в материал часть своих знаний и опыта, накопленного за годы работы в качестве системного администратора. Или просто какие-то свои мысли высказать.

Прежде чем написать статью, я погуглил как ru сегмент, так и мировой на тему установки centos 8 и с грустью констатирую, что не нашел ничего интересного. В топе выдачи банальные СЕО статьи со скриншотами и шагами инсталлятора. Ничего уникального и действительно полезного. Это удручает, потому что СЕО побеждает реальных авторов-практиков, у которых нет времени разбираться в продвижении, и делает их статьи невидимыми для людей, потому что их нет в ТОП 10 выдачи поисковиков. Если мне попадаются интересные сайты с качественным контентом, я добавляю их в закладки и просматриваю вручную, когда есть время.

Обозначенная выше проблема актуальна для всех информационных сайтов. Думаю, каждый это замечает, когда что-то ищет в интернете не по коммерческим запросам. На первых местах всегда СЕО статьи с рерайтом одной и той же фигни. Практическая ценность подобных статей стремится к нулю. Поисковики что-то постоянно пытаются с этим сделать, но получается не очень, потому что сеошники подстраиваются. В этом плане Гугл работает более качественно, чем Яндекс. У последнего выдача более мусорная, что косвенно подтверждается тем, что он с каждым годом теряет свои позиции в качестве поисковика.

Напоминаю, что данная статья является частью единого цикла статьей про сервер Centos.

Онлайн курс «DevOps практики и инструменты»

Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, научиться непрерывной поставке ПО, мониторингу и логированию web приложений, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужны базовые знания по сетям и установке Linux на виртуалку. Обучение длится 5 месяцев, после чего успешные выпускники курса смогут пройти собеседования у партнеров.

Проверьте себя на вступительном тесте и смотрите программу детальнее по .

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

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