SOCKS-прокси

Многие люди в настоящее время заботятся(пытаются заботится) о своей анонимности, скрывая реальный ip-адрес, который они используют в Интернет. Для этого существуют прокси, vpn, tor, i2p и т.д. Сегодня рассмотрим быструю установку и развертывание SOCKS-прокси. Кто-то мне сказал, что SOCKS-прокси уже давно не использует никто, но я усомнился в его словах. Если его не используют, почему в настройках сети браузеров до сих пор есть возможность указания SOCKS.
Для установки SOCKS-прокси используем open-source ПО 3proxy, простое в настройке и очень популярное на сегодняшний день.
Итак, приступим. На арендованном VPS под CentOS 6.4 подключаем дополнительный репозиторий epel.
rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
Устанавливать можно и не из репозитория, но стабильная версия, что на сайте, что в репозитории одна и та же 0.6.1
Для создания исключительно анонимного прокси достаточно исправить файл конфигурации /etc/3proxy.cfg следующим образом:
nscache 65536 #- размер КЭШа dns-запросов
daemon #- запускать в режиме демона
############секцию про логи можно опустить#####################
log /var/log/3proxy/3proxy.log #- файл логирования
logformat "- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T" #-формат логирования
archiver gz /bin/gzip %F #- архивирование логов
rotate 30 #- ротация логов
###############################################################
external
internal
############http-прокси, если необходимо#######################
proxy -n
############собственно и сам socks#############################
socks
###############################################################

По умолчанию socks-прокси запускается на 1080 порту. Запускаем и проверяем:
[root@proxy etc]# service 3proxy start
Запускается 3proxy: [ OK ]
[root@proxy etc]# netstat -tapn | grep 3proxy
tcp 0 0 144.76.164.137:1080 0.0.0.0:* LISTEN 30633/3proxy
tcp 0 0 144.76.164.137:3128 0.0.0.0:* LISTEN 30633/3proxy

На 3128 порту запустился, как видим http-прокси.
Добавляем 3proxy в автозагрузку:
[root@proxy etc]# chkconfig 3proxy on

Если у Вас настроен iptables, добавляем правило и сохраняем:
[root@proxy etc]#iptables -A INPUT -p tcp -m tcp --dport 1080 -m state --state NEW -j ACCEPT
[root@proxy etc]# service iptables save

Настраиваем браузер для работы через прокси(например, Firefox):
image002
В поле SOCKS host указываем ip вашего сервера или его DNS-имя. В качестве версии SOCKS можно указывать любую, так как 3proxy поддерживает и 4, и 5 версию. Главное отличие между версиями — поддержка дополнительных методов аутентификации. Кстати об аутентификации, настроить аутентификацию мне так и не удалось. При работе через http-прокси аутентификация проходит успешно, а вот с SOCKS даже не выскакивает окошко аутентификации и таким образом, SOCKS считает Вас неаутентифицированным юзером и не дает работать, то есть пакеты доходят до SOCKS, но он не инициирует коннект к web-серверам, к которым вы хотите подключиться (смотрел tcpdumpом)
В логах 3proxy при работе через прокси видны следующие записи:
1385637903.162 SOCK4.1080 00000 - :40819 72.163.10.10:80 2038 369 0 CONNECT_72.163.10.10:80
1385637903.366 SOCK4.1080 00000 - :40821 72.163.10.14:80 1998 408 0 CONNECT_72.163.10.14:80
1385637904.465 SOCK4.1080 00093 - :40788 66.235.138.217:80 572 494 0 CONNECT_66.235.138.217:80

Вообще у 3proxy еще много различных плюшек и настроек: проксирование DNS, pop3, smtp, ftp, ограничение полосы пропускания и т.д., но это тема отдельных постов.
Удачи в настройке.

Установка OpenVPN на CentOS с аутентификацией по учетным записям

Собрался и попал наконец на курсы Microsoft 70411 (Администрирование Windows Server 2012) в одном достаточно известном Учебном центре в Питере. Я в силу специфики деятельности(ИТ) и всяких договоренностей должен быть в постоянной доступности и иметь возможность оказать помощь в настройке и администрировании поддерживаемых мною сервисов и оборудования. Как правило, с моего рабочего компьютера настроены доступы и т.п. вещи. Компьютер работает постоянно и днем и ночью доступен через VPN (ipsec и ssl anyconnect), которые терминируются на Cisco ASA, стоящих на периметре нашей сети. Я, конечно, решил подготовиться на случай, если доступ в Интернет в учебном центре будет ограничен определенными протоколами и портами — сделал настройку NAT(проброс) с публичного ip нашей организации с 80 порта на 3389 моего компьютера для возможности доступа по RDP.
НО….как оказалось подготовка была недостаточной…
Пришел в учебный центр, мне выделили ПК с предустановленной Windows Server 2012 и правами администратора. Уже хорошо) Проверка Интернет — есть, аутентификации вроде бы никакой нет) скачиваю Cisco Anyconnect, ввожу параметры своего VPN-сервера…нет коннекта, удивительно… Портал webvpn на Cisco ASA доступен по https. Проверка доступности по RDP на 80 порт, нет коннекта.Cisco VPN-клиент, работающий по ipsec, — тот же результат.
Печально, почему же нет коннекта, при наличии интернет???
Открываю список соединений, установленных с моего компьютера:
image001
Как видим, chrome установил кучу соединений к серверу со звучным названием squid. Кто не знает — это прокси сервер, по видимому, в учебном центре выход в Интернет только через него, причем аутентификации по логину/паролю нет. Он-то и мешает моим подключениям по VPN и RDP. Работает прокси достаточно просто: слушает клиентские подключения на определенном порту(по дефолту 3128, обрабатывает их и самостоятельно устанавливает соединения к необходимо ресурсу). Squid, как правило, используется для http,https прокси, но может проксировать запросы и по другим протоколам. Для того чтобы ваше клиентское предложение заработало через прокси, оно должно иметь соответствующую поддержку.
Как оказалась, anyconnect не работает через прокси(раньше как-то об этом не задумывался), ну и RDP с дефолтным клиентом под windows само собой тоже не работает.
Что же может заработать?
А может заработать openvpn у которого есть поддержка работы через http(s)-прокси!
Коллега запустил TeamViewer на рабочем компьютере, скинул параметры доступа, я подключился — как известно для TeamViewer прокси не преграда)Но он меня не устраивал, так как мне не нравится картинка через TeamViewer, в RDP-сессии он не запускается, без лицензии может закрыться и т.д. но для временного подключения вполне сгодился.
Я подключился к одному из своих VPS под CentOS, установил openvpn
yum install openvpn
Так как смысла заворачиваться с аутентификацией по сертификатам я не видел, настроил парольную аутентификацию, сгенерировав только сертификат центра сертификации и сервера.
openssl req -x509 -days 3650 -newkey rsa:2048 -keyout private/ca.key -out cacerts/ca.crt
Запрос на сертификат сервера:
openssl req -newkey rsa:1024 -keyout private/serverkey.pem -out reqs/serverreq.pem
Подпись сгенерированным ранее закрытым ключом:
openssl ca -config ./openssl.cnf -in reqs/serverreq.pem -days 730 -out certs/servercert.pem -notext
Параметры openssl.cnf можно посмотреть/почитать в моем другом посте
Кроме указанных выше ключей и сертификатов, для работы Openvpn необходим ключ Diffie–Hellman. Его можно сгенерировать с использованием скриптов, которые были подготовлены разработчиками openvpn (кстати, с использованием этих скриптов также можно сгенерировать ключи CA,сервера и клиентов при необходимости)
Скачиваем, находим скрипт build-dh и выполняем его ./build-dh . В результате выполнения создастся файл dh1024.pem.
Копируем файлы ca.crt, serverkey.pem,servercert.pem в директорию /etc/openvpn
Переходим в директорию /etc/openvpn и создаем файл конфигурации сервера:
cd /etc/openvpn
vi server.conf
port 1194 #порт, на котором будет слушать openvpn-демон
proto tcp #работать будем по tcp. Можно попробовать и по udp, но не уверен, что заработает через прокси
dev tun #виртуальный интерфейс L3, который будет создаваться при запуске сервиса. Возможен также tap - L2
ca /etc/openvpn/ca.crt #путь к сертификату Центра сертификации
cert /etc/openvpn/serverkey.pem # путь к сертификату сервера
key /etc/openvpn/servercert.pem # путь к закрытому ключу сервера
dh /etc/openvpn/dh1024.pem # путь к ключу Diffie–Hellman, используется, как правило, для получения/выработки общего ключа шифрования между клиентом и сервером
server 192.168.111.0 255.255.255.0 #пул адресов, из которых будет выделен ip подключающимся клиентам
ifconfig-pool-persist ipp.txt # сохранять соответствие ip-пользователь для последующих подключений
push "route <внешний ip для доступа к моему серверу по RDP> 255.255.255.255" #добавить в таблицу маршрутизации клиентского ПК маршрут к указанному ip через туннель. Я указал внешний ip, для которого сделал проброс на RDP
keepalive 10 120 #проверка подключен ли клиент
comp-lzo #использовать сжатие
max-clients 100 # максимальное количество клиентов, которое может подключиться к серверу
persist-key # позволяет тратить меньше время на
persist-tun # downtime при рестарте openvpn
verb 3 #уровень логирования
management localhost 7773 #management подключение к openvpn-серверу(не обязательно)
plugin /usr/lib64/openvpn/plugin/lib/openvpn-auth-pam.so login # использование плагина для аутентификации с использованием системных учетных записей с использованием модуля pam. Плагин входит в стандартный пакет openvpn. login - файл конфигурации /etc/pam.d/login
client-cert-not-required #не использовать аутентификацию по сертификатам

Сохраняем файл и стартуем openvpn, проверяем, что появился виртуальный интерфейс.
image003
Для того, чтобы мы могли выходить в Интернет через туннель необходимо сделать настройку iptables, а именно натить приватную сеть в туннеле во внешний ip-сервера:
iptables -t nat -A POSTROUTING -s 192.168.111.0/24 -o eth0 -j SNAT --to-source <внешний ip>
Кроме того разрешим прохождение пакетов в цепочке FORWARD
iptables -P FORWARD ACCEPT
Естественно, не забываем включить возможность маршрутизации через ядро Linux. 
Редактируем файл /etc/sysctl.conf, добавив строку net.ipv4.ip_forward=1. Применяем параметры ядра
sysctl -p
Переходим к клиенту. Скачиваем openvpn-клиент с официального сайта и устанавливаем. Что отрадно, установка проходит без проблем на Windows Server 2012.
В каталоге %SystemRoot%:\Program Files\OpenVPN\config\ создаем файл client.ovpn со следующим содержанием:
client
dev tun
proto tcp
remote 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
auth-user-pass
comp-lzo
verb 3
route-method exe
route-delay 2

Скачиваем сертификат ca.crt с сервера и кладем его в ту же директорию, где конфиг клиента.
Запускаем клиент, открываем настройки и указываем параметры, необходимые для работы через прокси.
image009
Подключаемся, выскакивает окошко для ввода логина/пароля, где мы вводим системную учетную запись. При положительной аутентификации соединение устанавливается,на компьютере активируется виртуальный интерфейс
image005
необходимые маршруты добавляются в таблицу маршрутизации клиентского ПК через этот виртуальный интерфейс. Команда netstat -nr покажет текущую таблицу Вашего ПК.
image007
Во второй строчке после маршрута по умолчанию как раз и был внешний ip, к которому мне необходимо было подключаться для доступа к моему рабочему ПК.
ВСЕ! я смог подключиться к своему ПК через RDP(через тот самый внешний ip, который я указывал в начале этой записи)

Регистрация телефонов Cisco 7942, 7962 через VPN Anyconnect на CCME

У Cisco в линейке телефонов есть несколько моделей (7942, 7962), которые могут подключаться через SSL VPN к вашему VPN-шлюзу через Интернет и регистрироваться на Cisco Call Manager Expreess, расположенном внутри вашей сети (далее CCME). CCME — это IP-ATC, которая конфигурируется на роутерах Cisco.

Когда это нужно?

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

Большинство документов на сайте Cisco рассматривают вариант подключения телефонов через Cisco ASA и регистрации телефонов на CUCM — другого решения Cisco в области IP-телефонии. Мы же рассмотрим более бюджетный вариант, когда в нашем распоряжении имеется только роутер Cisco, например Cisco 2811. На нем создадим конфигурацию SSL VPN, сделаем базовую настройку CCME и увяжем работу сервисов вместе.

Настройка Anyconnect VPN на роутере Cisco.

На роутере установелен ios с поддержкой VPN и Voice свойств c2800nm-adventerprisek9-mz.151-4.M6.bin. Так как у нас ISR G1(первое поколение), то лицензий дополнительных, как в ISR G2, не требуется). Для моделей X9XX лицензии конечно же потребуются.

  1. Создадим новый trustpoint, который в дальнейшем будет использоваться в конфигурации SSL VPN. Trustpoint — это набор деклараций/настроек относительно сертификата CA(Удостоверяющего центра) и серверного сертификата роутера, которые будут использоваться для VPN.
    Генерируем ключевую пару, которая будет использоваться для создания локального CA.
    crypto key generate rsa label SSL-VPN modulus 1024
    crypto pki trustpoint SSL-VPN # объявляем имя trustpoint
    enrollment selfsigned # указываем, что сертификат будет самоподписанный
    subject-name cn=<ip-сервера или его DNS> # желательно указать внешний ip вашего VPN-шлюза или его DNS-имя
    revocation-check none # не использовать проверку валидности сертификата
    rsakeypair SSL-VPN # имя ключевой пары, которая будет использоваться для генерации сертификата

    Генерируем сертификат CA командой:
    crypto pki enroll SSL-VPN
    После этого в конфигурации роутера можно увидеть сгенерированный самоподписанный сертификат:
    crypto pki certificate chain SSL-VPN
    certificate self-signed 01
    3082033C 30840224 A0530201 02020101 300D0609 2A864886 F70D0101 05050030
    37311530 13060355 0403130C 37382E31 31312E35 312E3932 311E301C 06092A86
    4886F70D 01090216 0F626B75 72303031 2E736D74 702E617A 301E170D 31333037
    31313133 30333438 5A170D32 30303130 31303030 3030305A 30373115 30130603
    55040313 0C37382E 3131312E 35312E39 32311E30 1C06092A 864886F7 0D010902
    160F626B 75723030 312E736D 74702E61 7A308201 22300D06 092A8648 86F70D01
    01010500 0382010F 00308201 0A028201 0100A270 614D518B 3832863B 6DF4A44C
    2831AE14 5AB6FED5 6D00FBF6 FA72BC3F 0DEE5FD4 A23F925D CAB67E38 692C56E1
    74F4577E 1AB7AC0D 1AF3E5C8 AD4F032E 3CCD1341 F68B33E6 D7AC9E53 E42842C8
    C6DE9E58 8A17F2C2 0039E018 D958A6B8 2CBF02D3 58D950E9 6EBB385B 49406DE5
    11EA3FFB 7A3BDE7B 60B1D6D6 6DFFCE40 6AB97C73 CE122B84 374E1CC0 E521A7ED
    7C320888 A3EB3F45 A68B12B8 EA768A43 0D0F78AA 69CA664A 24FD7668 9875A06C
    4DA2D03F B4C54953 11DCE1D0 7C682DF1 A109D71E 8A689C96 0B9A9190 0458E9E8
    EF2D7226 996020B4 C35B4AC5 7E55EDAC A7B74A01 59C70AAC 687DBFD2 83494245
    A4F0ED22 7A0926C6 EB49EA57 985FDA39 8F7F0203 010001A3 53305130 0F060355
    1D130101 FF040530 030101FF 301F0603 551D2304 18301680 14135C07 AD5A7B49
    5BDC070F C52FE220 727F2373 74301D06 03551D0E 04160414 135C07AD 5A7B495B
    DC070FC5 2FE22072 7F237374 300D0609 2A864886 F70D0101 05050003 82010100
    68187A36 434FC432 09989E8D 40463850 275AB851 128EC049 63596307 D6008999
    F1397375 08845A12 232908C0 9CF177B1 46B81807 0412F603 42AAEFD7 574ABDAC
    FFDE0276 E14C22BC 31C4DAA8 FC7199C0 E158495B 26DF9DB9 7E883107 57B3BDED
    0810ECFA D78E4852 76A6BC6C C11E1671 13C12B57 0C9AEC17 0CB773EB F236DED5
    66B32D45 86C07F2E 97703285 F18BB5B6 66D48D77 0E968634 5555AC89 C8192130
    35BA1DBF 484C8CDD E4DA26AA 3B97F85E 8D99F5CE EFB146C2 F9DBD3D8 B6FCC117
    01A2EC16 28F7E791 E11C6B92 32D78FC4 1B447757 B06E7AA7 1960E210 0AA5CA9B
    CA34DB0F DA85C38E 65162F2A 5D7E369A 3EB9B0B2 0F5FC8B1 6276AEBF 27D841AC
    quit
  2. При подключении клиенты и телефоны должны получать ip-адреса из определенного нами приватного пула адресов , которые будут использоваться ими для адресации виртуального VPN-интерфейса.Определяем пул:
    ip local pool VPN-POOL 192.168.135.20 192.168.135.190, где 192.168.135.20 - первый ip пула, 192.168.135.190 - последний ip пула
  3. Будем использовать локальную базу учетных записей роутера для аутентификации подключаемых клиентов и телефонов.
    aaa new-model
    aaa authentication login default local
    aaa authorization network default local
  4. Активируем WEBVPN на роутере cisco:
    webvpn gateway TEST-VPN
    ip address port 443 # указываем внешний ip нашего роутера
    ssl trustpoint SSL-VPN # указываем trustpoint, который будет использоваться для установления SSL-подключений
    logging enable # активируем логирование
    inservice # активируем VPN
  5. Определяем контекст и политику для SSL VPN
    webvpn context POLICY
    policy group MY-POLICY # задаем имя политики
    functions svc-enabled # разрешаем туннельные подключения к роутеру по SSL. Кто не знает, есть возможность подключения через браузер к порталу, так называемый Webvpn.
    banner «Welcome to OUR LAN» # баннер, который будет всплывать у клиентов при подключении(можно не использовать)
    svc address-pool «VPN-POOL» netmask 255.255.255.0 # указываем пул, из которого будут выделяться ip телефонам и подключаемым клиентам
    default-group-policy MY-POLICY # определяем group-policy, которая будет использоваться по умолчанию
    aaa authentication list default # использовать локальную базу учетных записей для подключаемых телефонов и клиентов
    gateway TEST-VPN # определенный ранее VPN-шлюз
    inservice # активируем
    Проверяем статус webvpn:
    bkur001#show webvpn gatewayGateway Name Admin Operation
    ———— —— ———
    TEST-VPN up up
    bkur001#show webvpn context briefCodes: AS — Admin Status, OS — Operation Status
    VHost — Virtual HostContext Name Gateway Domain/VHost VRF AS OS
    ———— ——- ———— ——- —- ———
    POLICY TEST-VPN — — up upКак видим, у нас все корректно настроено и нормально функционирует.
    Также можно в браузере ввести https://<внешний ip-сервера>. Увидите картинку, похожую на эту.
    Попробуйте залогиниться с учетной записью, которая у вас есть на роутере

Загружаем на флэш роутера ПО для подключения VPN клиентов через туннельное подключение — anyconnect. Без него телефоны не смогут инициировать SSL-туннели.
copy tftp://192.168.1.100/anyconnect-win-3.1.01065-k9.pkg flash:
Указываем в настройках webvpn путь к файлу
webvpn install svc flash:/webvpn/anyconnect-win-3.1.01065-k9.pkg
На этом необходимый минимум для SSL VPN настроен

Приступим к настройке Call Manager Express

Относительно базовой настройки CME c автоматической регистрации телефонов в Интернете очень много статей, поэтому особо заострять внимание не будем.
telephony-service # включаем CME
max-ephones 25 # определяем максимально возможное количество телефонов, которое может зарегистрироваться на роутере
max-dn 35 # определяем максимальное количество номеров
ip source-address 192.168.135.200 port 2000 # указываем ip и порт, на котором CME будет слушать входящие подключения
max-redirect 5 # максимальное количество перенаправлений звонка
auto assign 5 to 10 # указываем, что с 5 по 10 номер(определим позже) можно автоматически назначать регистрирующимся телефонам
cnf-file location flash: # место хранения файлов конфигурации на флэше (может быть на стороннем tftp-сервере)
cnf-file perphone # для каждого телефона свой отдельный файл конфигурации
load 7942 SCCP42.9-3-1SR2-1S.loads # файлы прошивок подключаемых телефонов, указываются после того, как вы загрузите их на флэш
load 7962 SCCP42.9-3-1SR2-1S.loads # cisco
time-zone 34 # для отображения корректного времени необходимо указать time-zone
time-format 24 # Формат времени на телефонах
date-format dd-mm-yy # формат даты на телефонах
max-conferences 8 gain -6 # максимально возможное количество конференций
auto-reg-ephone # разрешаем автоматическую регистрацию телефонов (без аутентификации)

Определим диапазон внутренних номеров CME. Пусть это будут трехзначные номера, начинающиеся с 3, то есть 3XX.
ephone-dn 1 dual-line # dual-line означает, что каждому зарегистрированному телефону будет назначаться две линии(возможен прием двух звонков одновременно)
number 301
name First-VPN-ipphone
ephone-dn 2 dual-line
number 302
name TEST1
ephone-dn 5 dual-line
number 310
name TEST2
ephone-dn 6 dual-line
number 311
name TEST3

На всех ip-телефонах, как правило, присутствует этикетка с указанием его MAC-адрес. MAC-адрес телефона используется как средство идентификации телефона и сопоставления ему файла конфигурации, хранящегося в CME.
Зададим конфигурации для наших телефонов:
ephone 1
device-security-mode none # не будем использовать режим шифрования и аутентификации
description TEST1 # описание, чтобы не забыть на будущее
mac-address 24B6.57B1.4ACD # MAC-адрес с этикетки телефона
type 7962 # тип,модель телефона
button 1:1 # привязываем к первой софт-кнопке телефона ephone-dn 1 или номер 301
ephone 2
device-security-mode none
description TEST2
mac-address D4D7.4841.454F
type 7942
button 1:2

САМОЕ ГЛАВНОЕ — связать vpn anyconnect с CME!
voice service voip # переходим в режим глобальной конфигурации voip на роутере
vpn-group 1 # переходим в режим конфигурации VPN-группы
vpn-gateway 1 https://<внешний ip-роутера>/MY-POLICY # указываем vpn-шлюз для подключения телефонов (MY-POLICY - имя политики, которую мы конфигурировали в первом этапе)
vpn-trustpoint 1 trustpoint SSL-VPN leaf # указываем сконфигурированный ранее trustpoint

Выходим из режима конфигурирования VPN-группы.Задаем VPN-профиль для подключаемых телефонов:
vpn-profile 1 # переходим в режим конфигурирования профиля
authen-method both # для аутентификации будет использоваться и имя пользователя и пароль для аутентификации
host-id-check disable # если эту опцию включить, то телефон при подключении будет проверять, что CN или subjectAltName соответствует URL, по которому они подключаются.

Добавим маппинг между ранее сконфигурированными телефонами и созданными VPN-group и профилем, добавив в конфигурацию ephone следующие строчки:
vpn-group 1
vpn-profile 1

То есть конфигурация телефонов приобретает следующий вид:
ephone 1
device-security-mode none # не будем использовать режим шифрования и аутентификации
description TEST1 # описание, чтобы не забыть на будущее
mac-address 24B6.57B1.4ACD # MAC-адрес с этикетки телефона
type 7962 # тип,модель телефона
button 1:1 # привязываем к первой софт-кнопке телефона ephone-dn 1 или номер 301
ephone 2
device-security-mode none
description TEST2
mac-address D4D7.4841.454F
type 7942
vpn-group 1
vpn-profile
button 1:2

Зададим имя и пароль пользователя для аутентификации телефонов при подключении через anyconnect. Ранее на первом этапе конфигурации мы указывали, что будет использоваться внутренняя база учетных записей роутера. Для того, чтобы пользователь не мог зайти в консоль роутера для конфигурации назначим ему минимальные привилегии.
username vpnuser privilege 0 password 0 testtes
Переходим в режим конфигурации CME
telephony-service
и создаем файлы конфигурации для наших телефонов
create cnf-files
На этом настройка закончена!
Первое подключение телефона необходимо выполнить из внутренней сети — он загрузит файл конфигурации и подключится/зарегистрируется на CME. После этого телефон можно отдать работнику домой, где достаточно подключить телефон в сеть с выходом в Интернет. На этапе подключения по anyconnect понадобится через клавиатуру телефона ввести имя пользователя и пароль, после этого телефон успешно зарегистрируется.

FreePBX и TLS (SRTP)

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

Но можем ли мы доверять им????

Многие в последнее время озабачиваются развертыванием своей IP-ATS и при этом заботятся о безопасности своих разговоров….ну хотя бы со своими партнерами/заказчиками/между сотрудниками. Конфиденциальности можно добиться путем использования шифрования. В телефонии, как известно, протоколы взаимодействия можно условно разделить на два вида — протоколы сигнализации, которые указывают, куда отправить/смаршрутизировать звонок (SIP,H323 и т.п.) и протоколы передачи голоса — по факту это RTP и его производные.

Соответственно, целесообразно озаботится, как о конфиденциальности протокола сигнализации, так и (что более важно), о конфиденциальности переговоров.
Тут на помощь приходят два протокола SIP over TLS(для сигнализации) и SRTP(для голоса). И тот и другой были разработаны исключительно для обеспечения безопасности телефонии, причем не только для конфиденциальности. Многие задают вопрос — можно ли настроить работу FreePBX+Asterisk для поддержки SIP и как это сделать?
Ответ: ДА, можно и в этой статье я покажу, как это сделать!

Если Вы уже устанавливали ранее Asterisk + FreePBX, то знаете, что часть файлов конфигурации Asterisk заменяются soft ссылками на файлы конфигурации FreePBX, хранящиеся в директории web-сервера(как правило apache).
Например,
sip.conf -> /var/www/html/admin/modules/core/etc/sip.conf
Эти файлы нельзя редактировать вручную!!! только через FreePBX!
Для того, чтобы включить поддержку TLS и SRTP, нам необходимо:

  1. Создать ключевую пару и сертификат (или купить их для обеспечения доверия подключаемых клиентов сертификату)
  2. Установить библиотеку, обеспечивающую поддержку SRTP.
  3. Включить поддержку SRTP и TLS путем редактирования файлов конфигурации Asterisk, не затрагивая файлы конфигурации FreePBX.
  4. Настроить через FreePBX с указанием использования TLS и SRTP.

Подопытная ОС и Asterisk: CentOS 6.5, asterisk-1.8.20 из epel, freepbx 2.9.
Обо всем по порядку.
1) Я вообще покупал сертификат, но можно и не покупать, но в этом случае не могу гарантировать, что все SIP-клиенты без проблем подключатся к серверу. Например, в sip-клиенте под айфон Bria, необходимо явно отключать проверку сертификата на валидность, при включенной проверке — подключение не проходит. Коллега, который покупал Bria под windows, не нашел такой опции там, соответственно при отсутствии сертификата, предъявляемого сервером в корневом хранилище сертификатов Windows, подключения не произойдет.
На всякий случай, опишу процесс, как создать самоподписанный сертификат, который можно без проблем использовать в FreePBX.
openssl genrsa -out key.pem 2048 — создаем закрытый ключ длиной в 2048 бит
openssl req -new -key key.pem -out request.pem — создаем запрос на сертификат, на основании имеющегося закрытого ключа, указываем ip|DNS в качестве Common Name для запроса
openssl x509 -req -days 3650 -in request.pem -signkey key.pem -out certificate.pem — подписываем запрос и выпускаем сертификат с использованием ранее сгенерированного закрытого ключа.
Создаем директорию /etc/asterisk/keys
mkdir /etc/asterisk/keys
и копируем в нее certificate.pem и key.pem. Открываем для редактирования файл key.pem и копируем содержимое файла сертификата certificate.pem в него, то есть в key.pem будет и сертификат и закрытый ключ.Сертификат и ключ в файле выделяются следующими полями:
-----BEGIN CERTIFICATE-----
MIIDSjCCAjICCQCazxE0+2yezTANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJV
........содержание опущено.........
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAyXIiLWKcTR4QSJGl/fld9RHEBs0HnolRmcEVE2+0e1VO55b2
............содержание опущено.......
-----END RSA PRIVATE KEY-----

2) Устанавливаем библиотеку для поддержки SRTP.

yum -y install libsrtp

3) Включаем поддержку в Asterisk TLS и SRTP.
Для этого отредактируем файл sip_custom.conf следующим образом:
tlsenable = yes # включаем TLS
tlsbindaddr = 0.0.0.0 # порт TLS 5061 слушает на всех интерфейсах сервера
tlscertfile = /etc/asterisk/keys/key.pem # путь к файлу с ключом и сертификатом
tlscafile = /etc/asterisk/keys/ca.crt # путь к файлу сертификат центра сертификации (в нашем случае совпадает с сертификатом сервера)
tlsclientmethod = tlsv1 # протокол, по которому будут подключаться клиенты
tlscipher = DES-CBC3-SHA # алгоритм шифрования, можно использовать более стойкий
encryption=yes # включаем SRTP

Перезапускаем Asterisk:
service asterisk restart
Проверяем, что asterisk у нас слушает порт 5061 и на него возможно установить подключение tls.
lsof -i -n -P | grep asterisk
asterisk 42779 root 10u IPv4 2040555 0t0 TCP *:5061 (LISTEN)
openssl s_client -host 127.0.0.1 -port 5061
Если все ок, то соединение установится, то увидите содержимое своего сертификата.
[root@asterisk asterisk]# openssl s_client -host 127.0.0.1 -port 5061
CONNECTED(00000003)
depth=0 OU = Domain Control Validated, OU = PositiveSSL, CN = hobbyphone.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 OU = Domain Control Validated, OU = PositiveSSL, CN = hobbyphone.com
verify error:num=27:certificate not trusted
verify return:1
depth=0 OU = Domain Control Validated, OU = PositiveSSL, CN = hobbyphone.com
verify error:num=21:unable to verify the first certificate
verify return:1
..........весь вывод не привожу.........

Ну и на забываем открыть порт 5061 на iptables:
iptables -A INPUT -p tcp --dport 5061 -m state --state NEW -j ACCEPT

4) Подключаемся к web-интерфейсу FreePBX.
Переходим в Инструменты > Advanced Settings.
Включаем поддержку SRTP SIP encryption = YES.
Далее переходим в Конфигурация > Внутренние номера и создаем новый внутренний номер с указанием Transport = TLS Only(возможны более мягкие варианты настройки — ALL — TLS PRimary), Encryption = YES(SRTP Only)
Ну и пробуем подключиться с нашего SIP-клиента с поддержкой TLS.

Сразу скажу, что нормальных бесплатных SIP-клиентов с поддержкой шифрования мне найти не удалось, использовал BRIA под айфон. Если зайти в консоль asterisk (asterisk -rvvvvvvv) и посмотреть подключенные sip клиенты, то в характеристиках при корректной работе увидите следующее (часть вывода опускаю):

asterisk*CLI> sip show peer 777

* Name : 777
Secret : <Set>
Prim.Transp. : TLS
Allowed.Trsp : TLS
Def. Username: 777
SIP Options : (none)
Codecs : 0xe (gsm|ulaw|alaw)
Codec Order : (ulaw:20,alaw:20,gsm:20)
Auto-Framing : No
Status : OK (205 ms)
Useragent : Bria iOS 3.0.4
Reg. Contact : sip:777@XX.XX.XX.XX:49412;transport=TLS;ob
Qualify Freq : 60000 ms
Sess-Timers : Accept
Sess-Refresh : uas
Sess-Expires : 1800 secs
Min-Sess : 90 secs
RTP Engine : asterisk
Parkinglot :
Use Reason : No
Encryption : Yes

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

Решение проблем с MSTP на коммутаторах HP

В больших сетях, построенных на оборудовании HP зачастую проблематично найти устройство (иногда даже не HP), которые вызывает постоянное изменение устоявшейся топологии MSTP. Почему MSTP? На коммутаторах HP, в отличии от большинства коммутаторов Cisco в дефолтной конфигурации при включении STP (команда spanning-tree) активируется именно MSTP.
STP Enabled : Yes
Force Version : MSTP-operation
IST Mapped VLANs : 1-4094
Switch MAC Address : 0021f7-b05740
Switch Priority : 32768
Max Age : 20
Max Hops : 20
Forward Delay : 15

При этом создается MSTP instanse 0, в который «мапятся» все доступные vlan (1-4094).
Внешние признаки проблем с MSTP:

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

Как диагностировать, что проблемы именно с MSTP?
MSTP в отличие от классического STP в своей работе основывается на Rapid(быстрый) STP, соответственно, время конвергенции(сходимости) у него очень маленькое (на практике 1-2 секунды). Проблему можно увидеть, если посмотреть информацию о функционировании MSTP на любом из коммутаторов в сети командой show spanning-tree:
Topology Change Count : 1,320,303
Time Since Last Change : 5 sec

Как видим, количество изменений топологии очень большое. Если несколько раз ввводить команду на протяжении минуты и наблюдать постоянный рост счетчика Topology Change Count и сброс в ноль счетчика Time Since Last Change, то определенно у Вас проблемы в сети.
Рост Topology Change Count в стабильно работающей сети может происходить только:

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

Как же вычислить, где происходят изменения в сети, которые вызывают нестабильность в работе?:
Для этого на коммутаторах HP необходимо выполнить команду:
show spanning-tree debug-counters instance 0
MST Instance ID : 0

Counter Name Aggregated Value Collected From
——————————— —————- —————
Invalid BPDUs 0 Ports
Errant BPDUs 0 Ports
MST Config Error BPDUs 0 Ports
Looped-back BPDUs 0 Ports
Starved BPDUs 0 Ports
Exceeded Max Age BPDUs 0 Ports
Exceeded Max Hops BPDUs 0 Ports
Topology Changes Detected 27 Ports
Topology Changes Tx 2640615 Ports
Topology Changes Rx 1075984 Ports

Topology Change ACKs Tx 0 Ports
Topology Change ACKs Rx 0 Ports
TCN BPDUs Tx 0 Ports
TCN BPDUs Rx 0 Ports
CFG BPDUs Tx 0 Ports
CFG BPDUs Rx 0 Ports
RST BPDUs Tx 0 Ports
RST BPDUs Rx 0 Ports
MST BPDUs Tx 115207701 Ports
MST BPDUs Rx 7069166 Ports

где Topology Changes Detected — изменения топологии, зафиксированные непосредственно на портах коммутатора.
Topology Changes Tx — пересланные коммутатором сообщения об изменении топологии
Topology Changes Rx — полученные коммутатором сообщения об изменения топологии
На проблемном коммутаторе количество изменений толологии будет значительным, как здесь
Topology Changes Detected 185562 Ports
Для того чтобы определить с какого порта приходят BPDU, вызывающие такой эффект нужно использовать команду:
show spanning-tree debug-counters ports <номер порта> instance 0
Topology Changes Detected 185546 12/31/13 10:04:30
На портах, на которых проблемы отсутствуют, больших счетчиков, сравнимых с показанными выше, не будут(от единицы до сотни — все в норме).
В первую очередь информацию о Topology Changes Detected необходимо смотреть на портах, к которым подключены другие коммутаторы.
Выяснить, к каким портам подключены другие сетевые устройства, можно двумя способами:

    • с использованием протокола cdp.
    • с использованием протокола lldp.

show cdp neighbors

CDP neighbors information

Port Device ID | Platform Capability
—- —————————— + —————————- ————
2 00 15 77 d4 20 c0 |
22 kss2-opt-41-k355 | Cisco IOS Software, C3560… S
23 00 21 f7 bc 8c 00 | HP J8698A Switch E5412zl,… R S
24 00 26 f1 53 51 00 | ProCurve J9022A Switch 28..
Стоит заметить, что оборудование HP и Cisco неплохо «видят» друг друга и по CDP и по LLDP (LLDP, на мой взгляд, может считаться более стандартизированным по сравнению с CDP, который изначально был проприетарным Cisco).
В моем случае проблема была с устройством, находящимся за портом 2 — коммутатор Allied Telesys, к которому был подключен 3Com(доставшийся в наследство), который и вызывал постоянные изменения топологии MSTP из-за некорректной работы и по причине отсутствия протокола MSTP.
show cdp neighbors detail 2

CDP neighbors information for port 2

Port : 2
Device ID : 00 15 77 d4 20 c0
Address Type : IP
Address : 10.200.2.51
Platform :
Capability :
Device Port : g1
Version :
Кстати, CDP от Allied Telesys коммутаторы HP тоже понимают, но не полностью (в частности не показывает, модель и  ).

Как решить проблему?
Для разрешения ситуации временно можно поставить фильтрацию BPDU на необходимом порту командой:
spanning-tree 2 tcn-guard bpdu-filter, где 2 — номер порта.
Решение вопроса, естественно, временное, лучше использовать оборудование одного вендора в своей сети. Этим вы застрахуете себя от возможных проблем с конвергенцией STP/RSTP/MSTP.
С Наступающим!!!

Amazon Cloud Watch и мониторинг ОЗУ, SWAP, дискового пространства в Linux AMI

Те администраторы, которые эксплуатируют решения от Amazon, знают, что при создании нового EC2-инстанса, автоматом создаются задания по мониторингу основных характеристик виртуального сервера, таких как загрузка CPU, использование сетевого интерфейса, I/O жесткого диска и т.п., но нет мониторинга ОЗУ, SWAP, дискового пространства, а это, согласитесь, достаточно важные параметры.
Amazon предупредил ситуацию, когда администраторы начнут задавать вопросы относительно возможности мониторинга вышеуказанных параметров и выложил мануал, с указанием, как можно реализовать этот мониторинг Инструкция на английском и, на мой взгляд, не объясняет доходчиво все моменты. Я позволю себе постараться описать процесс настройки мониторинга ОЗУ, SWAP, дискового пространства на русском с описанием некоторых нюансов, с которыми столкнулся в процессе работы.
Если в двух словах, то мониторинг осуществляется запуском perl-скрипта по cron, который считывает необходимые параметры серверы и выгружает показаетели в Amazon Cloud Watch . Perl-скрипт запускается на самом сервере,который предполагается мониторить.
Итак приступим.
Установим необходимое ПО на сервер для возможности работы perl-скрипта, который нам предполагает Amazon. Сервер у меня под CentOS, соответственно по RedHAT,Suse, Amazon AMI все делается по аналогии.
yum install wget unzip perl-cpan perl-YAML make bzip2 perl-IO-Compress-Bzip2 perl-HTTP-Daemon-SSL
Переходим в корень нашей файловой системе
cd /
и заходим в консоль perl
# perl -MCPAN -e shell, в консоли выполняем команду установки LWP bundle
install Bundle::LWP5_837 LWP
На все вопросы установщика отвечаем yes. У меня с первого раза установка не закончилась положительно по причине неразрешенных зависимостей, который установщик perl не смог «подтянуть». Были следующие уведомления:
GAAS/HTML-Parser-3.71.tar.gz : make NO
GAAS/libwww-perl-5.837.tar.gz : make_test NO
PMQS/Compress-Raw-Zlib-2.063.tar.gz : make NO
PMQS/Compress-Raw-Bzip2-2.063.tar.gz : make NO
PMQS/IO-Compress-2.063.tar.gz : make_test NO
GAAS/HTTP-Message-6.06.tar.gz : make_test NO 2 dependencies missing (IO::Compress::Bzip2,IO::Uncompress::Bunzip2)
GAAS/HTTP-Negotiate-6.01.tar.gz : make_test NO
GAAS/HTTP-Daemon-6.01.tar.gz : make_test NO
GAAS/HTTP-Cookies-6.01.tar.gz : make_test NO
GAAS/libwww-perl-6.05.tar.gz : make_test NO

Соответственно, я искал менеджером пакетов yum необходимые пакеты perl и устанавливал их. В начале статьи я привел все,которые были необходимы мне для успешной работы perl-скрипта.
После успешной установки ПО скачиваем скрипт,распаковываем и переходим в директорию с основными файлами.
wget http://ec2-downloads.s3.amazonaws.com/cloudwatch-samples/CloudWatchMonitoringScripts-v1.1.0.zip
unzip CloudWatchMonitoringScripts-v1.1.0.zip
cd aws-scripts-mon

HELP очень информативен:
Usage: mon-put-instance-data.pl [options]

Collects memory, swap, and disk space utilization on an Amazon EC2
instance and sends this data as custom metrics to Amazon CloudWatch.

Description of available options:

—mem-util Reports memory utilization in percentages.
—mem-used Reports memory used in megabytes.
—mem-avail Reports available memory in megabytes.
—swap-util Reports swap utilization in percentages.
—swap-used Reports allocated swap space in megabytes.
—disk-path=PATH Selects the disk by the path on which to report.
—disk-space-util Reports disk space utilization in percentages.
—disk-space-used Reports allocated disk space in gigabytes.
—disk-space-avail Reports available disk space in gigabytes.

—aggregated[=only] Adds aggregated metrics for instance type, AMI id, and overall.
—auto-scaling[=only] Adds aggregated metrics for Auto Scaling group.
If =only is specified, reports only aggregated metrics.

—mem-used-incl-cache-buff Count memory that is cached and in buffers as used.
—memory-units=UNITS Specifies units for memory metrics.
—disk-space-units=UNITS Specifies units for disk space metrics.

Supported UNITS are bytes, kilobytes, megabytes, and gigabytes.

—aws-credential-file=PATH Specifies the location of the file with AWS credentials.
—aws-access-key-id=VALUE Specifies the AWS access key ID to use to identify the caller.
—aws-secret-key=VALUE Specifies the AWS secret key to use to sign the request.
—aws-iam-role=VALUE Specifies the IAM role name to provide AWS credentials.

—from-cron Specifies that this script is running from cron.
—verify Checks configuration and prepares a remote call.
—verbose Displays details of what the script is doing.
—version Displays the version number.
—help Displays detailed usage information.

Examples

To perform a simple test run without posting data to Amazon CloudWatch

./mon-put-instance-data.pl —mem-util —verify —verbose

To set a five-minute cron schedule to report memory and disk space utilization to CloudWatch

*/5 * * * * ~/aws-scripts-mon/mon-put-instance-data.pl —mem-util —disk-space-util —disk-path=/ —from-cron

For more information on how to use this utility, see Amazon CloudWatch Developer Guide at
http://docs.amazonwebservices.com/AmazonCloudWatch/latest/DeveloperGuide/mon-scripts-perl.html

Что сразу замечаем, так это то, что для публикации данных в web-консоль Amazon нам нужны учетные данные. Естественно, вы всегда можете использовать учетные данные Вашей административной учетной Amazon, но это очень плохо в плане безопасности и Amazon не рекомендует так делать. Для безопасной выгрузки данных нам потребуется воспользоваться сервисом Amazon AWS Identity and Access Management (IAM), который позволяет создать пользователей Amazon c ограниченными правами доступа к нашим сервисам на Amazon.
Подключаемся с использованием нашей учетной записи к Amazon и переходим в Security Credentials, появляется такое всплывающее окошко image001
где мы выбираем «Get Started With IAM Users»
image003
Далее Create New Users
Вводим имя пользователя, которое хотим использовать:
image005
Получаем уведомление, что пользователь успешно создан, закрываем это окно:
image007
Ставим галочку напротив нашего пользователя, переходим на вкладку Permissions, нажимаем Attach User Policy
image009
Выбираем нужный нам шаблон политики CloudWatch Full Access, который будет позволять читать и публиковать данные с CloudWatch.
image011
Опять ставим галочку напротив нашего пользователя и переходим на вкладку Security Credentials, нажимаем на кнопку Manage Access Keys, далее Create Access Key. Сгенерированный ключ необходимо загрузить к себе на компьютер в безопасное место, он будет представлять собой csv-файл с Access Key ID и собственно с уникальной последовательностью символов(закрытым ключом).Копируем эти значений в файл на вашем сервере aws-scripts-mon/awscreds.conf
AWSAccessKeyId=<Ваш ID>
AWSSecretKey=<Ваш закрытый ключ>
Все можно проверять работу!
./mon-put-instance-data.pl --aws-credential-file=./awscreds.conf --mem-util --mem-used --mem-avail
Successfully reported metrics to CloudWatch. Reference Id: 6cd1f550-68e7-11e3-bf88-894ce6dbc2d3

Как видим, нам рапортовали, что все удачно опубликовано на Amazon.
Также можно считать данные о загрузке процессора, памяти, swap и дискового пространства с CloudWatch с использованием скрипта mon-get-instance-stats.pl
./mon-get-instance-stats.pl --aws-credential-file=./awscreds.conf

Instance i-44179008 statistics for the last 1 hour.

CPU Utilization
Average: 28.82%, Minimum: 19.02%, Maximum: 43.17%

Memory Utilization
Average: 36.84%, Minimum: 36.38%, Maximum: 37.55%

Swap Utilization
Average: 0.81%, Minimum: 0.81%, Maximum: 0.81%

Disk Space Utilization for /dev/xvde mounted on /
Average: 9.53%, Minimum: 9.52%, Maximum: 9.53%

Посмотрим, что изменилось в web-консоли CloudWatch.
image013
Как видим, добавился новый пункт в левой панели Linux System. В основном поле(справа) можно посмотреть метрики, которые снимаются и построить графики для возможности просмотра динамики.
Для автоматического периодического снятия параметров состояния ОЗУ, SWAP и дискового пространства и публикации этих параметров в CloudWatch добавим следующее задание cron(информация будет сниматься каждые две минуты).
crontab -e
*/2 * * * * /home/distr/aws-scripts-mon/mon-put-instance-data.pl --aws-credential-file=/home/distr/aws-scripts-mon/awscreds.conf --mem-util --swap-util --disk-space-util --disk-path=/ --from-cron
Теперь состояние ОЗУ, SWAP и диска под контролем!)

CentOS 6.4 и неожиданные проблемы с системным временем

Коллеги, хочу поведать о неожиданной проблеме, с которой столкнулся на днях.
На прошлой неделе мне понадобилось кое-какие пакеты perl для работы одного приложения, при установке обновился glibc до версии 2.12-1.132. Ну обновился…и ладно.
Прошло несколько дней и я обнаружил, что задания cron стали выполнять на 4 часа раньше, то есть по UTC. Сразу проверил время на сервере. Да, время стало UTC. Полез в /etc/localtime и увидел
TZif2UTCTZif2UTC
UTC0

Почему так произошло, для меня загадка.
Для тех, кто не знает, как на CentOS изменять настройки timezone:
1) Редактируем файл /etc/sysconfig/clock следующим образом
ZONE="Europe/Moscow"
UTC=True

Соответственно вы выбираете свою зону. Как выбрать правильное название для своей временной зоны. Я использую tzselect. Ниже пример использования:
# tzselect
Please identify a location so that time zone rules can be set correctly.
Please select a continent or ocean.
1) Africa
2) Americas
3) Antarctica
4) Arctic Ocean
5) Asia
6) Atlantic Ocean
7) Australia
8) Europe
9) Indian Ocean
10) Pacific Ocean
11) none - I want to specify the time zone using the Posix TZ format.
#? Europe
Please enter a number in range.
#? 8
Please select a country.
1) Aaland Islands 18) Greece 35) Norway
2) Albania 19) Guernsey 36) Poland
3) Andorra 20) Hungary 37) Portugal
4) Austria 21) Ireland 38) Romania
5) Belarus 22) Isle of Man 39) Russia
6) Belgium 23) Italy 40) San Marino
7) Bosnia & Herzegovina 24) Jersey 41) Serbia
8) Britain (UK) 25) Latvia 42) Slovakia
9) Bulgaria 26) Liechtenstein 43) Slovenia
10) Croatia 27) Lithuania 44) Spain
11) Czech Republic 28) Luxembourg 45) Sweden
12) Denmark 29) Macedonia 46) Switzerland
13) Estonia 30) Malta 47) Turkey
14) Finland 31) Moldova 48) Ukraine
15) France 32) Monaco 49) Vatican City
16) Germany 33) Montenegro
17) Gibraltar 34) Netherlands
#? 39
Please select one of the following time zone regions.
1) Moscow-01 - Kaliningrad 10) Moscow+05 - Lake Baikal
2) Moscow+00 - west Russia 11) Moscow+06 - Lena River
3) Moscow+00 - Caspian Sea 12) Moscow+06 - Tomponsky, Ust-Maysky
4) Moscow+00 - Samara, Udmurtia 13) Moscow+07 - Amur River
5) Moscow+02 - Urals 14) Moscow+07 - Sakhalin Island
6) Moscow+03 - west Siberia 15) Moscow+07 - Oymyakonsky
7) Moscow+03 - Novosibirsk 16) Moscow+08 - Magadan
8) Moscow+03 - Novokuznetsk 17) Moscow+08 - Kamchatka
9) Moscow+04 - Yenisei River 18) Moscow+08 - Bering Sea
#? 2

The following information has been given:

Russia
Moscow+00 — west Russia

Therefore TZ=’Europe/Moscow’ will be used.
Local time is now: Wed Dec 18 12:53:43 MSK 2013.
Universal Time is now: Wed Dec 18 08:53:43 UTC 2013.
Is the above information OK?
1) Yes
2) No
#? 1

You can make this change permanent for yourself by appending the line
TZ=’Europe/Moscow’; export TZ
to the file ‘.profile’ in your home directory; then log out and log in again.

Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
Europe/Moscow
Конечно, мы не будем пользоваться рекомендациями о временном изменении timezone.

2) После внесения изменений в конфигурацию /etc/sysconfig/clock, применим их командой tzdata-update
3) Проверка:
# date
Wed Dec 18 13:13:03 MSK 2013

Будьте внимательны с системным временем!

SWAP из файла в Linux на Amazon EC2

Коротенькая заметочка про SWAP. Для чего он используется, можете почитать в википедии.
Думаю, часты ситуации, когда люди решают попробовать Amazon в качестве хостера и начинаю с тарифа Micro-instance, который бесплатен, но включает в себя минимальные ресурсы. Попробовали…понравилось, решили перейти на более производительный тариф. При смене тарифа для одного и того же инстанса, стоит помнить, что дисковое пространство автоматически не изменяется, его нужно расширять вручную. Опишу, как это делается в другой статье. В этой же опишу, как добавить SWAP, который отсутствует в Micro-instance, соответственно вы невольно наследуете это свойство.
SWAP может быть в виде блочного устройства, в виде LVM или в виде специального файла. Мы пойдем по самому простому пути, создадим SWAP в виде специального файла(хотя естественно, можно пробросить дополнительное блочное устройство в Ваш инстанс).
ИТАК:
1) В medium-instance присутствует 3,6Гб. Создаем файл, который будет в дальнейшем использоваться как SWAP, размером не меньшим, чем ОЗУ — 4 Гб.
dd if=/dev/zero of=/swap bs=1M count=4000 ,
где of=/swap — место в файловой системе, где swap-файл будет создан
bs — размер блока в файле(выбрал 1Мб)
count — количество блоков.
Создание файла займет некоторое время. В моем случае не больше минуты.
На выходе увидите:
4000+0 records in
4000+0 records out
4194304000 bytes (4.2 GB) copied, 179.89 s, 23.3 MB/s

2) Создаем собственно SWAP
mkswap /swap
mkswap: /swap: warning: don't erase bootbits sectors
on whole disk. Use -f to force.
Setting up swapspace version 1, size = 4095996 KiB
no label, UUID=eed8e0c5-94ac-4e84-a5e5-6454e8c88226

3) Включаем SWAP и проверяем его наличие в системе
swapon /swap
free
total used free shared buffers cached
Mem: 3717180 3625648 91532 0 68208 2575172
-/+ buffers/cache: 982268 2734912
Swap: 4095992 0 4095992

4) Редактируем /etc/fstab, добавив следующую строку в конец файла. Это позволит включать swap-файл при старте системы
/swap swap swap defaults 0 0
5) Можно проверить, что при старте системы, swap «поднимется» выключив и его и активировав его обратно из настроек /etc/fstab.
swapoff /swap
swaponn -a
free
total used free shared buffers cached
Mem: 3717180 3625648 91532 0 68208 2575172
-/+ buffers/cache: 982268 2734912
Swap: 4095992 0 4095992

Все приведенное выше справедливо для Red Hat, CentOS, Red Hat-подобных ОС(в том числе, применяемых на Amazon),Oracle Linux.

Strongswan и Cisco VPN клиент с аутентификацией по сертификатам

Возникла необходимость в одном моем проекте настроить возможность подключения клиентов по ipsec vpn к удаленному серверу для выхода через него в Интернет. Для чего, спросите Вы. Как известно, в настоящее время существует множество сервисов, которые предоставляют аналогичную услугу с использованием OpenVPN,PPTP и т.п. протоколов VPN. Реализации выхода в Интернет через ipsec встречаются, но реже. Видимо потому, что несколько сложнее настраиваются (Мое ИМХО).
Вообще IPSEC — стандартизованный протокол, даже семейство протоколов, которые развиваются и прогрессируют (например, недавно появился IKEv2). О его работе можно почитать в Интернет или RFC. Неплохое описание есть у Cisco.
Итак, почему необходимо было подружить Cisco VPN клиент и IPSEC сервер?
Потому что, IPSEC VPN клиент от Cisco прост и удобен в использовании, поддерживается на Win XP-7…но стоит заметить, что компания Cisco в 2013 году отказалась от его дальнейшего развития в пользу Cisco Anyconnect…но статья не об этом). Кроме того, cisco vpn client по дефолту встроен в мобильные устройства с поддержкой IOS, соответственно, если заработает с классическим VPN-клиентом под Windows, то есть большой шанс, что заработает и на мобильном устройстве (с Android все сложнее, по дефолту в Android 2.x поддерживается L2TP over Ipsec, возможно в 4.x что-то изменилось).
Почему выбор пал на Strongswan? До этого я неоднократно я использовал OpenSWAN преимущественно в site-to-site VPN между Linux и Сisco и вполне себе работал. Но при попытке использования его совместно с Cisco VPN клиент в логах была ошибка:
pluto[22583]: packet from :59834: size (1160) differs from size specified in ISAKMP HDR (1144)
Google не показал никакого более-менее внятного решения указанной проблемы, но радостно выдал результаты по stronswan, таким образом, решение было принято.

Приступим!
Инсталлировать будем, как обычно на CentOS.
Свежая версия(2013 года) Stronswan, есть в EPEL, да и на официальном сайте есть информация о том, что для RedHat-подобных ОС необходимо инсталлировать Strongswan из EPEL. У меня репозиторий был подключен, соответственно:
yum install strongswan
Основные конфигурационные файлы:
/etc/strongswan/ipsec.conf — непосредственно отвечает за конфигурацию подключений
/etc/strongswan/strongswan.conf — отвечает за глобальные параметры функционирования демона IPSEC.
Но для начала нам необходимо «поднять» удостоверяющий центр(CA), который будет использоваться для аутентификации клиентов IPSEC-сервером.
mkdir /ca
cd /ca
mkdir private
mkdir certs
mkdir crl
mkdir cacerts
mkdir newcerst
mkdir reqs

в директории создаем файл конфигурации openssl.cnf. В качестве прототипа использовал дефолтный файл конфигурации, находящий в CentOS в /etc/pki/tls.
vi openssl.cnf
Отражу изменения, остальное по дефолту:

dir = /ca # Where everything is kept
certs = $dir/newcerts # Where the issued certs are kept
crl_dir = $dir/crl # Where the issued crl are kept
database = $dir/index.txt # database index file.
#unique_subject = no # Set to 'no' to allow creation of
# several ctificates with same subject.
new_certs_dir = $dir/newcerts # default place for new certs.

certificate = $dir/cacerts/ca.crt # The CA certificate
serial = $dir/serial # The current serial number
crlnumber = $dir/crlnumber # the current crl number
# must be commented out to leave a V1 CRL
crl = $dir/crl.pem # The current CRL
private_key = $dir/private/ca.key# The private key
RANDFILE = $dir/private/.rand # private random number file

x509_extensions = usr_cert # The extentions to add to the cert
…….
[ v3_req ]

# Extensions to add to a certificate request

basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
#extendedKeyUsage = serverAuth ### — добавить эту строку только для выпуска сертификата сервера IPSEC. Необходим для возможности использования IKEv2 на базе WIN7.
#subjectAltName=IP: ### — добавить эту строку только для выпуска сертификата сервера IPSEC
Создаем приватный ключ CA и сертификат
openssl req -x509 -days 3650 -newkey rsa:2048 -keyout private/ca.key -out cacerts/ca.crt
Запомните пароль!!!Он Вам понадобится в дальнейшем для выпуска сертификатов!!!
На вопросы относительно содержимого сертификата(DN), отвечаем самостоятельно по свеому усмотрению. Желательно, чтобы CN соответствовало DNS-имени сервера, к которому в дальнейшем будут подключаться клиенты.
Создаем ключи и запрос на сертификат для сервера strongswan:
openssl req -nodes -newkey rsa:1024 -keyout private/serverkey.pem -out reqs/serverreq.pem
Подписываем запрос на сертификат с использованием закрытого ключа сервера(не забываем в openssl.cnf добавить указанные выше строки, после подписи убрать):
openssl ca -config ./openssl.cnf -in reqs/serverreq.pem -days 730 -out certs/servercert.pem -notext -extensions v3_req, где v3_req — указывает раздел конфигурации openssl.cnf, которая указывает, что добавить в запрос на сертификат до его подписи.
Итак, CA и серверный сертификат у нас готов, выпустим сразу сертификат для клиента.Все аналогично:
openssl req -nodes -newkey rsa:1024 -keyout private/adroidkey.pem -out reqs/androidcert.pem
openssl ca -config ./openssl.cnf -in reqs/androidcert.pem -days 730 -out certs/adnroidcert.pem -notext -extensions v3_req

Экспортируем закрытый ключ клиента, сертификат и сертификат CA в формат pkcs12 для установки в дальнейшем его на Windows или устройство с IOS. Не обращайте внимание на выбранное мною название, содержащее android…это был эксперимент)
openssl pkcs12 -export -inkey private/adroidkey.pem -in certs/adnroidcert.pem -name "host" -certfile cacerts/ca.crt -caname "strongSwan Root CA" -out android.p122
Запомните пароль, который укажете!!!
Сгенерируем также список отозванных сертификатов(он у нас пустой, но в будущем может пригодиться):
openssl ca -config ./openssl.conf -gencrl -out ./crl/crl.pem
Переходим в каталог /etc/strongswan
cd /etc/strongswan
Редактируем файл конфигурации strongswan.conf
# strongswan.conf - strongSwan configuration file
charon {
dns1 = 8.8.8.8 # - настройки DNS, которые будут "отдаваться" подключающегося клиенту
dns2 = 8.8.8.4 #
cisco_unity = yes # - поддержка возможности работы с Cisco VPN клиент
# number of worker threads in charon
threads = 16
filelog {
/var/log/charon.log { # - включение логирования в файл
# add a timestamp prefix
time_format = %b %e %T
# loggers to files also accept the append option to open files in
# append mode at startup (default is yes)
append = no
# the default loglevel for all daemon subsystems (defaults to 1).
default = 1
# flush each line to disk
flush_line = yes
}
}
#plugins {

#sql {
# loglevel to log into sql database
# loglevel = -1

# URI to the database
# database = sqlite:///path/to/file.db
# database = mysql://user:password@localhost/database
#}
#}

# …
}
pluto {
}
libstrongswan {
# set to no, the DH exponent size is optimized
# dh_exponent_ansi_x9_42 = no
}
Редактируем файл ipsec.conf. Обращаю ваше внимание, что файл чувствителен к отступам, знакам комментирования.
config setup
strictcrlpolicy=no -
conn %default # - дефолтная секция
keyexchange=ikev2 # - по умолчанию использовать ikev2
ike=aes256-sha1-modp1024! # - параметры хэширования и шифрования для первой фазы ipsec
esp=aes256-sha1! # - параметры хэширования и шифрования для второй фазы ipsec
dpdaction=clear # - Dead Peer Detection
dpddelay=300s
rekey=no
conn ios
keyexchange=ikev1 # -использовать ikev1
authby=xauthrsasig # - аутентификация с использованием сертификатов и дополнительно имени пользователя и пароля
xauth=server #- говорим, что наш Strongswan выступает в роли сервера при аутентификации Xauth
left=%defaultroute # - параметры шлюза по умолчанию для нашего сервера
leftsubnet=0.0.0.0/0 # - через ipsec-туннель для клиента доступен весь Интернет
leftfirewall=yes # - добавлять соответствующие исключения в настройка файрвола
leftcert=servercert1.pem # - имя файла сертификата сервера
right=%any # - не ограничиваем пользователей по ip-адресам, с которых возможно подключение
rightsourceip=10.144.3.0/24 # - выдаем клиентам в туннеле ip-адреса из указанной подсети
rightid="C=RU, st=Spb, O=ne-plati-za-it.ru, CN=*" # - поля сертификата, которые может предъявлять клиент для положительной аутентификации
pfs=no # - периодической смены ключа шифрования нет
auto=add # - добавлять автоматически при старте strongswan

Добавляем файл ipsec.secrets следующего содержания:
: RSA serverkey1.pem # - указываем имя файла ключа, который будет использовать openswan
aleks1 : XAUTH "<пароль>" # - логин/пароль для Xauth.

Копируем сертификат CA, сервера, ключ сервера и CRL в соответствующие директории в папке /etc/strongswan/ipsec.d.
Запускаем strongswan и добавляем его в автозагрузку.
service strongswan start
chkconfig strongswan on

Для того чтобы клиенты смогли через туннель выходить в интернет через ip сервера необходимо добавить правило в iptables:
iptables -A POSTROUTING -s 10.144.3.0/24 -o eth0 -j SNAT --to-source <ip-сервера>
Проверяем в логе /var/log/charon.log, что нет никаких критических ошибок.
Переносим полученный ранее ключ android.p12 на ПК с Windows с установленным Cisco VPN-клиент. Открываем Cisco VPN Client > Certificates > Import…
image004
Указываем путь к нашему контейнеру с сертификатом и закрытым ключом и пароль, который мы указывали на этапе экспорта ключа и сертификата в контейнера.
Если пароль верен, то увидим:
image006
Далее переходим на вкладку Connection Entries > NEW, заполняем
image008
и сохраняемся.
image002
После этого дважды кликаем на только что созданном подключении и вперед!
Если аутентификация по сертификатам пройдет, появится окошко для Xauth. Вводим свои учетные данные в него из ipsec.secrets.
image010
Если все хорошо, то замочек в правом нижнем углу экрана закроется.
Проверяйте доступ в Интернет.
В следующий раз рассмотрим настройку VPN с использованием ikev2.

CentOS6+NGINX+FastCGI+WordPress

Цель данной заметки — показать настройку nginx для работы с php в качестве самостоятельно web-сервера. В моем случае wordpress установлен и успешно работает с использованием apache.Рассматривать установку WordPress в этом посте я не буду.
Многим известно, что Nginx не работает с php «напрямую», так как отсутствует модуль, аналогичный модулю в Apache mod_php.
Соответственно, Nginx нужен посредник для работы с php-скриптами в виде Apache,FastCGI или SPAWN-FCGI. В качестве бэкенда выбрал FastCGI. SPAWN-FCGI я ставил тоже, в принципе разницы особой не увидел, только было несколько большее использование ОЗУ(причины не ясны).
Итак:
FastCGI присутствует в Epel, поэтому подключаем epel.
rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
Устанавливаем FastCGI:
yum -y install php-fpm
Как видим в процессе установки добавилось не так уж много файлов:
image002
Главный файл конфигурации:
/etc/php-fpm.conf
Конфигурация так называемого пула FastCGI /etc/php-fpm.d/www.conf, где можно задать ip и порт сервера, ограничения по подключаемым клиентам, количество дочерних процессов, настройки безопасности и т.п. Я оставил все по умолчанию, сервер будет запускаться на 127.0.0.1:9000.
Запускаем:
service php-fpm start
Проверяем наличие процесса:
image004
Видим, что слушается 9000 порт loopback интерфейса, запущен master-процесс от root и несколько дочерних процессов (форков) от имени apache (пользователя можно менять).
Переходим к установке и настройки nginx:
yum -y install nginx
Главный конфигурационный файл nginx /etc/nginx/nginx.conf
Добавил только использование сжатия gzip
gzip on;
gzip_min_length 1100;
gzip_buffers 64 8k;
gzip_comp_level 3;
gzip_http_version 1.1;
gzip_proxied any;
gzip_types text/plain application/xml application/x-javascript text/css;

Создаем конфиг virtual-host.
/etc/nginx/conf.d/host.conf
#Указываем upstream для доступа к php-скриптам:
upstream php {
# server unix:/var/run/php-fcgi.sock; # как видим, возможно подключение и через сокеты linux
server 127.0.0.1:9000;
}
server {
## Your website name goes here.
server_name host.local;
## Your only path reference.
root /var/www/wordpress; # - здесь путь к директории с wordpress
## This should be in your http block and if it is, it's not needed here.
index index.php;
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location / {
# This is cool because no php is touched for static content.
# include the "?$args" part so non-default permalinks doesn't break when using query string
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
#NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
include fastcgi.conf;
fastcgi_intercept_errors on;
fastcgi_pass php;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
}

Не забываем остановить apache, если он запущен и стартуем nginx.
service nginx start
Добавляем в автозагрузку FastCGI и nginx:
chkconfig php-fpm on
chkconfig nginx on