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
Просмотров профиля: 9432*
Последнее посещение: 8th April 2017 - в 15:28
Часовой пояс: Jun 28 2017, в 23:14
879 сообщений (0.22 за день)
Контактная информация
AIM Нет данных
Yahoo Нет данных
ICQ 227786581
MSN Нет данных
Contact E-mail скрыт
* Просмотры профиля обновляются каждый час

kasak

Участники


Темы
Сообщения
Друзья
Содержимое
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, и возможно даже отписаться как удалось решить проблему. Я же в свою очередь отредактирую данную статью если ситуация изменится.

Всем спасибо за внимание!
27 Apr 2015
Вот дошли руки до следующей части моих трудов, в которой я опишу несколько сценариев которые могут пригодится.

Начнём с простого - фильтрация трафика через squid. Очень часто сквид применяют с авторизацией, однако это неудобно если нет домена, потому как заставлять пользователей сначала применять хитрые настройки в браузерах а потом ещё и вводить логины-пароли негуманно. Интернет сейчас не диковинка, да и в своих трудах я расскажу основы фильтрации через OpenBSD, а подстроить под свои нужны читатель справится самостоятельно, рецептов в интернете на эту тему очень много.
Итак поехали. У нас будет прозрачный прокси, в наши задачи для начала будет входить ограничить группу компьютеров, например если это компьютеры учебного класса. Туда можно допускать обновления для антивируса или мелко-мягкой программы, но нельзя допускать учащихся в интернеты. Ну или может быть открыть им какие-то нужные сайты а остальное закрыть.
Для начала установим squid:
Код
pkg_add squid

В OpenBSD 5.6 будет предложено выбрать между версиями 3.4 или 3.5pre. Я выбрал 3.5 и проблем с ним не возникало.
После установки резонно почитать хелп который находится в
Код
/usr/local/share/doc/pkg-readmes/squid-3.5pre20140626p1

Однако я укорочу его содержимое до того что нас интересует: нужно вписать в /etc/login.conf вот этот кусок:
Код
squid:\                                                                                                                                                                                                                    
        :datasize=1500M:\                                                                                                                                                                                                  
        :openfiles=4096:\                                                                                                                                                                                                  
        :tc=daemon:


Без этого сквид сразу после запуска будет глохнуть ругаясь на too many open files.

Приступим к конфигурации сквида.
В OpenBSD рабочая папка сквида будет находится в /var/squid. Там будут лежать директории cache и logs.
Кэш нам не нужен, а вот логи пригодятся. логов будет два. Один - cache.log это лог в котором нужно искать выхлоп процесса squid. При возникновении неисправностей нужно смотреть туда. Второй лог access.log нам понадобится для формирования таблицы лодырей, кто больше всех насидел в контактике.

Конфигурирование сквида осуществляется правкой файла /etc/squid/squid.conf.
Для выполнения нашего первого сценария, необходимо собрать все мак адреса компьютеров у которых не должно быть доступа, и первично поправить конфиги.
Берём конфиг по умолчанию и начинаем добавлять:
Находим директиву http_port и меняем её чтобы выглядело следующим образом:
http_port 127.0.0.1:3128 intercept
После этой строчки сразу же добавляем ещё одну
http_port 3129
Всё вместе будет выглядеть так:
Код
# Squid normally listens to port 3128
http_port 127.0.0.1:3128 intercept
http_port 3129

Обратите внимание на слово intercept. В ранних версиях OpenBSD приходилось писать transparent, если читатель работает с OpenBSD 5.4 например, может потребоваться указывать именно transparent. Рекомендую обновится!
Вторая строка нужна, ибо сквид ругается что ему нужен отдельный порт для работы.
Теперь нужно создать acl для компьютеров которым не будет доступа, и второй лист, в котором будет список сайтов куда доступ будет предоставлен.
Код
acl maclist arp "/etc/squid/maclist"
acl maclisturl url_regex "/etc/squid/urlallow"

Я тут использую url_regex. Было бы более правильно использовать тут dstdomain или dstdom_regex, однако url_regex в моём случае используется для гибкости. Читатель может использовать то что удобно.
Spoiler:
Небольшая сносочка. Я подумал что читатель возможно совсем не разбирается в сквидах, и уточню что есть что.
url_regex будет удовлетворён любым совпадением в полном адресе. Например если в списке url_regex присутствует avast.com то адрес https://www.google.ru/#q=avast.com тоже будет открыт!!!
dstdomain это просто указание домена. например avast.com в данном случае ссылка https://www.google.ru/#q=avast.com открыта не будет.
dstdom_regex позволяет использовать регулярные выражения, например avast.* будет означать любое значение avast.ru, avast.com, avast.net и так далее.

Невооружённым глазом видно, что список мак адресов для запрещения доступа надо вписать в файл /etc/squid/maclist а список сайтов куда будет имется доступ нужно вписать в /etc/squid/urlallow.
Теперь нужно сделать красивую страничку с ошибками:
Водим сначала вот это:
Код
error_directory /usr/local/share/squid/errors/ru

А потом вот это:
Код
deny_info ERR_MACLIST_DENIED_UTF maclist

Объясняю что к чему. Первое - указывает сквиду на папку в которой лежат странички с нужным языком (русским) по умолчанию он будет показывать английские странички.
А второе - указывает какую именно страницу надо показывать клиентам которым запрещён доступ. Страницы с указанным мной именем конечно же нету. Тут читатель должен взять в руки Bluefish и сверстать простую страницу с логотипом фирмы или чем-то подобным где будет доподлинно объяснятся почему запрещён доступ. На забудьте поместить её в нужную папку указанную в error_directory.
Теперь нужно непосредственно запретить доступ:
Код
http_access allow maclist maclisturl
http_access deny maclist

Правила в сквиде проверяются сверху вниз. Срабатывает первое подошедшее правило.
Первое правило срабатывает когда клиент получает доступ к разрешённым сайтам. Второе правило запрещает доступ этим же ребятам.
Логика проста. Клиенты у которых подходит мак адрес, сначала будут проверены первым правилом, и и если оно не подойдёт, будут проверены вторым, а уж оно подходит точно.
Вписываем наш сквид в pkg_scripts и запускаем. /etc/rc.d/squid start
Теперь всё что осталось - это запустить глобально (или не очень) наш сквид.
Для этого рекомендую создать пару таблиц в pf.conf:
Код
table <mynets> persist { 192.168.1.0/24, 192.168.0.0/24 }
table <squid> persist { 192.168.1.0/24, !192.168.1.206, !192.168.1.250 }

Зачем такие сложности:
В первую таблицу будем вписывать сайты, которые плохо реагируют на проксирование. К сожалению такие есть, взять к примеру netprint или nix. Хотя со вторым мне удалось разобраться) Всё вписанное в таблицу mynets - к этому доступ будет мимо прокси.
Вторая таблица это по сути список компьютеров которые будут ходить через прокси. У меня указаны все компьютеры кроме парочки. Иными словами в первую таблицу мы включаем удалённые сайты которые будут мимо прокси, а во вторую будем вписывать локальные компьютеры которые ходят мимо прокси.
Теперь завинчиваем трафик на проксик:
Код
pass in quick inet proto tcp from <squid> to !<mynets> port www divert-to 127.0.0.1 port 3128

Это правило должно быть ДО правила с nat!
Всё должно работать как следует. Однако в этом способе есть один очень большой косяк: https... блокирован не будет.
Пожалуй прежде чем я начну рассказывать как с этим боротся, я расскажу как подсчитать трафик с помощью сквида.
Устанавливаем пакет lightsquid:
Код
pkg_add lightsquid

Спасибо огромное Сергею Ерохину за эту замечательную программу!
Чтобы лайтсквид считал трафик правильно и удобно, нужно немного поднастроить сквид.
Куда-нибудь в конфиг сквида вставляем следующую строку:
Код
logfile_rotate 1

можно конечно выставить и побольше, но лично мне кажется что этого вполне хватит, не имеет смысла держать гигантские логи долгое время.
Теперь настройка lightsqud. Я буду использовать nginx и slowcgi для отображения информации.
Первоначально зайдём в конфиг лайтсквида и поправим там пути. Lightsquid устанавливается в папку /var/www/htdocs/lightsquid.
Конфиг называется lightsquid.cfg
Проверяем все пути в этом файле, делая их абсолютными:
Код
#path to additional `cfg` files
$cfgpath             ="/var/www/htdocs/lightsquid";
#path to `tpl` folder
$tplpath             ="/var/www/htdocs/lightsquid/tpl";
#path to `lang` folder
$langpath            ="/var/www/htdocs/lightsquid/lang";
#path to `report` folder
$reportpath          ="/var/www/htdocs/lightsquid/report";
#path to access.log
$logpath             ="/var/squid/logs";
#path to `ip2name` folder
$ip2namepath         ="/var/www/htdocs/lightsquid/ip2name";

#path to `lockfile` ;-)
$lockpath            =$reportpath;

Nginx сам исполнять скрипты не умеет, зато в openbsd есть очень хороший враппер для этого, slowcgi.
Однако, по умолчанию он запирает себя в jail который находится в /var/www/.
И в этой самой тюрьме, никакого пёрла у нас нет. И есть два пути решения проблемы.
1) собрать в этой тюрьме нужную структуру папок и скопировать туда пёрл и все его библиотеки.
2) Попросить slowcgi не запираться в тюрьме.

Скажем так, я пробовал идти по первому пути, и успешно прошёл. Однако это всё таки очень долгая заморочка и я предполагаю что если читатель способен сделать это всё самостоятельно - он не будет читать эту статью потому что всё написанное выше для него - пара пустяков.
Поэтому мы пойдём по второму пути. Пусть это и брешь в безопасности, но нельзя сказать что прям очень большая. Кроме того доступ к лайтсквиду будет только с определённых компьютеров. Обратите так же внимание, если идти по первому пути, в конфиге lightsquid нужно указывать пути без /var/www/
Итак идём вторым путём. Просим slowcgi не запираться в тюрьму. Для этого в /etc/rc.conf.local вписываем это:
Код
slowcgi_flags="-p /

Теперь нужно указать лайтсквиду где хранятся логи и напомнить самому сквиду что логи нужно крутить. Для этого в /etc/daily.local вписываем:
Код
/var/www/htdocs/lightsquid/lightparser.pl
/usr/local/sbin/squid -k rotate

Первая строка считает трафик из логов, вторая крутит лог сквида, руководствуясь параметром который мы указали ранее в squid.conf.
Теперь наши отчёты надо посмотреть. Мне придётся забежать немного вперёд и выложить кусок конфига nginx. Далее я расскажу про nginx поконкретнее. А щас просто кусок:
Код
server {
        listen 80 default;
        root /htdocs;
        index index.html index.htm;

        server_name gate.somewhere.net;

        location / {
                try_files $uri $uri/ /index.html;
                allow 192.168.2.250;
                deny all;
        }

        location /lightsquid {
        root /htdocs;
        index index.cgi;
        allow 192.168.2.250;
        deny all;
        }

        location ~ \.cgi$ {
        gzip off;
        fastcgi_pass unix:/run/slowcgi.sock;
        fastcgi_index index.cgi;
        fastcgi_param  SCRIPT_NAME        /var/www/htdocs$fastcgi_script_name;
        include /etc/nginx/fastcgi_params;
        }
}

В этом кусочке мы разрешаем доступ к считалке только для одного айпишника. чтобы её открыть нужно запрашивать адрес сервера и добавлять к url "/lightsquid"
Если всё прошло правильно, можно возрадоваться. Если нет нужно открыть запустить /var/www/htdocs/lightsquid/check-setup.pl и посмотреть

Теперь у нас есть считалка http трафика и даже небольшая блокировка. И самое правильное что вы можете щас сделать: остановиться и больше ничего не ломать!!!
Дальше я расскажу как фильтровать https трафик. Это реально сделать однако я весьма не рекомендую это делать! Я очень рекомендую оказывать административное влияние на горе-работников а не устраивать в сети тотальный бедлам ломая всё подряд!
Поверьте опыту, сколько ни блокируй, сколько ни выписывай, всё равно найдутся индивиды которые поставят тор/найдут новый прокси/установят vpn сделают что угодно и создадут ещё больше проблем! В конце концов когда вы потратите недели своего времени на закрытие всего подряд, она просто придут со своими модемами, а у тех людей которые реально работают а не бездельничают возникнет огромное количество проблем, которые решать опять же - вам.
Я категорически рекомендую считать трафик по netflow и в случае возникновения проблем обращаться к руководству. Это значительно эффективнее чем затыкивать всё подряд. Как считать трафик по netflow я расскажу ниже. Ну а сейчас...
Способ фильтрафии https есть. И хоть он крив и косячен я о нём расскажу, не потому что следует его использовать а потому что он просто есть.
Перед тем как этим заниматься, следует понимать что мы делаем. https трафик вообще не предназначен для проксирования. Он передаётся целиком в шифрованном виде. То что мы будем делать - вклиниваться посередине, расшифровывать его, просматривать и устанавливать шифрованное соединение между прокси и сайтом назначения.

Сначала вписываем в squid.conf ещё одну строку:
Код
https_port 127.0.0.1:3130 intercept ssl-bump generate-host-certificates=on cert=/etc/squid/ssl/squid.pem key=/etc/squid/ssl/squid.key

Соответственно сертификаты squid.pem и squid.key следует сгенерировать самостоятельно.
Кроме того необходимо выполнить команду
Код
/usr/local/libexec/squid/ssl_crtd -c -s /var/squid/lib/ssl_db

Теперь нужно отделить сайты на которых будет срабатывать блокировка от сайтов на которых она работать не будет. И я категорически не рекомендую делать иначе!
Сначала создаём список что именно надо блокировать. Обычно этот список даёт нам руководство. Это всяческие контактики, однокласснички, порнушка. Актуальный список всегда можно посмотреть в лайтсквиде, который мы только что настроили.
Добавляем:
Код
acl badsites dstdomain "/home/kasak/sites.deny"
acl broken_ads url_regex "/home/kasak/broken_ads"

Первая строка - файл где будет хранится список желаемого от руковоства.
Вторая - побочный эффект блокировки. Поскольку очень часто на сайтах наличествуют всякие кнопочки типа "мы в контакте, мы на фейсбуке, мы в инстаграме" эти кнопочки могут создавать проблемы и на их месте будут вылезать куски страниц с ошибками.
В файл broken_ads нужно добавлять куски url которые мешают сайтам выглядеть как следует. соединение будет сбрасываться и не будет мешать.
Ещё проще тупо сбрасывать соединения на всё не угодно руководству, но это чревато тем что вы станете кол-центром для всех недовольных тем что "интернет показывает белую страницу" проще создать страницу с информацией почему именно заблокирован сайт.
Код
http_access deny broken_ads
deny_info TCP_RESET broken_ads

http_access deny badsites
deny_info ERR_BADSITE_UTF badsites

Первая часть режет сломанные баннеры и кнопки, сбрасывая tcp соединение
Вторая показывает страшную страницу которую нужно создать самостоятельно, я уже говорил об этом выше.
Кстати обратите внимание, каждый раз при изменении конфигурации или добавления сайтов, нужно указывать об этом сквиду командой:
Код
squid -k reconfigure

Не следует перезапускать сквид через /etc/rc.d/squid restart. это слишком долго и неудобно.
Теперь последний пункт, нужно выяснить все айпишники всех блокируемых сайтов и создать такое правило:
Код
acl badips dst "/home/kasak/blockedips"
ssl_bump server-first blockedips

Смысл в том, что сквид, проксируя ssl трафик, будет сначала предлагать клиенту свой сертификат, а наш сертификат не подписан корневыми центрами, и поэтому при попытке открыть ВООБЩЕ любой сайт мы получим от любого браузера матюки.
Особо извращённые личности могут конечно импортировать сертификат по все браузеры во всех компьютерах, однако я решил вопрос проще. Просто собрал все айпишники всех сайтов которые надо заблокировать и вписал их в указанный выше файл.
Это позволило не мучаться с клиентскими компами. Заблокированные сайты выдают предупреждение что сертификат не тот, если его принять - попадаешь на сообщение о блокировке.
Теперь просто перенаправляем трафик в pf.conf:
Код
pass in quick inet proto tcp from <squid> to !<mynets> port https divert-to 127.0.0.1 port 3130

Последнее что хотелось бы указать по сквиду, у меня возникала проблема с сайтом nix.ru. Он никак не хотел работать через прокси. Точнее он работал, но открывался по несколько минут. Вариантов решения два. Либо вписать ip адрес сайта в таблицу mynets в pf, описание этих таблиц я давал выше. Либо добавить вот это:
Код
net.inet.tcp.rfc1323=0
в /etc/sysctl.conf. Кому как больше нравится.
кроме того, если вы всё таки не послушали меня и решили блокировать https, у вас перестанет работать сбербанк онлайн, и бесполезно что-то с этим делать. Добавляйте его в mynets. Возможно сломается ещё что-то, не могу знать всё.

Поверьте моему опыту, если пойти по этому пути, сотрудники которые на самом деле работают, даже не увидят разницы, а те кто сидит в соц сетях, сразу же начнут искать пути обхода и создавать ещё больше проблем, и тратить на это ещё больше времени. Объясните это руководству прежде чем что-то делать.

Теперь о netflow - это более правильный и красивый способ докладывать о нехороших ребятах.

Делается это очень просто. Сначала создайте файл /etc/hostname.pflow0 с содержимым:
Код
flowsrc <wan ip> flowdst 192.168.1.21:20001 pflowproto 5
разумеется заменив <wan ip> на актуальный внешний адрес шлюза а 192.168.1.21 на адрес того сервера, где будет находится считалка трафика.
После этого отредактируйте сроку pf которая осуществляет nat следующим образом:
Код
pass out on $wan inet from $lan_net to any nat-to $wan keep state (pflow)

Перезапустите комп, либо сеть, командой sh /etc/netstart и шлюз начнёт отсылать поток netflow на нужный сервер.
обратите внимание, что данные о потоке отсылаются только после того как поток был закрыт. Например если кто-то качает архив в 3 гб с какого-нибудь фтп сервера, считалка узнает об этом только когда файл будет скачан и поток будет закрыт. А если этого же господин решит скачать пару терабайт, считалка вообще узнает об этом очень и очень нескоро.

В качестве считалки трафика я использую netams. Спасибо большое разработчикам за этот замечательный инструмент, и хоть не всё в нём удобно, пока что лучшей считалки для трафика я не нашёл. Укажу так же что для этой считалки нужен довольно серьёзный комп. У меня это core i7, но подойдёт и что-то попроще. Однако подойдёт и что-то попроще. Но здесь всё-таки работает правило чем сильнее тем лучше. К примеру на core2quadro это всё работало категорически медленно.
С установкой netams читатель наверное справится сам. А вот с конфигурацией я подскажу.
Тут пригодились бы скриншоты, без них это будет просто много букв. Но к сожалению у меня их нет, так что если хотите сделать это, читайте и повторяйте в прямом эфире.
Открываем источники данных, добавляем туда netflow5, указываем в качестве параметров
listenat оставляем нули. Port берём из /etc/hostname.pflow0 параметр accept_from устанавливаем в наш внешний ip адрес, такой же как в /etc/hostname.pflow0
Далее идём в элементы-подсеть и добавляем подсеть локальных адресов. Далее идём в тарифы и добавляем бесплатный тариф. Это нетрудно. А так же добавляем группу контактов all.
Теперь идём в система-динамическое создание объектов, и добавляем задачу. Указываем все пункты!
Включён - галка
Источник данных - наш нетфлоу
подсеть - указывайте то что создали
создать учётный объект - да
создать контракт - да
способ именования контракта: укажите тут следующее: %1.%2.%3.%4
группа контрактов: укажите то что создали
создать лицевой счёт - да
валюта счёта - рубли
создать услугу - да
тарифный план - наш бесплатный.

После сохранения нашей схемы, полетят новые учётные записи.
Читателю надлежит самостоятельно изучить эту систему. Хоть в ней и есть неудобства, это всё ещё удобный способ посчитать трафик по netflow и вывести это дело на экран через браузер.
Очень просто и эффективно!

Как видите, любое действие в OpenBSD не требует великих знаний и умений. Почти всё решается всего парой строк, именно это и есть привлекательная черта OpenBSD.

Остался один пункт - реверсивное проксирование. В условиях когда один ip адрес должен предоставлять очень много разных сервисов, бывает полезно использование реверсивного прокси. Тут особенно много информации не будет.
OpenBSD 5.6 имеет в дефолтной поставке nginx. в 5.7 его выпилят, но он будет доступен из пакетов.
Я считаю для удобства нужно создавать папку /etc/nginx/sites и уже в эту папку складывать все нужные файлики с описаниями куда и что проксировать.
Родной поставочный конфиг можно не менять, а просто вписать в секцию http следующий инклюд:
Код
include     /etc/nginx/sites/*;

После чего можем создавать в папке /etc/nginx/sites файлики с описанием проксей. Возьмём простой пример:
Код
server {
listen 80;
server_name somesite.somewhere.net;

satisfy any;
allow 192.168.1.0/24;
allow 192.168.0.0/24;
allow 127.0.0.1;
deny all;
auth_basic "access error";
auth_basic_user_file /conf/http.password;

location / {
proxy_pass http://server1.lan;
include /etc/nginx/proxy.conf;
}

Тут мы описываем доступ к somesite.somewhere.net. Идея в том чтобы дать доступ из локальной сети без пароля, а из внешнего мира с паролем.
Все строки allow я думаю понятны - это адреса локальных сетей. а вот далее две строки - auth_basic первая это заголовок окошка с запросом логина-пароля. второе - это файл с логином и паролем. Он создаётся утилитой htpasswd. Обратите внимание на его расположение. Он лежит в /var/www/conf/http.password. nginx работает в jail, и путь к этому файлу нужно указывать такой, чтобы nginx имел к нему доступ во время работы в jail.
Последние строки в конфиге указывают куда проксировать нужное.

Вообще-то тут нет ничего сложного. Если не нужна авторизация - нужно просто убрать нужные две строки. Конфигурация nginx проста.
Но я этот кусок написал к тому что с самого начала я указал кусочек конфигурации nginx для работы lightsquid. Теперь этот кусочек есть куда вставить.
Не забудьте открыть нужный порт в pf.
Ну вот пожалуй и всё! Я рассказал некоторые аспекты при работе с системой openbsd, хотя она конечно очень похожа на другие системы. Внимательный читатель наверное заметил как просто и удобно работает pf, как просто настраивать сервисы и что они лежат на своих местах а не обитают непонтяно где в системе.
Последнее что мне осталось для финальной четвёрой статьи - описать действительно тонкости системы, которые имеются, а я их упустил. Пусть даже всё это есть в faq на сайте openbsd.org, но может быть не все у нас хорошо знают английский, а я опишу самые важные вещи по-русски. Это будет очень короткая статья, и скорее всего я размещу её не тут, а в разделе по BSD системам, а тут оставлю ссылку. Потому что это будет всё-таки не проект, а просто мой вольный перевод.

So long, and thanks for all the passwords!
Просмотры


10 Nov 2016 - 21:54


2 Nov 2015 - 12:32


29 May 2014 - 10:28


17 May 2013 - 8:08


24 Apr 2012 - 11:25


Друзья
Друзей нет.
RSS Текстовая версия Сейчас: 28th June 2017 - в 22:14




Rating@Mail.ru