Rating@Mail.ru
IPB
Etersoft - from Windows to Linux
Etersoft
решения для перехода
с Windows на Linux
Дружественные сайты: alv.me и Rus-Linux.net

Здравствуйте, гость ( Вход | Регистрация ) Поиск · 

Профиль
Фотография
Опции
Опции
О себе
kasak не указал(а) ничего о себе.
Личная информация
kasak
Коренной житель
30 от роду
Мужской
Москва
Дата рождения: Март-20-1987
Интересы
Нет данных
Другая информация
Операционная система: OpenBSD
JID: Нет данных
Город: Нет данных
Статистика
Регистрация: 27-May 06
Просмотров профиля: 9852*
Последнее посещение: 24th January 2018 - в 08:03
Часовой пояс: Feb 25 2018, в 19:57
880 сообщений (0.21 за день)
Контактная информация
AIM Нет данных
Yahoo Нет данных
ICQ 227786581
MSN Нет данных
Contact E-mail скрыт
* Просмотры профиля обновляются каждый час

kasak

Участники


Темы
Сообщения
Друзья
Содержимое
16 Jan 2018
Вместо предисловия:
config.py:
Цитата
# NOTE: This is NOT recommended for production use, only for debugging
# or testing. Production installations should be run as a WSGI application
# behind Apache HTTPD.


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

В статье я разложу по полочкам, что да как делается.

Для работы мы будем использовать ОС OpenBSD.

Нам понадобятся следующие пакеты:
Код
pkg_add apache-httpd ap2-mod_wsgi postgresql-server py-pip py-virtualenv bash


Все остальные нужные пакеты потянутся к этим пакетам как зависимые.

После чего нам потребуется скачать самую свежую версию pgadmin4 отсюда: https://www.pgadmin.org/download/pgadmin-4-python-wheel/
На момент написания статьи это файлик pgadmin4-2.1-py2.py3-none-any.whl

Теперь незнающему человеку следует понять, что мы собирается делать. Pgadmin-это веб приложение! И сборки, доступные на сайте или в дистрибутивах, это на самом деле интерфейс, который всё равно будет открывать веб приложение.
В следующих шагах мы создадим для пгадмина виртуальное окружение на базе питона (virtualenv), и в это виртуальное окружение установим пгадмин. У пгадмина должна быть своя папка с данными, в которую он будет записывать информацию. Это тоже будет рассмотрено дальше. Может быть на этом этапе всё звучит сложно, но это не так, и я надеюсь дальше станет понятнее.

Для того, чтобы создать виртуальное окружение, нам нужно найти место, где файловая система смонтирована с флагом wxallowed, иначе питон не запустится. (Эта часть разумеется касается только OpenBSD, для Linux можно сразу переходить к созданию виртуального окружения) У нас есть несколько путей решения данного вопроса:
1) Установить pgadmin прямо в /usr/local. Плюсы: ничего не надо править в fstab. Минусы: разводим мусор в системе.
2) Смонтировать /home с флагом wxallowed, как самый тостый раздел и поставить pgadmin туда. Плюсы: не очень сильно замусорим систему. Минусы: небольшая дыра в безопасности.
3) На мой взгляд, самый идеальный способ: добавить в систему диск, откусить от него маленький кусочек под pgadmin и смонтировать этот раздел например на /opt, и туда поставить pgadmin. Плюсы: вообще не замусорена система, дыры в безопасности минимизированы. Минусы: расточительное использование диска.

В данный момент у меня /home смонтирован с флагом wxallowed и можно работать на этой базе.
Создадим виртуальное окружение:
Код
cd /home
virtualenv pgadmin4


Если проблем нет, вы увидите сообщение, что в виртуальное окружение установлен python, pip и прочие прелести.
Теперь, чтобы работать с этим окружением, нам нужно взять его системные переменные. К сожалению, эта фича работает только в bash, поэтому сначала запустим баш, а из него окружение:
Код
bash
source ./pgadmin4/bin/activate


Мы увидим, что в строке приглашения появилось название окружения. В него нужно установить пгадмин, вот таким незатейливым образом (подразумевается что whl файлик уже скачан и лежит в домашней директории юзера kasak):
Код
pip install ~kasak/pgadmin4-2.1-py2.py3-none-any.whl


Готово. Само приложение установлено, давайте теперь настроим pgadmin. Ему нужна папка, в которую он может писать логи и сессии, и поскольку он будет запускаться апачем, доступ к этой папке должен быть у апача. Давайте создадим эту папку например в /var/www, раз уж там лежит всё связанное с апачем.
Код
mkdir /var/www/pgadmin4


Следующим шагом давайте создадим файл конфигурации для пгадмин. Для этого перейдям в директорию его установки:
Код
cd /home/pgadmin4/lib/python2.7/site-packages/pgadmin4/


В этой директории уже находятся файлы config.py и config_distro.py, их трогать мы не будем, а как и положено по инструкции создаём свой конфиг config_local.py со следующим содержимым:
Код
# cat config_local.py                                                                                                                                                                                              
LOG_FILE = '/var/www/pgadmin4/pgadmin4.log'
SQLITE_PATH = '/var/www/pgadmin4/pgadmin4.db'
SESSION_DB_PATH = '/var/www/pgadmin4/sessions'
STORAGE_DIR = '/var/www/pgadmin4/storage'


Теперь когда конфиг готов, нужно запустить setup.py:
Код
python setup.py

Сетап попросит нас ввести e-mail и пароль для доступа к pgadmin. Придумываем и вводим. Обратите внимание, что это не то же самое, что логин и пароль от postgresql, как было например в phpmyadmin, когда для доступа мы использовали логин и пароль самой базы, данный логин будет служить для доступа именно в пгадмин через веб интерфейс.

Теперь можно деактивировать наше окружение, и выйти из баша, кому больше нравится ksh:
Код
deactivate
exit


Сейчас наш пгадмин готов к работе, нужно лишь подружить с ним апача. Для этого, прежде всего, не забудьте изменить владельца директории куда пгадмин пишет данные:
Код
chown -R www:www /var/www/pgadmin4


Владельца /home/pgadmin4 менять не нужно, он может оставаться кем захочет.

В OpenBSD апач по дефолту читает conf файлики в директории /var/www/conf/modules
для включения mod_wsgi можем создать там файл например wsgi.conf с содержимым:
Код
# cat /var/www/conf/modules/wsgi.conf                                                                                                                                                                              
LoadModule wsgi_module /usr/local/lib/apache2/mod_wsgi.so


Теперь нужно настроить virtualhost с нужными опциями.
Поскольку я сейчас работаю с пустым, коробочным конфигом апача, для начала я раскоментирую эту строку в httpd.conf:
Код
# cat /etc/apache2/httpd2.conf | grep vhosts
Include /etc/apache2/extra/httpd-vhosts.conf

по умолчанию она закоментирована.
а в httpd-vhosts.conf нужно создать вихост вот с такими параметрами:

Код
<VirtualHost *:80>
    ServerName foo

    WSGIDaemonProcess pgadmin processes=1 threads=25 python-home=/home/pgadmin4
    WSGIScriptAlias / /home/pgadmin4/lib/python2.7/site-packages/pgadmin4/pgAdmin4.wsgi

    <Directory /home/pgadmin4/lib/python2.7/site-packages/pgadmin4>
        WSGIProcessGroup pgadmin
        WSGIApplicationGroup %{GLOBAL}
        Require all granted
    </Directory>

</VirtualHost>


Вот на этом месте читателю следует быть предельно осторожным! Внимательно, и ещё более !!!внимательно!!! Смотрите на пути которые прописываете. Путь довольно таки длинный, и можно упустить какую-нибудь циферку. Если проверили трижды, проверьте четырежды. Если есть сомнения, делайте pwd из директории с пгадмином и копируйте. Если всё ещё что-то не работает, смотрите лог в /var/www/logs/error_log
Если всё пошло по плану, то в браузере мы увидим приглашение к вводу емейла и пароля для пгадмин. Залогинившись, нужно в пгадмин прописать сервер postgresql, с которым будем работать.

Я надеюсь что описал всё дотошно и достаточно понятно чтобы начать работу с pgadmin. Буду очень рад если помог вам в освоении postgresql.
12 Mar 2017
Привет любимый юниксфорум!
Я заметил что даже в официальной документации к zimbra https://wiki.zimbra.com/wiki/Installing_a_L...SSL_Certificate
не сказано как автоматизировать процесс обновления сертификата для неё.
Хочу предложить очень простой способ, полностью основанный на этой же документации.
На самом деле опытному админу всё это нафиг не нужно, но вдруг кому-то сгодится.
Обратите внимание речь идёт о standalone версии!

Вот собственно сам скриптик:

Код
su -l zimbra -c "zmproxyctl stop"
su -l zimbra -c "zmmailboxdctl stop"
certbot renew
cp -rL /etc/letsencrypt/live/somesite.ru ./
chmod -R a+w ./somesite.ru
cat identrust.pem >> somesite.ru/chain.pem
cp somesite.ru/privkey.pem /opt/zimbra/ssl/zimbra/commercial/commercial.key
su zimbra -c "/opt/zimbra/bin/zmcertmgr deploycrt comm somesite.ru/cert.pem somesite.ru/chain.pem"
su -l zimbra -c "zmcontrol restart"


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

Поскольку certbot хранит все сертификаты в папке archive, а в live он делает просто ссылочки, нам нужно скопировать live так, чтобы ссылочки стали реальными файлами. опция L нам в этом поможет.

Далее нужно дать полный доступ к папке с сертификатами. Делается это потому что зимбровский zmcertmgr очень любит зачем-то оставлять бекапы старого сертификата в файле cert.pem.orig.

Шестая строчка добавляет в цепочку сертификат identrust. Если посмотреть настоящую цепочку сертификатов, то увидим, что корневой центр letsencrypt подписан как раз таки этим сертификатом. certbot его в файл chain почему-то сам не добавляет
а zmcertmgr ругается если этого не сделать. identrust.pem имеет вид:

Spoiler:
-----BEGIN CERTIFICATE-----
MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow
PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O
rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq
OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b
xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw
7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD
aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG
SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69
ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr
AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz
R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5
JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo
Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
-----END CERTIFICATE-----

и берется из: https://www.identrust.com/certificates/trus...ownload-x3.html

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

В таком виде в каком скрипт написан он конечно рассчитан на запуск вручную.
Можно легко переделать это для запуска через cron, указав абсолютные пути для копирования папки с сертификатами, или вообще никуда не копировать а работать прямо в /etc/letsencrypt/live/
Но я не рекомендую так делать, потому что перезапуск зимбры весьма длительный и трудоёмкий процесс. Даже на относительно новом ксеончике это делается довольно медленно. Зачем оставлять людей без почты пусть даже и на 5 минут впустую?
Вам в любом случае на электронную почту придёт сообщение что сертификат истекает, тогда и запустите скрипт вручную. Разок в 3 месяца этим можно занятся.

Запускать можно через sudo в домашней директории пользователя.

Так же обратите внимание что я использую certbot. Ибо зачем городить огород со скачиванием каких-либо скриптов (letsencrypt-auto), если certbot можно легко установить из родного пакетного менеджера любой системы.

Так же обратите внимание что данный скрипт можно феерично превратить в скрипт для автоматической установки сертификатов letsencrypt туда, где их ещё нет совсем.

Для этого меням третью строчку на
Код
certbot certonly --standalone -d example.com
где example.com - интересующий домен. если их несколько то надо несколько раз указать -d example.com -d www.example.com

Во время первого запроса сертификата система спросит email адрес администратора.

That's all, folks!
27 Sep 2016
Под руку попался довольно популярный упс APC Back-UPS ES 550. Кроме мини сервера в него включён аквариум с рыбками. И хотелось бы знать если выключается свет, чтобы реактивно принять меры по спасению рыбок.
Для этого планировал изначально применить apcupsd однако как оказалось в последних версиях OpenBSD применили новый драйвер upd благодаря которому можно обойтись штатными средствами системы для мониторинга.
Минус заключается в том что нештатными средствами воспользоваться уже будет нельзя. Ну да ладно, для достижения наших планов родного sensorsd вполне хватит.
Первое что нужно сделать это понятное дело включить упс и воткнуть его usb кабелем в нашу прекрасную OpenBSD систему.
смотрим на появившиеся датчики:
Код
$ sysctl hw.sensors.upd0
hw.sensors.upd0.indicator0=On (BatteryPresent), OK
hw.sensors.upd0.indicator1=Off (Charging), OK
hw.sensors.upd0.indicator2=Off (Discharging), OK
hw.sensors.upd0.indicator3=Off (NeedReplacement), OK
hw.sensors.upd0.indicator4=Off (ShutdownImminent), OK
hw.sensors.upd0.indicator5=On (ACPresent), OK
hw.sensors.upd0.indicator6=Off (Overload), OK
hw.sensors.upd0.percent0=100.00% (RemainingCapacity), OK
hw.sensors.upd0.percent1=100.00% (FullChargeCapacity), OK
hw.sensors.upd0.timedelta0=757.000000 secs (RunTimeToEmpty), OK

Теперь в sensorsd.conf нам нужно настроить поведение сенсоров (обратите внимание на то что некоторые сенсоры "нормально выключены" а некоторые "нормально включены"

/etc/sensorsd.conf:

Код
hw.sensors.upd0.indicator3:low=1:high=0:command=echo "Need to ReplaceBattery sensor: %2" | mail -s "Sensor %t changed" -r noreply@*** kasak@***
hw.sensors.upd0.indicator4:low=1:high=0:command=echo "Sensor ShutdownImminent changed: %2" | mail -s "Sensor %t changed" -r noreply@*** ***@gmail.com ; halt -p
hw.sensors.upd0.indicator5:low=0:high=1:command=echo "Who turn %2 the lights?"  | mail -s "Sensor %t changed" -r noreply@*** ***@gmail.com
hw.sensors.upd0.indicator6:low=1:high=0:command=echo "Reactor overloaded! Sensor %2" |  mail -s "Sensor %t changed" -r noreply@*** kasak@***

первая строка - третий индикатор need replacement, просто шлём письмо на любой свой ящик (можно и локальный) о необходимости замены батареи
вторая строка - shutdown imminent. Упс посылает сигнал о том что выключение неминуемо и нужно срочно выключается. Шлём письмо на нелокальный ящик и выключаемся.
третья строка - индикатор питания в розетке. в случае выключения он пошлёт сигнал. В случае обратного включения тоже. Отправляем на нелокальный ящик
последняя строка - перегрузка. Письмо можно кинуть на локальный ящик.

Дополнительная информация:
1) По умолчанию сенсорсд проверяет инфомрацию с сенсоров каждые 20 секунд, кроме того чтобы датчик "устоялся" проверка должна пройти три раза, поэтому письмо придётся ждать минуту. На мой взгляд это удобно. Значение в 20 секунд меняется параметром -c
2) К сожалению функционал sensorsd не позволяет делать с упсом ничего кроме мониторинга. Однако же, если говорить конкретно о Back-UPS es 550 как в моём случае, родной powerchute personal обладает даже ещё более скудным функционалом. apcupsd в этом плане более продвинутый. Однако же насколько мне известно Back-UPS сам не особенно что умеет делать. Калибровка батареи в моём случае производится выключением питания и работой от батареи на нагрузку до самого разряда упса. Это изменяет параметр hw.sensors.upd0.timedelta0. Исходя из вышесказанного я сделал для себя вывод что sensorsd обладает вполне достаточным функционалом если используется back-ups. А smart-ups имеет rs232 и для него лучше использовать apcupsd. Не включаете smart-ups через usb, иначе не сможете использовать apcupsd.
3) Применительно к питанию аквариумов либо других потребителей где есть моторчики, лучше искать упсы с чистой синусойдой при работе от батарей, в back-ups аппроксимированная синусойда, моторчики это не любят. Однако питание у меня выключается редко, минуту-две вполне можно пережить и на апроксимированной синусойде. Но это вредно, учтите.

Недостатки:
К сожалению имеют место быть ложные срабатывания при перезапуске sensorsd. Срабатывает датчик indicator5 и кажется ещё indicator6. Если случается перезапуск то придут пару писем. Причина неизвестна.
Значения high и low взяты из переписки одного из разработчиков, прочтённые мной на marc.info. Точнее там было написано что сенсор может выдавать вместо On и Off разные значения даже отрицательные и доподлинно неизвестно какие именно посылает тот или иной ибп, исходя из этого пришлось выдумывать такие настройки на каждый сенсор. Писать в high и low буквенные значения не допускается. Следует понимать что sensorsd использует значения high и low и они оба являются триггером, любое из значений вызовет отсылку письма, что мы и наблюдаем. Странно разве что то что срабатывают только два датчика. К сожалению это недоработка которую в будущем надеюсь исправят. Пока что данный способ отражает вполне рабочий вариант хоть и не без недостатков.
Рано или поздно в жизни системного администратора наступает такой момент когда уже не хочется возится в флешками-дисками, а хочется в любой момент иметь весь нужный инструментарий под рукой. Именно поэтому для себя я создал загрузочный сервер с PXE.
Как я это сделал я опишу ниже. Мануал конечно подходит под любую систему, но я буду ориентироваться на самую лучшую - OpenBSD! Все инструкции проверены трижды на отсутствие костылей и полностью основаны на оригинальной документации. По сути данная статья это компиляция из официальных документаций и собственного опыта, которая может быть сохранит вам пару часов, а может и пару дней поисков.

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

В OpenBSD при дефолтном разбиении диска корневой раздел оказывается весьма маленьким, как впрочем и остальные системные разделы. Для нашего сервера я использую раздел /home причём всю структуру папок я создал в домашней директории своего юзера, это очень удобно при обновлении дистрибутивов на сервере.

Создаём папку tftpboot в своей домашней директории и делаем на неё линк из дефолтной директории tftp:

Код
cd
mkdir tftpboot
ln -s ~/tftpboot /tftpboot


Теперь нужно создать /etc/exports с таким содержанием:

Код
/home/kasak/tftpboot -alldirs -ro -mapall=kasak -network=192.168.0.0 -mask 255.255.255.0


Разумеется имя пользователя и адреса нужно поправить на реально существующие.

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

Код
rcctl enable portmap mountd nfsd tftpd


Spoiler:
Внимательный читатель наверное заметил что я создал симлинк из корневой системы в домашнюю директорию для работы tftpd. А вместо этого можно было просто указать в rc.conf.local опцию для tftpd и указать там другую директорию. Это правда, так можно было сделать, и правильный способ всегда тот, который вам больше нравится. Если вам интересно, зачем я сделал именно так, вот вам мой ответ: В родных скриптах инициализации в опенке для каждого встроенного в систему сервиса прописаны дефолтные опции, которые мы как раз и можем изменить в rc.conf.local. Но, следует представить себе, что разработчик может внезапно изменять нужные "дефолтные" опции и сервис случайно начнёт работать не так как следует, из-за того что мы прописали "свои" опции в rc.conf.local, например какую-то опцию могут убрать или изменить, а она у нас прописана.
Я совершенно согласен с тем кто скажет что в tftpd опции век не менялись и врядли когда-либо изменятся, это действительно так. Но в других демонах (пусть даже не системных) такая ситуация имела место быть, и именно поэтому я ВСЕГДА придерживаюсь именно такого способа манипуляции с опциями, я стараюсь их не менять без веских причин, этой мой принцип! Вы можете делать так, как считаете нужным.


Теперь займёмся dhcp. Честно говоря я у себя использую isc_dhcpd из пакетов, из-за того что мне нужен ddns, однако мне кажется что и с родным для опенки dhcpd должно сработать. В крайнем случае просто установите пакет isc_dhcpd, конфиг у обоих демонов одинаковый.
Нам нужно вписать две опции. Первая вписывается в "глобальный" конфиг:
Код
option architecture-type code 93 = unsigned integer 16;

Вторая часть вписывается в subnet:
Код
if option architecture-type = 00:00 {
filename "lpxelinux.0";
} elsif option architecture-type = 00:09 {
filename "bootx64.efi";
} elsif option architecture-type = 00:07 {
filename "bootx64.efi";
} elsif option architecture-type = 00:06 {
filename "bootia32.efi";
} else {
filename "pxelinux.0";
}

Кроме того в subnet нужно добавить опцию next-server:
Код
next-server 192.168.0.65;

Тут адрес 192.168.0.65 это адрес сервера tftpd конечно же.

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

Теперь нам нужно собрать файлы которые и будут загружаться нашим клиентам. Это можно сделать скачав пакет syslinux с официального сервера: https://www.kernel.org/pub/linux/utils/boot/syslinux/
На сегодняшний день последняя версия 6.03. Собирать ничего не нужно, все бинарники уже собраны внутри! Нам понадобятся следующие файлы:
Код
/syslinux-6.03/bios/core/pxelinux.0
/syslinux-6.03/bios/core/lpxelinux.0
/syslinux-6.03/efi32/efi/syslinux.efi (переименовываем в bootia32.efi)
/syslinux-6.03/efi64/efi/syslinux.efi (переименовываем в bootx64.efi)
/syslinux-6.03/bios/com32/elflink/ldlinux/ldlinux.c32
/syslinux-6.03/efi32/com32/elflink/ldlinux/ldlinux.e32
/syslinux-6.03/efi64/com32/elflink/ldlinux/ldlinux.e64
/syslinux-6.03/bios/com32/lib/libcom32.c32
/syslinux-6.03/bios/com32/libutil/libutil.c32
/syslinux-6.03/bios/com32/menu/vesamenu.c32
/syslinux-6.03/bios/memdisk/memdisk

Внимание!!! Данный список нужен пока лишь для организации запуска НЕ EFI загрузок! К сожалению у меня в данный момент не нашлось ни одной современной тачки способной грузится по efi, поэтому каким-то образом протестировать EFI невозможно. Если в будущем такая тачка найдётся то список будет пополнен. Проблема в том что конфиг основан на vesamenu, а для него нужны модули которые имеют те же имена что для bios. Возможно это как-то можно обойти но пока что я не могу это опробовать.

Так же нам потребуется шрифт UniCyr_8x16.psf для того чтобы отображались русские буквы. Но задачу поиска шрифта я оставляю на читателе!
Нам нужно расположить все найденные файлы в директории tftpboot так, чтобы получилась такая структура:
Код
./bootia32.efi
./bootx64.efi
./boot
./boot/UniCyr_8x16.psf
./boot/menu
./boot/menu/vesamenu.c32
./boot/isolinux
./boot/isolinux/ldlinux.c32
./boot/isolinux/libutil.c32
./boot/isolinux/ldlinux.e32
./boot/isolinux/libcom32.c32
./boot/isolinux/ldlinux.e64
./boot/memdisk
./lpxelinux.0
./pxelinux.0

Файлы разложены именно так потому что:
1) Pxelinux при запуске будет искать свой конфиг и все остальные файлы считая директорию где он сам находится корневой. То есть если засунуть его в boot то он уже не сможет спустится ниже чем boot, и всё что мы собираемся грузить должно быть в boot. поэтому pxelinux лежит в корне.
2) Следующий файл который грузит pxelinux - ldlinux. для bios и для efi они разные. Сначала pxelinux будет искать его рядом с собой, потом лезет в /boot/isolinux вот туда то мы его и положим.
3) Когда загрузится конфиг (pxelinux.cfg/default) в конфиге указано vesamenu, расположение меню указано в конфиге, а вот нужные для меню модули лежат в /boot/isolinux.
На самом деле если неохота возиться, просто скачайте комплект любезно собранный мной для вас: https://yadi.sk/d/IRxHaU5csypGB
Теперь нужно создать конфиг! Но кодировка в консоли ДО запуска системы никакая не utf-8 а cp866. редактировать конфиг с помощью консольных редакторов в кодировке cp866 неудобно.
создаём директорию pxelinux.cfg и в ней будем создавать конфиг в utf-8
Код
cd tftpboot
touch default_utf
touch convert
chmod +x convert

В файл convert скопируем это:
Код
iconv -f utf-8 -t cp866 default_utf > default

Чуть не забыл! Нужен пакет libiconv. Он автоматом ставится с php или например с апачем, но если ничего этого нет то:
Код
pkg_add libiconv

Теперь редактируем default_utf:
Код
default /boot/menu/vesamenu.c32

font /boot/UniCyr_8x16.psf
menu color border 0 #ffffffff #00000000
menu color sel 7 #ffffffff #ff000000
menu color title 0 #ffffffff #00000000
menu color unsel 0 #ffffffff #00000000
menu color disabled 0 #ffffffff #00000000
menu color timeout_msg 0 #ffffffff #00000000
menu color timeout 0 #ffffffff #00000000
menu background /boot/back.png

menu title Крутой админский тул!

prompt 0

timeout 1200

label Загрузка с первого диска
localboot 0x80

menu begin
menu title Ubuntu

label ..
menu exit

label Ubuntu 16.04 x64
kernel ubuntu/casper/vmlinuz.efi
append root=/dev/nfs boot=casper netboot=nfs nfsroot=192.168.0.65:/home/tvema/tftpboot/ubuntu NFSOPTS="rsize=8192,wsize=8192" initrd=ubuntu/casper/initrd.lz locale=ru_RU.UTF-8 quiet splash --

label Kubuntu 16.04 x64
kernel kubuntu/casper/vmlinuz.efi
append root=/dev/nfs boot=casper netboot=nfs nfsroot=192.168.0.65:/home/tvema/tftpboot/kubuntu NFSOPTS="rsize=8192,wsize=8192" initrd=kubuntu/casper/initrd.lz locale=ru_RU.UTF-8 quiet splash --

label Ubuntu 16.04 x64 server install
kernel ubuntu-server/install/netboot/ubuntu-installer/amd64/linux
append vga=normal initrd=ubuntu-server/install/netboot/ubuntu-installer/amd64/initrd.gz -- quiet

menu end

menu begin
menu title Linux Mint

label ..
menu exit

label Mint Cinnamon 32 bit
kernel mint/32/casper/vmlinuz
append root=/dev/nfs boot=casper netboot=nfs nfsroot=192.168.0.65:/home/tvema/tftpboot/mint/32 NFSOPTS="rsize=8192,wsize=8192" initrd=mint/32/casper/initrd.lz locale=ru_RU.UTF-8 quiet splash --

label Mint Cinnamon 64 bit
kernel mint/64/casper/vmlinuz
append root=/dev/nfs boot=casper netboot=nfs nfsroot=192.168.0.65:/home/tvema/tftpboot/mint/64 NFSOPTS="rsize=8192,wsize=8192" initrd=mint/64/casper/initrd.lz locale=ru_RU.UTF-8 quiet splash --
menu end

Нам нужно будет положить красивую картинку в файл /boot/back.png разрешением 640х480

Обратите внимание на опции NFSOPTS в убунтах! Дело в том что в NFS сервере openbsd значения rsize и wsize имеют именно такие значения. А в дебиане они зачем-то задрали их до 60 тысяч. Если не установить эту опцию то загрузка повиснет.

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

Для system rescue cd:
Spoiler:
menu begin
menu title System Rescue CD

label ..
menu exit

label 1) System Rescue CD 64 бита
kernel sysrcd/isolinux/rescue64
initrd sysrcd/isolinux/initram.igz
append initrd=sysrcd/isolinux/initram.igz dodhcp nfsboot=192.168.0.65:/home/tvema/tftpboot/sysrcd setkmap=us dostartx
TEXT HELP
Стандартное 64 битное ядро. Автоматический запуск графики.
ENDTEXT

label 2) System Rescue CD 32 бита
kernel sysrcd/isolinux/rescue32
initrd sysrcd/isolinux/initram.igz
append initrd=sysrcd/isolinux/initram.igz dodhcp nfsboot=192.168.0.65:/home/tvema/tftpboot/sysrcd setkmap=us dostartx
TEXT HELP
Стандартное 32 битное ядро. Автоматический запуск графики.
ENDTEXT

label 3) System Rescue CD 64 альтернативное ядро
kernel sysrcd/isolinux/altker64
initrd sysrcd/isolinux/initram.igz
append initrd=sysrcd/isolinux/initram.igz dodhcp nfsboot=192.168.0.65:/home/tvema/tftpboot/sysrcd setkmap=us dostartx
TEXT HELP
Альтернативное 64 битное ядро. Автоматический запуск графики.
ENDTEXT

label 4) System Rescue CD 32 альтернативное ядро
kernel sysrcd/isolinux/altker32
initrd sysrcd/isolinux/initram.igz
append initrd=sysrcd/isolinux/initram.igz dodhcp nfsboot=192.168.0.65:/home/tvema/tftpboot/sysrcd setkmap=us dostartx
TEXT HELP
Альтернативное 32 битное ядро. Автоматический запуск графики.
ENDTEXT
label 1) System Rescue CD 64 бита vesa video driver
kernel sysrcd/isolinux/rescue64
initrd sysrcd/isolinux/initram.igz
append initrd=sysrcd/isolinux/initram.igz dodhcp nfsboot=192.168.0.65:/home/tvema/tftpboot/sysrcd setkmap=us dostartx forcevesa
TEXT HELP
Стандартное 64 битное ядро. Автоматический запуск графики с драйвером vesa
ENDTEXT

label 2) System Rescue CD 32 бита vesa video driver
kernel sysrcd/isolinux/rescue32
initrd sysrcd/isolinux/initram.igz
append initrd=sysrcd/isolinux/initram.igz dodhcp nfsboot=192.168.0.65:/home/tvema/tftpboot/sysrcd setkmap=us dostartx forcevesa
TEXT HELP
Стандартное 32 битное ядро. Автоматический запуск графики с драйвером vesa
ENDTEXT

label 3) System Rescue CD 64 альтернативное ядро vesa video driver
kernel sysrcd/isolinux/altker64
initrd sysrcd/isolinux/initram.igz
append initrd=sysrcd/isolinux/initram.igz dodhcp nfsboot=192.168.0.65:/home/tvema/tftpboot/sysrcd setkmap=us dostartx forcevesa
TEXT HELP
Альтернативное 64 битное ядро. Автоматический запуск графики с драйвером vesa
ENDTEXT

label 4) System Rescue CD 32 альтернативное ядро vesa video driver
kernel sysrcd/isolinux/altker32
initrd sysrcd/isolinux/initram.igz
append initrd=sysrcd/isolinux/initram.igz dodhcp nfsboot=192.168.0.65:/home/tvema/tftpboot/sysrcd setkmap=us dostartx forcevesa
TEXT HELP
Альтернативное 32 битное ядро. Автоматический запуск графики с драйвером vesa
ENDTEXT
label 1) System Rescue CD 64 бита без графики
kernel sysrcd/isolinux/rescue64
initrd sysrcd/isolinux/initram.igz
append initrd=sysrcd/isolinux/initram.igz dodhcp nfsboot=192.168.0.65:/home/tvema/tftpboot/sysrcd setkmap=us
TEXT HELP
Стандартное 64 битное ядро.
ENDTEXT

label 2) System Rescue CD 32 бита без графики
kernel sysrcd/isolinux/rescue32
initrd sysrcd/isolinux/initram.igz
append initrd=sysrcd/isolinux/initram.igz dodhcp nfsboot=192.168.0.65:/home/tvema/tftpboot/sysrcd setkmap=us
TEXT HELP
Стандартное 32 битное ядро.
ENDTEXT

label 3) System Rescue CD 64 альтернативное ядро без графики
kernel sysrcd/isolinux/altker64
initrd sysrcd/isolinux/initram.igz
append initrd=sysrcd/isolinux/initram.igz dodhcp nfsboot=192.168.0.65:/home/tvema/tftpboot/sysrcd setkmap=us
TEXT HELP
Альтернативное 64 битное ядро.
ENDTEXT

label 4) System Rescue CD 32 альтернативное ядро без графики
kernel sysrcd/isolinux/altker32
initrd sysrcd/isolinux/initram.igz
append initrd=sysrcd/isolinux/initram.igz dodhcp nfsboot=192.168.0.65:/home/tvema/tftpboot/sysrcd setkmap=us
TEXT HELP
Альтернативное 32 битное ядро.
ENDTEXT

menu end

Дополнительные утилиты из состава sysrescd:
Spoiler:
MENU BEGIN
MENU TITLE Дополнительные утилиты

label ..
menu exit

LABEL memtest
MENU LABEL Тестирование оперативной памяти
kernel sysrcd/bootdisk/memtestp
append -

LABEL ntpass
MENU LABEL NTPASSWD: Сброс пароля Windows
kernel sysrcd/ntpasswd/vmlinuz
append rw vga=1 initrd=/ntpasswd/initrd.cgz,/ntpasswd/scsi.cgz

LABEL grubdisk
MENU LABEL SGD: Super Grub2 Disk
kernel /boot/memdisk
append initrd=/bootdisk/grubdisk.img floppy raw

LABEL freedos
MENU LABEL FREEDOS: DOS
kernel /boot/memdisk
append initrd=sysrcd/bootdisk/freedos.img floppy
TEXT HELP
Используется для сброса биоса или других целей
ENDTEXT

LABEL hdt
MENU LABEL HDT: Диагностика железа
kernel /boot/memdisk
append initrd=sysrcd/bootdisk/hdt.img floppy
TEXT HELP
Даст информацию об используемом компьютере
ENDTEXT

LABEL aida
MENU LABEL AIDA: старинная утилита диагностики железа
kernel /boot/memdisk
append initrd=sysrcd/bootdisk/aida.img floppy

LABEL gag
MENU LABEL GAG: Графический менеджер загрузки
kernel /boot/memdisk
append initrd=sysrcd/bootdisk/gag.img floppy

LABEL dban
MENU LABEL DBAN: уничтожитель данных на диске
kernel sysrcd/bootdisk/dban.bzi
append nuke="dwipe" silent
TEXT HELP
ОСТОРОЖНО!!! ВСЁ УДАЛИТСЯ!!!
ENDTEXT

LABEL mhdd
MENU LABEL MHDD: Диагностика жесткого диска
kernel /boot/memdisk
append initrd=sysrcd/bootdisk/mhdd.img floppy

MENU END


Просто полезные утилиты:
Spoiler:
menu begin
menu title Утилиты

label ..
menu exit

label bios flash
linux /boot/memdisk
initrd dos/fdboot.img
append floppy

label Memtest86+
kernel memtest/memtest

label Минималистичная ОС Колибри
linux /boot/memdisk
initrd kolibri/kolibri.img
append raw

label Hiren's boot CD диагностика системы
linux /boot/memdisk
initrd hirens/hiren.iso
append iso

label Quirky 7.3.2
linux quirky/vmlinuz
append initrd=quirky/initrd.q

label Damn Small Linux
linux /boot/memdisk
initrd dsl/current.iso

LABEL Partition Magic 32 bit
LINUX pmagic/bzImage
INITRD pmagic/initrd.img,pmagic/fu.img,pmagic/m32.img,pmagic/files.cgz
APPEND edd=on vga=normal

LABEL Partition Magic 64 bit
LINUX pmagic/bzImage64
INITRD pmagic/initrd.img,pmagic/fu.img,pmagic/m64.img,pmagic/files.cgz
APPEND edd=on vga=normal

label GParted редактор разделов
kernel gparted/vmlinuz
append initrd=gparted/initrd.img boot=live config components union=overlay username=user noswap noeject locales=ru_RU.UTF-8 keyboard-layouts=en gl_batch vga=788 fetch=http://192.168.0.65/tftpboot/gparted/filesystem.squashfs

label CloneZilla x64
kernel clonezilla64/vmlinuz
append initrd=clonezilla64/initrd.img boot=live union=overlay config components noswap locales=en_US.utf8 edd=on ocs_live_run="ocs-live-general" ocs_live_extra_param="" keyboard-layouts=NONE ocs_live_batch="no" nosplash noprompt fetch=http://192.168.0.65/tftpboot/clonezilla64/filesystem.squashfs

label CloneZilla x32
kernel clonezilla32/vmlinuz
append initrd=clonezilla32/initrd.img boot=live union=overlay config components noswap locales=en_US.utf8 edd=on ocs_live_run="ocs-live-general" ocs_live_extra_param="" keyboard-layouts=NONE ocs_live_batch="no" nosplash noprompt fetch=http://192.168.0.65/tftpboot/clonezilla32/filesystem.squashfs

label Paragon Recovery Free
linux /boot/memdisk
initrd paragon/bootcd.iso
append iso

А вот это уже интереснее, раскатка образов windows:
Spoiler:
menu begin
menu title Установка Windows

label ..
menu exit

label Установка Windows 7 Профессиональная x64
kernel clonezilla64/vmlinuz
append initrd=clonezilla64/initrd.img boot=live union=overlay config components noswap locales=en_US.utf8 edd=on ocs_live_run="ocs-sr -g auto -e1 auto -e2 -r -j2 -p poweroff restoredisk win7x64 ask_user" ocs_prerun1="mount -t cifs -o user=guest,password=NULL //192.168.0.50/images /home/partimag" ocs_live_extra_param="" keyboard-layouts=NONE ocs_live_batch="no" nosplash noprompt fetch=http://192.168.0.65/tftpboot/clonezilla64/filesystem.squashfs
text help
ВНИМАНИЕ!!! Установщик удалит все данные на выбранном диске и установит образ Windows 7 Профессиональная 64 бита. После установки загрузить gparted и расширить системный раздел до целого диска.
endtext

label Установка Windows 7 Professional x86
kernel clonezilla32/vmlinuz
append initrd=clonezilla32/initrd.img boot=live union=overlay config components noswap locales=en_US.utf8 edd=on ocs_live_run="ocs-sr -g auto -e1 auto -e2 -r -j2 -p poweroff restoredisk win7x32 ask_user" ocs_prerun1="mount -t cifs -o user=guest,password=NULL //192.168.0.50/images /home/partimag" ocs_live_extra_param="" keyboard-layouts=NONE ocs_live_batch="no" nosplash noprompt fetch=http://192.168.0.65/tftpboot/clonezilla32/filesystem.squashfs
text help
ВНИМАНИЕ!!! Установщик удалит все данные на выбранном диске и установит образ Windows 7 Профессиональная 64 бита. После установки загрузить gparted и расширить системный раздел до целого диска.
endtext

label Установка Windows 8 x64
kernel clonezilla32/vmlinuz
append initrd=clonezilla32/initrd.img boot=live union=overlay config components noswap locales=en_US.utf8 edd=on ocs_live_run="ocs-sr -g auto -e1 auto -e2 -r -j2 -p poweroff restoredisk win8x64 ask_user" ocs_prerun1="mount -t cifs -o user=guest,password=NULL //192.168.0.50/images /home/partimag" ocs_live_extra_param="" keyboard-layouts=NONE ocs_live_batch="no" nosplash noprompt fetch=http://192.168.0.65/tftpboot/clonezilla32/filesystem.squashfs
text help
ВНИМАНИЕ!!! Установщик удалит все данные на выбранном диске и установит образ Windows 7 Professional 64 бита. После установки загрузить gparted и расширить системный раздел до целого диска.
endtext

label Установка Windows 8 Профессиональная x64
kernel clonezilla32/vmlinuz
append initrd=clonezilla32/initrd.img boot=live union=overlay config components noswap locales=en_US.utf8 edd=on ocs_live_run="ocs-sr -g auto -e1 auto -e2 -r -j2 -p poweroff restoredisk win8prox64 ask_user" ocs_prerun1="mount -t cifs -o user=guest,password=NULL //192.168.0.50/images /home/partimag" ocs_live_extra_param="" keyboard-layouts=NONE ocs_live_batch="no" nosplash noprompt fetch=http://192.168.0.65/tftpboot/clonezilla32/filesystem.squashfs
text help
ВНИМАНИЕ!!! Установщик удалит все данные на выбранном диске и установит образ Windows 7 Professional 64 бита. После установки загрузить gparted и расширить системный раздел до целого диска.
endtext

label Установка Windows 10 Домашняя x64
kernel clonezilla32/vmlinuz
append initrd=clonezilla32/initrd.img boot=live union=overlay config components noswap locales=en_US.utf8 edd=on ocs_live_run="ocs-sr -g auto -e1 auto -e2 -r -j2 -p poweroff restoredisk win10x64 ask_user" ocs_prerun1="mount -t cifs -o user=guest,password=NULL //192.168.0.50/images /home/partimag" ocs_live_extra_param="" keyboard-layouts=NONE ocs_live_batch="no" nosplash noprompt fetch=http://192.168.0.65/tftpboot/clonezilla32/filesystem.squashfs
text help
ВНИМАНИЕ!!! Установщик удалит все данные на выбранном диске и установит образ Windows 7 Профессиональная 64 бита. После установки загрузить gparted и расширить системный раздел до целого диска.
endtext

label Установка Windows 10 Профессиональная x64
kernel clonezilla32/vmlinuz
append initrd=clonezilla32/initrd.img boot=live union=overlay config components noswap locales=en_US.utf8 edd=on ocs_live_run="ocs-sr -g auto -e1 auto -e2 -r -j2 -p poweroff restoredisk win10prox64 ask_user" ocs_prerun1="mount -t cifs -o user=guest,password=NULL //192.168.0.50/images /home/partimag" ocs_live_extra_param="" keyboard-layouts=NONE ocs_live_batch="no" nosplash noprompt fetch=http://192.168.0.65/tftpboot/clonezilla32/filesystem.squashfs
text help
ВНИМАНИЕ!!! Установщик удалит все данные на выбранном диске и установит образ Windows 7 Professional 64 бита. После установки загрузить gparted и расширить системный раздел до целого диска.
endtext

menu end


Обратите внимание, если вы для работы будете использовать gparted или clonezilla нужно будет добавить http сервер в сеть. Можно вынуть из chroot родной httpd вот таким конфигом:
Код
ext_addr="*"
chroot "/"
logdir "/var/www/logs"

server "default" {
        listen on $ext_addr port 80
        connection { max request body 10000000000 }

        location "/tftpboot*" {
                directory auto index
                root "/home/tvema"
        }

        location "*.php" {
                fastcgi socket "/var/www/run/php-fpm.sock"
        }

        location "/cgi-bin/*" {
                fastcgi

                # The /cgi-bin directory is outside of the document root
                root "/var/www"
        }

        
        root "/var/www/htdocs"
}

types {
        include "/usr/share/misc/mime.types"
}


Образы очень плохой, самой худшей в мире операционки windows можно создать в virtualbox, это очень просто. Предоставленный мной конфиг спрашивает только на какой из дисков раскатать операционку, после чего раскатывает и выключает комп. Но я никому не рекомендую использовать windows!
Само собой наполнение сервера файлами для загрузки я оставляю читателю. Если кому-то непонятно как это сделать, чтож мой друг, пока тебе рано называть себя настоящим системным администратором.
Впринципе это всё! В этот раз я не стал разжёвывать абсолютно всё по пунктам. На самом деле информации должно быть достаточно чтобы неподготовленный человек мог развернуть сервер и начать изучение! Начинать следует с вики syslinux!
26 May 2016
Я решил написать очередную статейку про замечательную ось OpenBSD, на этот раз речь пойдёт о построении ipsec туннелей с использованием ikev1 и ikev2.
Напомню что все мои статьи ориентированы на новичков в области системного администрирования, поэтому я излагаю всё максимально просто.

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

Безусловно можно сделать всё очень просто при помощи openvpn, но поскольку циклы моих статей направлены на популяризацию OpenBSD, на мой взгляд куда проще и быстрее сделать всё средствами чистой системы без установки постороннего софта, кроме того, несмотря на иногда кажущуюся сложность, на практике построить тоннель очень просто!

Минимум того что вам необходимо знать - Я покажу сначала старый проверенный метод на ikev1, потом на ikev2. Для нас разница будет лишь в том что ikev2 проще.
Сначала шлюзам нужно будет обменяться ключами, после чего будут установлены шифрованные потоки по которым и будет направлен шифрованный трафик.

Для ikev1 обмен ключами будет происходить через демон isakmpd а потоки будет создавать ядро скушав конфигурационный файл /etc/ipsec.conf. Для ikev2 будет достаточно одного лишь OpenIKED. Но об этом позже.

В OpenBSD 5.9 нужные протоколы (esp, ah) в ядре включены изначально.
Если в pf включен полностью порезан входящий трафик то нужно разрешить 500 порт по UDP ну и на всякий случай 4500 UDP.

Здесь и далее конфигурация нашей сети будет выглядеть вот так:

LAN1 (192.168.1.0/24) ---------- Gate1 (1.1.1.1) ---- Internet ---- Gate2 (2.2.2.2) ----------- LAN2 (192.168.2.0/24)

Для ikev1 можно организовать обмен ключами через PKI (то есть вручную сгенерировать CA сертификат и им вручную же подписать пару сертификатов для наших шлюзов, но это далеко не простой путь, поэтому для ikev1 мы прибегнем к простому и проверенному способу аутентификации по открытому ключу. Посмотрите что лежит в /etc/isakmpd/

-rw-r--r-- 1 root wheel 451 May 5 2014 local.pub

Это открытый ключ. Мы должны положить его на удалённый сервер, а с удалённого сервера забрать такой же себе. Это можно сделать через scp:

Код
doas scp 2.2.2.2:/etc/isakmpd/local.pub /etc/isakmpd/pubkeys/ipv4/2.2.2.2


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

Код
doas scp 1.1.1.1:/etc/isakmpd/local.pub /etc/isakmpd/pubkeys/ipv4/1.1.1.1


Что было сейчас сделано? Я думаю любой даже начинающий сисадмин знает как пользоваться scp но на всякий случай напомню. Нам нужно положить файлик local.pub с удалённого сервера на наш сервер, doas в начале нужно за тем чтобы хватило привилегий на запись в папку /etc/isakmpd/pubkeys/ipv4/ Кроме того при копировании ключа мы даём ему имя совпадающее с айпи адресом удалённого сервера откуда мы копируем ключ. Это нужно сделать обязательно!

Теперь нужно запустить isakmpd в флагом -K. Этот флаг нужен для того чтобы isakmpd не искал файлик политик, нам он в данном случае не нужен.

Код
doas rcctl enable isakmpd
doas rcctl set isakmpd flags -K
doas rcctl start isakmpd


Перейдём к созданию потоков. Редактируем файл /etc/ipsec.conf:

Код
ike from 1.1.1.1 to 192.168.2.0/24 peer 2.2.2.2 srcid 1.1.1.1
ike from 192.168.1.0/24 to 192.168.2.0/24 peer 2.2.2.2 srcid 1.1.1.1


На обратной стороне зеркально:

Код
ike from 2.2.2.2 to 192.168.1.0/24 peer 1.1.1.1 srcid 2.2.2.2
ike from 192.168.2.0/24 to 192.168.1.0/24 peer 1.1.1.1 srcid 2.2.2.2


Конечно же можно было в конфиге прописать макросы, например gate1="1.1.1.1" и сделать всё покороче, но я специально не стал этого делать для наглядности. Разберём отдельно каждую часть.

На самом деле строка могла быть куда больше, однако я опустил ВСЕ лишние опции, например active или esp. Эти опции ike считает дефолтными а значит лишний раз вписывать их не нужно. Я встречал много статей где зачем-то вбивались куча лишних аргументов.

Первая строка - туннель от 1.1.1.1 до 192.168.2.0 - соответственно туннель от самого шлюза до удалённой локалки. peer - адрес удалённого шлюза. srcid - я на всякий случай опционально вписал этот аргумент, чтобы гарантированно совпадали srcid у источников и совпадать они должны с названиями файлов в /etc/isakmpd/pubkeys/ipv4.

Можно было вообще упростить это ещё больше:
ike from 1.1.1.1 to 2.2.2.2
ike from 192.168.1.0/24 to 2.2.2.2
ike from 192.168.1.0/24 to 192.168.2.0/24

Тут первая строка - это туннель непосредственно между шлюзами. В первой строке мы как бы подсовываем аргумент peer однозначно давая понять откуда и куда всё это подключается.

Всё это нужно включить через
Код
doas ipsecctl -f /etc/ipsec.conf

А в конец файла /etc/rc.conf/local добавить
Код
ipsec="YES"

Для автоматической подгрузки этих правил при включении системы.
Вот вобщем то и всё. Через ipsecctl -sf (означает show flows) посмотрим на потоки:
Код
flow esp in from 2.2.2.2 to 192.168.1.0/24 peer 2.2.2.2 srcid 1.1.1.1/32 dstid 2.2.2.2/32 type use
flow esp out from 192.168.1.0/24 to 2.2.2.2 peer 2.2.2.2 srcid 1.1.1.1/32 dstid 2.2.2.2/32 type require
flow esp in from 192.168.2.0/24 to 1.1.1.1 peer 2.2.2.2 srcid 1.1.1.1/32 dstid 2.2.2.2/32 type use
flow esp out from 1.1.1.1 to 192.168.2.0/24 peer 2.2.2.2 srcid 1.1.1.1/32 dstid 2.2.2.2/32 type require
flow esp in from 192.168.2.0/24 to 192.168.1.0/24 peer 2.2.2.2 srcid 1.1.1.1/32 dstid 2.2.2.2/32 type use
flow esp out from 192.168.1.0/24 to 192.168.2.0/24 peer 2.2.2.2 srcid 1.1.1.1/32 dstid 2.2.2.2/32 type require


Такая картина нам открывается на шлюзе 1.1.1.1.
Первые две строки это поток который нам прислал удалённый шлюз, остальные четыре мы описали сами в /etc/ipsec.conf.

На этом по ikev1 у меня всё!

Чтобы организовать ikev2 нам потребуется только лишь один iked.
Не нужен больше isakmpd и файл ipsec.conf.

Начнём с чистого листа! Всё что у нас есть это два шлюза и сети в той конфигурации что описана выше, и pf.conf с открытыми 500 и 4500 UDP портами.
iked допускает больше возможностей для обмена ключами, кроме того в комплекте идёт супер удобная утилита для генерации CA и сертификатов для организации "public key infrastructure". В примере выше мы использовали публичные ключи, тут можно поступить так же но, для разнообразия, ниже я покажу как сделать всё по-человечески. Но дополнительно расскажу что можно вообще ничего не генерировать и не копировать я просто сделать с двух сторон вот так:
Код
ikev2 active from 1.1.1.1 to 192.168.2.0/23 from 192.168.1.0/24 to 192.168.2.0 psk "secretkey"

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

Мы же создадим инфраструктуру ключей:

Код
ikectl ca vpn create
###Создаём CA сертификат.
ikectl ca vpn certificate 1.1.1.1 create
ikectl ca vpn certificate 2.2.2.2 create
###Создаём сертификаты узлов (они сразу же подпишутся нашим CA)
ikectl ca vpn install
### Инсталлируем CA на наш первый шлюз
ikectl ca vpn certificate 1.1.1.1 install
### Инсталлируем наш сертификат на 1.1.1.1
ikectl ca vpn certificate 2.2.2.2 export
### Экспортируем готовый набор сертификатов для 2.2.2.2
scp 2.2.2.2.tgz user@2.2.2.2:/home/user
### Копируем его на удалённый узел. user следует разумеется заменить на реальную учётку.
tar -C /etc/iked -xzpf 2.2.2.2.tgz
### Это установит всё необходимое на второй узел.


Каждый раз при генерировании сертификата он будет спрашивать все данные. Надеюсь всем понятно что в Common Name нужно вводить ip адрес либо то что будет использоваться вместо ip адреса в srcid.

Теперь когда у нас есть ключи с обоих сторон можно создать конфиг для iked!
/etc/iked.conf(со стороны 1.1.1.1):
Код
ikev2 from 1.1.1.1 to 192.168.2.0/24 from 192.168.1.0/24 to 192.168.2.0/24 peer 2.2.2.2 srcid 1.1.1.1

со стороны 2.2.2.2:
Код
ikev2 active from 2.2.2.2 to 192.168.1.0/24 from 192.168.2.0/24 to 192.168.1.0/24 peer 1.1.1.1 srcid 2.2.2.2


Что изменилось относительно ipsec.conf. В отличие от ipsec.conf наш iked по умолчанию принимает не активный режим а пассивный. Поэтому со стороны 1.1.1.1 никаких доп опций нет, он как бы ждёт запросов, а со стороны 2.2.2.2 мы добавили active, он будет инициировать соединение. Кроме того теперь можно не вводить по сто раз srcid и peer а сразу же вписать всё одной строкой.
Что касается опций, srcid по умолчанию использует hostname, а оно как правило не является ip адресом. Можно вместо этого генерить сертификаты опираясь не на ip адрес а на hostname, но мне для наглядности проще показать это в виде ip адресов.
Для запуска всего хозяйства достаточно запустить один только iked:
Код
doas rcctl enable iked
doas rcctl start iked

посмотреть на потоки можно так же через ipsecctl -sf

Как видно - в iked всё куда проще и удобнее чем в связке isakmpd + ipsec.conf.

НО!!! Вот тут мне придётся описать очень плохой итог и объяснение зачем я описывал отдельно и isakmpd и iked вместо того чтобы оставить один только удобный iked.
На сегодняшний день (OpenBSD 5.9) При тестировании iked я столкнулся с проблемой. Между локалками трафик ходит хорошо, Но при попытке пинга локальных адресов с самого шлюза не доходит ответ.
То есть icmp request исправно доходит до удалённой точки, но при возвращении icmp reply отправляется не на enc0 а на egress, и в результате не доходит до нужной точки.
Если вы не поняли о чём я сейчас говорю то не заморачивайтесь и делайте всё по isakmpd, потом разберётесь. Но если вам понятны мои слова, то возможные пути обхода есть.
Первый путь решить проблему в лоб. Убрать вообще из iked.conf маршрут from 1.1.1.1 to 192.168.2.0/24 и вместо этого сделать в pf.conf:
match out on enc0 from (egress) to 192.168.2.0/24 nat-to (192.168.1.1)
Это обманет шлюз и будет отсылать все пакеты с локального адреса. Но это разумеется костыль.
Ещё мысли, мне кажется можно попробовать добавить дополнительный маршрут from 2.2.2.2 to 192.168.1.0/24 на шлюзе 1.1.1.1 и наоборот на 2.2.2.2, возможно это решит проблему но доказательств этому у меня нет, как к сожалению в данный момент нету подопытных локалок на которых можно проверить эту теорию.
Кроме того к моему сожалению iked имеет свойство время от времени переставать работать, не подавая при этом каких-либо признаков неисправности. То биш flows и sad созданы, лог чист, всё вроде бы должно работать, но по какой-то причине не работает sad.gif Проблему решает перезапуск iked, Однако же это конечно совсем не то что нужно. Тестирование проводилось как раз на pki, возможно при использовании local.pub или psk такой проблемы не будет, однако же как я говорил у меня нету подопытных сетей для проведения тестирования всего этого поэтому я и описал два способа. Первый - проверенный, где всё работает как следует. Второй тоже проверенный но тут есть проблемы. Возможно у кого-то будет желание поэкспериментировать и открыть для себя радости OpenIKED, и возможно даже отписаться как удалось решить проблему. Я же в свою очередь отредактирую данную статью если ситуация изменится.

Всем спасибо за внимание!
Просмотры


31 Jul 2017 - 16:21


10 Nov 2016 - 21:54


2 Nov 2015 - 12:32


29 May 2014 - 10:28


17 May 2013 - 8:08


Друзья
Друзей нет.
RSS Текстовая версия Сейчас: 25th February 2018 - в 18:57




Rating@Mail.ru