phpMyAdmin - Install phpMyAdmin - Configure phpMyAdmin - phpMyAdmin CentOS | Antoine Solutions Development: "phpMyAdmin
phpMyAdmin is a tool written in PHP intended to handle the administration of MySQL over the Web. Visit the phpMyAdmin website for more information.
Version
CentOS 5.x
phpMyAdmin 3.1.x
Requirements:
Install and Configure the Remi Repository
Install phpMyAdmin 3.1.x
Run the following yum install command
yum install phpmyadmin
Restart the Apache Server
service httpd restart
Test
Visit http://localhost/phpmyadmin in your local web browser. You should be prompted for authentication
Enter the system root username and password and click OK
You should now be presented with the phpMyAdmin home page"
'via Blog this'
воскресенье, 2 октября 2011 г.
INSTALL ASTERISK 1.8 ON CENTOS 6
This guide explains step by step how to install Asterisk 1.8 on CentOS 6 x86_64 however you should be able to follow this guide for i686 & RHEL Linux, I have also included a video guide for those of you that prefer to watch a video rather than read.
Asterisk is an enterprise level telephone system that uses real desk phones capable of seamlessly calling normal phones, your users probably wont even realise they are using a VoIP phone system. Asterisk VoIP PBX can connect to existing ISDN30e / POTS telephone lines or over the Internet via a ITSP.
To start off with follow my guide on how to install CentOS 6, use the minimal server install as suggested. Do not install a GUI on Asterisk, this is a PBX it needs to be reliable do not waste resources on X Windows. I would also like to point out that this guide is for an Asterisk server with no bloat, this is not a guide for setting up Trixbox or Elastix I recommend straight Asterisk, this has caused me less issues over the years. It might be more complicated to configure bu that is what this guide is for
To start off with follow my guide on how to install CentOS 6, use the minimal server install as suggested. Do not install a GUI on Asterisk, this is a PBX it needs to be reliable do not waste resources on X Windows. I would also like to point out that this guide is for an Asterisk server with no bloat, this is not a guide for setting up Trixbox or Elastix I recommend straight Asterisk, this has caused me less issues over the years. It might be more complicated to configure bu that is what this guide is for
Update the system & reboot:
yum update
Review the updates and accept, when they have completed reboot with:
init 6
Install wget to pull down Asterisk:
yum install wget
Download Asterisk 1.8 & DAHDI + Tools
wget http://downloads.asterisk.org/pub/telephony/asterisk/releases/asterisk-1.8.5.0.tar.gz && wget http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/releases/dahdi-linux-complete-2.5.0+2.5.0.tar.gz
Asterisk & DAHDI Tools need extracting, to extract the tar.gz
tar -xvzf asterisk-1.8* && tar -xvzf dahdi-linux-complete-*
Install dependencies so we can compile Asterisk 1.8
yum install kernel-devel gcc make gcc-c++ libxml2-devel
This should look like:
Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: gcc x86_64 4.4.4-13.el6 base 10 M gcc-c++ x86_64 4.4.4-13.el6 base 4.7 M kernel-devel x86_64 2.6.32-71.29.1.el6 updates 6.5 M libxml2-devel x86_64 2.7.6-1.el6 base 1.1 M make x86_64 1:3.81-19.el6 base 389 k Installing for dependencies: cloog-ppl x86_64 0.15.7-1.2.el6 base 93 k cpp x86_64 4.4.4-13.el6 base 3.7 M glibc-devel x86_64 2.12-1.7.el6_0.5 updates 961 k glibc-headers x86_64 2.12-1.7.el6_0.5 updates 592 k kernel-headers x86_64 2.6.32-71.29.1.el6 updates 991 k libgomp x86_64 4.4.4-13.el6 base 108 k libstdc++-devel x86_64 4.4.4-13.el6 base 1.5 M mpfr x86_64 2.4.1-6.el6 base 157 k pkgconfig x86_64 1:0.23-9.1.el6 base 70 k ppl x86_64 0.10.2-11.el6 base 1.3 M zlib-devel x86_64 1.2.3-25.el6 base 43 k Transaction Summary ================================================================================ Install 16 Package(s) Upgrade 0 Package(s) Total download size: 32 M Installed size: 90 M Is this ok [y/N]: y
You also need to install Perl & ncurses-devel
yum install perl ncurses-devel
Build DAHDi, this needs to be built first so you can build Asterisk with support for conference rooms and anything else that requires DAHDi. MAKE SURE YOU DO THIS FIRST.
cd dahdi-linux-complete* make all make install make config
For this tutorial I am only going to be using SIP trunks, I have no hardware installed. If you have are using cards / hardware you might want to check out /etc/dahdi/system.conf and /etc/asterisk/chan_dahdi.conf.
Start DAHDi at Boot
chkconfig dahdi on service dahdi start
Build Asterisk
cd asterisk-* make clean ./configure
Configure your Asterisk Server options and install
make menuselect make make install
Install sample config files in /etc/asterisk and set Asterisk to start at boot.
make samples make config chkconfig asterisk on
Start Asterisk to test it runs!
asterisk -vvvvc
To stop asterisk
core stop now
If Asterisk does not run chances are you made a mistake, it happens. Check you have follow my guide exactly and start again if necessary.
Once you have tested Asterisk is working start the service
/etc/init.d/asterisk start
пятница, 30 сентября 2011 г.
Сеть в Linux на примере CentOS 5
Сетевой интерфейс Linux
Сетевой интерфейс – это точка присутствия сервера в локальной сети. В свою очередь, локальная сеть скорее всего будет иметь доступ в глобальные сети.
Настройка сетевого интерфейса это типичная задача при установке сервер на colocation и в ней нет нечего сложного.
Какие файлы влияют на работу сетевого интерфейса в Linux CentOS 5:
/etc/modprobe.conf – здесь загружаются модули ядра для различных устройств:
alias eth0 pcnet32
alias eth1 pcnet32
...
/etc/hosts – здесь находится список ip-адресов и назначенных им имен.
Удобно в отсутствие DNS-сервера или когда нет необходимости сообщать эти имена на всю сеть.
/etc/resolv.conf – в этом файле указываются DNS сервера. DNS-сервер задается директивой nameserver
# cat /etc/resolv.conf
nameserver 192.168.146.2
/etc/host.conf – файл указывает последовательность использования механизмов разрешения имени. В нашем случае сначала используем /etc/hosts а только потом DNS-сервер.
# cat /etc/host.conf
order hosts,bind
/etc/init.d/network – скрипт останавливающий и запускающий работу сети
/proc/sys/net/ipv4/ip_forward – включение маршрутизации для своих интерфейсов, если у вас два или более интерфейсов её нужно включить. Включение осуществляется передачей “1” в этот файл.
# echo '1' > /proc/sys/net/ipv4/ip_forward
/etc/sysconfig/network — здесь мы указываем, является ли наш сервер доступным по сети, если да то по каким протоколам и указываем наш hostname, то есть имя сервера. Default gateway рекомендуется указывать здесь.
# cat /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=centos52
NETWORKING=yes — будет ли наш сервер работать в сети, наверно 99% случаев ответ будет — да, то есть yesЭта директива для Ipv4
NETWORKING_IPV6=no — Ipv6 уже где-то используется но не настолько чтобы переводить сервера на его использование. Пока я не буду его включать.
HOSTNAME=centos52 — имя нашего сервера
В /etc/sysconfig/network-scripts/ находятся различные скрипты влияющие на работу сетевого интерфейса:
# ls -l /etc/sysconfig/network-scripts/
-rw-r--r-- 1 root root 140 Feb 14 19:23 ifcfg-eth0
-rw-r--r-- 1 root root 254 Mar 3 2008 ifcfg-lo
...
/etc/sysconfig/network-scripts/ifcfg-*
Для нас самое большое значение имеют скрипты ifcfg-*. Именно в них описываются настройки сетевых интерфейсов присутствующих в сервере.
Давайте посмотрим что у них внутри.
DHCP iface
Данный интерфейс работает с использованием службы DHCP.
# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=dhcp
HWADDR=00:0C:29:43:5B:3D
ONBOOT=yes
Мой компьютер работает по DHCP, что отчетливо видно по директиве BOOTPROTO=dhcp. То есть сетевые настройки мы получаем у dhcp-сервера при загрузке нашего сервера. Другие директивы означают следующее:
DEVICE=eth0 — как будет называться наш интерфейс, принято первый интерфейс называть как eth0, второй eth1 и так далее
HWADDR=00:0C:29:43:5B:3D — MAC-адрес нашей сетевой карты. Media Access Control — это уникальный идентификатор сетевой карты. У каждой сетевой карты свой MAC-адрес и в идеале он не повторяется больше ни с каким в мире. Иногда MAC-адрес пытаются подменить чтобы выдать свой компьютер за чужой, по каким либо соображениям, обычно враждебным.
Длина MAC-адреса составляет 48 бит что позволяет иметь 281 474 976 710
656 уникальных комбинаций. У каждого производителя сетевых плат есть свой диапазон в котором он назначает MAC-адреса своим платам. MAC-адрес пишется в шестнадцатеричной форме счисления.
ONBOOT=yes — включать ли этот интерфейс автоматически при включение сервера. Думаю, что скорее всего это и нужно.
Loopback iface
loopback-интерфейс необходим для нормальной работы ОС.
# cat /etc/sysconfig/network-scripts/ifcfg-lo
DEVICE=lo
IPADDR=127.0.0.1
NETMASK=255.0.0.0
NETWORK=127.0.0.0
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
DEVICE=lo — это loopback интерфейс. Интерфейс есть в любой системе и всегда поднят. Он нужен для нормальной работы ОС.
IPADDR=127.0.0.1 — ip-адрес loopback интерфейса. Он всегда такой.
NETMASK=255.0.0.0 — сетевая маска
NETWORK=127.0.0.0 — сеть в которой находится наш ip-адрес
BROADCAST=127.255.255.255 — адрес широковещательной рассылки
ONBOOT=yes — включать ли интерфейс при загрузке сервера, конечно да!
NAME=loopback — имя сетевого интерфейса. Вывод команды ifconfig будет показывать значение указанное именно в DEVICE.
Custom iface
Выше мы рассмотрели интерфейс работающий по протолу dhcp. Но как правило придется работать именно с custom-интерфейсами, то есть вручную задавать параметры и маршрутизацию о которой мы поговорим немного позже.
Вот custom-интерфейс
DEVICE=eth0
IPADDR=192.168.0.2
NETMASK=255.255.255.0
NETWORK=192.168.0.0
BROADCAST=255.255.255.255
GATEWAY=192.168.0.1
ONBOOT=yes
BOOTPROTO=dhcp здесь отсутствует но есть другие директивы.
IPADDR=192.168.0.2 — здесь мы задаем ip-адрес нашего интерфейса
NETMASK=255.255.255.0 — сетевая маска
NETWORK=192.168.0.0 — сеть в которой находится наш ip-адрес
BROADCAST=255.255.255.255 — адрес широковещательной рассылки
GATEWAY=192.168.0.1 — шлюз через который мы попадаем в другие сети
ONBOOT=yes — включать ли интерфейс при загрузке сервера
Практика
Настроим сетевой интерфейс в Linux. Мы знаем что lo всегда включен и его не нужно вообще трогать.
Редактируем /etc/sysconfig/network-scripts/ifcfg-eth0
Мой конфигурационный файл выглядит так:
DEVICE=eth0
HWADDR=00:0C:29:43:5B:3D
IPADDR=192.168.146.130
NETMASK=255.255.255.0
BROADCAST=192.168.146.255
GATEWAY=192.168.146.2
ONBOOT=yes
Далее нужно перезагрузить сетевой интерфейс чтобы прочитались новые настройки
# service network restart
или
# /etc/init.d/network restart
Shutting down interface eth0: [ OK ]
Shutting down loopback interface: [ OK ]
Bringing up loopback interface: [ OK ]
Bringing up interface eth0: [ OK ]
Проверим все ли поднялось
# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:43:5B:3D
inet addr:192.168.146.130 Bcast:192.168.146.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff :fe43:5b3d/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1327 errors:0 dropped:0 overruns:0 frame:0
TX packets:1340 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:149547 (146.0 KiB) TX bytes:232486 (227.0 KiB)
Interrupt:59 Base address:0x2000
...
Жирным выделены особенно интересные нам участки в выводе команды ifconfig. Как видим все похоже на правду и интерфейс «поднят», то есть находится в рабочем режиме.
Для большей ясности разберем и некоторые другие параметры сетевого интерфейса:
- MTU:1500 — это Maximum Transfer Unit. Различные сети и каналы передачи имеют разные скорости обмена. Это определяет максимальную длину пакета, пересылка которого с высокой вероятностью произойдет без ошибок. Для Ethernet — сетей значение MTU составляет 1500 байт.
- Metric:1 — чем меньше это значение тем лучше считается маршрут до этой сети. На серверах скорее всего это менять не придется. Этот параметр играет большую роль в работе протоколов маршрутизации.
- Сollisions:0 — нулевое значение говорит о том, что с сетевым интерфейсом все в порядке на физическом уровне.
- RX bytes — сколько данных принято
- TX bytes — сколько данных отослано
Так идем дальше. В примере выше, после настройки сетевого интерфейса мы полностью перезагружали службу network. Когда на сервере только один интерфейс это не страшно, но если их несколько и какие-то уже работают и выполняют свои функции прерывать их работу нежелательно. Тут нам на помощь приходит скрипт ifup/ifdown. Он нужен для перезагрузки какого либо одного сетевого интерфейса. Короткий пример.
Шаг 1. Вносим изменения в /etc/sysconfig/network-scripts/ifcfg-eth0
Шаг 2. # ifdown eth0
Шаг 3. # ifup eth0
Маршрутизация
Маршрутизация — это процесс поиска наилучшего пути от источника к получателю. Это набор правил по которым будет передаваться трафик. Мы вроде бы с ней еще нечего не делали, но она уже у вас работает. Не верите ? Сейчас проверим.
netstat – команда позволяющая отслеживать сетевые подключения сервера
# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.146.0 * 255.255.255.0 U 0 0 0 eth0
default 192.168.146.2 0.0.0.0 UG 0 0 0 eth0
В выводе мы увидим список сетей и как до них добраться. То есть какой шлюз использовать для достижения пункта назначения. Помните, когда мы настраивали сетевой интерфейс eth0 мы указали директиву GATEWAY в ifcfg-eth0 ? Этот gateway был помечен как default, то есть шлюз по умолчанию.
Весь трафик в сети, которые явно не описаны в таблице маршрутизации, отправляются через шлюз по умолчанию. В нашем случае default gateway —192.168.146.2
Вывод команды “netstat -r” нам говорит следующее:
Первая строка. Чтобы попасть в подсеть 192.168.146.0 нам не нужен никакой шлюз (*), поскольку мы и так находимся в этой сети
Вторая строка — это default, то есть маршрут по умолчанию. Весь трафик предназначенный по все остальные сети будет уходить через этот шлюз.
Genmask — это сетевая маска, благодаря маске можно отделить сетевую часть адреса от адреса хоста
Flags: U — это UP, то есть маршрут поднят и функционирует сейчас
Flags: UG — UP, Gateway. Маршрут поднят и использует gateway в своей работе
MSS – Maximum Segment Size, определяет максимальный размер пакета для этого маршрута.
Window – размер окна. Максимальный размер пакета, который система готова принять.
irtt — initial round trip time, задает значение которое используется при установке соединения. Round trip time – представляет из себя отрезок времени, если в течение которого от удаленного хоста не пришло подтверждение о получение пакета, пакет будет выслан снова.
Iface – показывает к какому интерфейсу относится маршрут
Прописываем маршруты
Если на сервере несколько сетевых интерфейсов то скорее всего понадобится вручную составить таблицу маршрутизации.
Приведу пример. У нас два сетевых интерфейса eth0 и eth1. Через eth0 мы получаем доступ во внешние сети и по умолчанию весь трафик направляется через него. Через eth1 мы получаем доступ ко внутренней сети 192.168.147.0/24 но что еще важнее, в этой сети есть сервер 192.168.147.1 у которого есть сетевой интерфейс в подсеть 192.168.148.0/24 и мы очень хотим туда попадать. А для того что туда попадать необходимо прописать правильные маршруты у себя в ОС.
Так выглядит таблица маршрутизации в нашем случае
# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.147.0 * 255.255.255.0 U 0 0 0 eth1
192.168.146.0 * 255.255.255.0 U 0 0 0 eth0
192.168.148.0 192.168.147.1 255.255.255.0 UG 0 0 0 eth1
192.168.146.2 0.0.0.0 UG 0 0 0 eth0 default
То есть в подсеть 192.168.148.0/24 (внутренняя подсеть) мы попадаем через eth1 -> 192.168.147.1, сервер выполняющий роль шлюза в эту подсеть. Все остальное идет через default шлюз. Все очень просто. Ну и собственно как привести настройки к этому.
Шлюз по умолчанию
# cat /etc/sysconfig/network
...
GATEWAY=192.168.146.2
...
eth0
# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=00:0C:29:43:5B:3D
IPADDR=192.168.146.130
NETMASK=255.255.255.0
BROADCAST=192.168.146.255
ONBOOT=yes
eth1
# cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
ONBOOT=yes
HWADDR=00:0c:29:43:5b:47
IPADDR=192.168.147.2
NETMASK=255.255.255.0
И самое главное, файл в котором мы прописываем статический маршрут для eth1.
# cat /etc/sysconfig/network-scripts/route-eth1
192.168.148.0/24 via 192.168.147.1
Для того чтобы прописать маршруты для какого либо интерфейса, необходимо создать файл route-<название интерфейса> в каталоге /etc/sysconfig/network-scripts/ После того как все готово к работе, мы перезагружаем сетевой сервис.
# service network restart
Теперь подведем итоги, что и как мы сделали.
Есть три вида маршрутов. Динамические – которые динамически назначаются сетевому интерфейсу, например сервером DHCP. Статические – которые вы вручную прописываете и они остаются в настройках после перезагрузки сервера. И маршруты по умолчанию – когда никакие другие маршруты не подходят для того, чтобы отослать по ним пакеты.
Мы могли добавить маршрут в подсеть 192.168.148.0/24 командой route
# route add -net 192.168.148.0/24 gw 192.168.147.1
Но после перезагрузки сервера информация о маршруте пропала бы. Чтобы такого не произошло используется специальный механизм. А именно создание файла вида route-<имя интерфейса> в /etc/sysconfig/network-scripts В него мы вносим список сетей и как до них добраться. Каждая новая запись начинается с новой строки.
Про шлюз
Чтобы сервер был шлюзом для других компьютеров необходимо удовлетворить ряд условий:
- На сервере корректная таблица маршрутизации благодаря которой он поймет что делать с пакетами дальше;
- Включена передача пакетов между интерфейсами;
- Включен маскарадинг (или установлен прокси) для нужной нам сети, например вот так (перенаправлять пакеты для хостов из подсети 192.168.146.0/24):
# iptables -t nat -A POSTROUTING -s 192.168.146.0/24 -j MASQUERADE
Полезные ключи netstat
- r – показывает таблицу маршрутизации
- n – выводит статистику по ip-адресу, не пытается определить имя хоста. Это работает несколько быстрее и обычно, вывод команды удобнее читать
- a – показывает состояние всех сокетов на сервере. Сокет – это конечная точка сетевых коммуникаций. Каждый сокет имеет тип и ассоциированный с ним процесс.
- t – протокол tcp
- u – протокол udp
- i – отображает таблицу сетевых интерфейсов
- l – отображает сокеты в режиме LISTEN, то есть ожидающие соединения
- p – показать PID (process ID) и имя программы с которой взаимодействует сокет
netstat на практике
Параметров выше вполне достаточно, чтобы многое узнать из жизни сетевых служб.
Слушает ли кто нибудь 25-й порт ?
# netstat -nlp | grep :25
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2710/sendmail:
Видим что 25-й порт слушает процесс sendmail с PID 2710
# ps ux | grep 2710
root 2710 0.0 0.7 8992 1836 ? Ss 11:17 0:00 sendmail: accepting connections
Посмотрим текущие ESTABLISHED-соединения по tcp, то есть с кем у нас есть подключение и по какому порту
# netstat -nt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 ::ffff :192.168.146.130:22 ::ffff :192.168.146.1:2642 ESTABLISHED
tcp 0 132 ::ffff :192.168.146.130:22 ::ffff :192.168.146.1:2027 ESTABLISHED
Как видим это только соединения по ssh
Также, будет полезно знать какие состояния бывают у сокетов:
- ESTABLISHED – сокет с установленным соединением;
- SYN_SENT – сокет в процессе установки соединения;
- SYN_RECV – был принят запрос установки соединения из сети;
- FIN_WAIT1 – сокет закрыт и соединение закрывается;
- FIN_WAIT2 – сокет закрыт и сокет ждет закрытия соединения с удаленного хоста;
- TIME_WAIT – сокет после своего закрытия, еще какое-то время принимает пакеты из сети;
- CLOSED – сокет не используется;
- CLOSE_WAIT – удаленный хост отключился, ожидаем закрытия сокета;
- LAST_ACK – удаленный хост отключился и сокет закрыт. Ожиданиепотдверждения;
- LISTEN – сокет ожидает входящие подключения;
- CLOSING – оба сокета отключились но еще не все наши данные отосланы;
- UNKNOWN – статус сокета неизвестен.
Мы научились настраивать один и более сетевых интерфейсов. Разобрались с маршрутизацией. Узнали какие файлы и как влияют на работу сети в Linux CentOS 5. Сейчас мы познакомимся с двумя программами которые играют существенную роль в работе сети. Это программа nmap – которая сканирует порты удаленного хоста и сообщается какие порты на нем открыты. И программа tcpdump, она переводит вашу сетевую плату в режим promiscuous, что позволяет перехватывать весь трафик проходящий через карту.
NMAP
Nmap позволяет сканировать удаленные компьютеры на предмет открытых портов. С более агрессивными опциями можно узнать версию ОС и некоторые другие вещи.
Устанавливаем программу
# yum -y install nmap
Просканируем удаленный хост. Как видим есть кое что интересное.
# nmap -A -T5 192.168.146.132
Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2009-02-18 19:36 MSK
Interesting ports on unixbox (192.168.146.132):
Not shown: 1677 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 4.3 (protocol 2.0)
111/tcp open rpcbind 2 (rpc #100000)
935/tcp open status 1 (rpc #100024)
MAC Address: 00:0C:29:25:04:55 (VMware)
Device type: general purpose
Running: Linux 2.4.X|2.5.X|2.6.X
OS details: Linux 2.4.7 - 2.6.11
Uptime 0.195 days (since Wed Feb 18 14:55:10 2009)
Nmap finished: 1 IP address (1 host up) scanned in 14.239 seconds
У nmap много различных опций, подробнее о них можно прочитать в man nmap
tcpdump
Иногда в целях выявления неисправностей нам нужно выяснить, какие пакеты передаются по сети. Это не сложно сделать с помощью tcpdump.
Слушаем весь трафик для MAC-адреса 00:a0:80:00:2f:fe на интерфейсе eth1
# tcpdump -n -i eth1 «ether host 00:a0:80:00:2f:fe»
Слушаем трафик для определенного ip-адреса и порта
# tcpdump -nn host 192.168.146.130 and port 22
Сканируем диапазон портов
# nmap -sT -p 13722-13783 linuxbox
Надеюсь, что данной информации будет достаточно. Если возникли какие-то вопросы, то пишите их в комментарии.
Подписаться на:
Сообщения (Atom)