Установка и настройка OpenVPN в CentOS

Для начала делаем весьма неожиданный шаг – устанавливаем OpenVPN:

Создаем директорию для easy-rsa и копируем туда скрипты:

Если на этом этапе словили ошибку:
cp: cannot stat `/usr/share/openvpn/easy-rsa/2.0/*': No such file or directory

То у нас появляется две новости. Хорошая в том, что у нас свежая версия OpenVPN, т.к. судя по документации, easy-rsa был исключен из стандартного пакета OpenVPN, и теперь за ним нужно идти на GitHub:

Note that easy-rsa is no longer bundled with OpenVPN source code archives. To get it, visit the easy-rsa page on GitHub, or download it from our Linux software repositories.

а плохая новость в том, что у нас до сих пор нет easy-rsa. Поэтому мы идем на GitHub смотреть последние релизы:
https://github.com/OpenVPN/easy-rsa/releases/

В моем случае это 2.2.2, поэтому:

Генерация ключей

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

Или же пропустить этот шаг и указывать все данные непосредственно при генерации ключей.

Переименовываем стандартный конфиг OpenSSL в рабочей директории easy-rsa:

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

Генерируем приватный ключ CA:

Генерируем приватный ключ сервера:

Запускаем генерацию ключа Диффи-Хеллмана и уходим на перекур (либо просто долго ждем)

На этом этапе мы получили полный комплект ключей для сервера, которые нужно скопировать в каталог OpenVPN:

Убедитесь, что у вас именно 2048 битный dh-ключ, иначе копируйте файл dh1024.pem

Переходим к настройке OpenVPN

Копируем стандартный конфиг сервера в рабочую директорию:

Открываем его:

Здесь нужно убедиться, что указан верный ключ Диффи-Хеллмана (dh1024.pem или dh2048.pem)

Раскомментировать строки:

Если есть желание, что можно указать Google Public DNS вместо стандартных от opendns.com

Дальше открываем sysctl.conf

И включаем packet forwarding:

Сохраняем, закрываем, и применяем все изменения:

Переходим к настройке iptables

Разрешаем подключаться к серверу по 1194 порту

Заворачиваем трафик с openvpn на внешку

где:
eth0 – Интерфейс на внешку (интернет)
16.32.64.128 – Внешний IP сервера

Сохраняем правила:

Генерация ключей для клиентов

mcedit ~/ovpn/client.ovpn

прописываем в remote ip/домен сервера

Запускаем OpenVPN:

На этом этапе наш сервер полностью настроен.
Все необходимые клиенту файлы лежат в папке ~/ovpn, скачиваем их и можем подключаться к нашему серверу.

Firefox и самоподписанные сертификаты

Firefox начиная с 31 версии блокирует все сайты с самоподписанными сертификатами (self-signed certs) c кодом ошибки sec_error_extension_value_invalid. Понятно, что для тестовых серверов покупать сертификаты не разумно, а некоторый софт требует подключения именно через SSL. Так что приходится выходить из положения отключением данного нововведения.

Переходим на страницу about:config

И двойным кликом меняем значение переменной security.use_mozillapkix_verification на false

Первоначальная настройка CentOS 6.5

Обновляем пакеты

Устанавливаем wget

Устанавливаем и активируем EPEL репозиторий

Для начала ищем последнюю версию пакета:
http://pkgs.repoforge.org/rpmforge-release/
У меня это 0.5.3-1

Проверяем архитектуру:

В случае i686 скачиваем:

Если же это x86_64, то:

Устанавливаем GPG ключ

Проверяем загруженный пакет.
Для i686:

Для x86_64:

И если проверка прошла успешно (dsa sha1 md5 gpg OK), устанавливаем его:
Для i686:

Для x86_64:

С EPEL закончили.

Доустанавливаем полезный софт:

man – справочные страницы, см. “man man”
mc – Midnight Commander, файловый менеджер
htop – продвинутый монитор процессов. Замена стандартному top
ntp – демон для синхронизации локального времени с удаленным NTP-сервером
ntpdate – утилита для синхронизации времени
ntp-doc – документация для вышеупомянутых сервисов
bind-utils – набор утилит (dig, host и nslookup) для работы с DNS

Настраиваем NTPD:
Ставим ntpd в автозагрузку

Далее проверяем работает ли SELinux:

Если работает, то открываем конфиг selinux:

И меняем значение SELINUX с enforcing на disabled

Перезагружаемся

И радуемся.

P.S. Скорее всего здесь приведены не все “must have” утилиты и настройки, так что по мере обнаружения упущений эта заметка будет обновляться.

Поиск по содержимому файлов в linux

Небольшая заметка из разряда “чтобы не забыть”.

Комбинация find+grep для поиска строки в файлах:

/var/www/ – каталог в котором следует производить поиск
-type -f – указываем, что интересуют только файлы
-name “*.php” – указываем, что интересует только файлы с расширением php
string – строка которую ищем в файлах

dig: Получение всех DNS записей домена

DNS довольно хитрая штука, одна незначительная ошибка может устроить весьма увеселительный квест по её поиску. Так что при более-менее серьезных изменениях, либо при обнаружении неких “странностей” приходится много раз сверяться с тем, что по факту отвечает на запросы наш DNS-сервер (и наш ли сервер отвечает вообще). Для таких манипуляций незаменимой вещью является утилита dig.

Для начала стоит сказать, что dig, по неведомой причине, не доступен в CentOS “из коробки” (в отличии от FreeBSD), данная утилита входит в пакет bind-utils, который предварительно нужно установить:

помимо dig в данный пакет входят не менее полезные утилиты host и nslookup.

Стандартный запрос на вывод всех DNS записей конкретного домена выглядит следующим образом:

Здесь:
+nocmd – убирает заголовок с версией утилиты и выполняемой командой
yandex.ru – собственно домен, чьи записи мы пытаемся посмотреть.
any - указываем, что нужно вывести совершенно все типы записей (по умолчанию выводятся только А-записи)
+noall +answer – сначала мы говорим, что нужно скрыть все секции, а потом что нужно вывести секцию с ответом.

Вывод у такой команды примерно следующий:

Дополнительно можно использовать флаг “+multiline“, он отформатирует SOA запись в удобочитаемый вид и прокомментирует секунды в более понятных величинах:

Иногда, чтобы понять на какой сервер ведут текущие NS записи, нужно их запросить с корневого сервера. Например так:

Пример ответа:

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

HTTP запрос без ожидания ответа

Бывают ситуации когда необходимо запустить какой-нибудь скрипт и перейти к следующей задаче не дожидаясь от него ответа. Это может быть полезно, например, при запуске файла с “периодическими” задачами в окружении где cron недоступен (shared-хостинг), либо при ручном запуске “бесконечных” скриптов (отправили запрос > вывели сообщение о запуске).

В данном примере, мы открываем соединение с example.com на 80ом порту, и если соединение устанавливается – отправляем стандартный HTTP запрос с URI “/task.php”, после чего соединение сразу же закрывается.

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

Работа с cURL в PHP

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

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

В общем и целом стандартный запрос выглядит примерно так:

curl_init() – Инициализирует cURL сессию.
curl_setopt() – Устанавливает опции для cURL сессии.
curl_exec() – Выполняет запрос с установленными ранее параметрами.
curl_close() – Закрывает сессию.

Опции так же можно задать массивом:

В зависимости от типа задачи и окружения в котором будет использоваться код, может быть полезна проверка на наличие необходимого расширения (curl.so):

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

Примерно так:

Ну и пример вывода функции curl_getinfo():

Старт

Всем привет!

С помпой и шампанским открываю новый (точнее очередной) блог. Для меня он в первую очередь является местом, где можно складировать интересные мысли, идеи, удачные решения, разные howto, и другие нескончаемые потоки информации так или иначе относящиеся к моей работе и IT в целом.

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