понедельник, 24 августа 2009 г.

Снова патч Бармина

Все-таки ездить без тормозов бывает достаточно чревато. Благоприобретенные рефлексы притупляют бдительность и легко в поворот на вписаться.

Я уже писал, что Солярис постепенно приобретает защиту от дурака.

Однако, не от всякого. ;) Есть дурак изобретательный. :)

Привычка писать команды быстро иногда играет дурную службу. Выполняя одну вполне рутинную задачу - обновление одного софтверного пакета общего назначения на одном из серверов, я сам из-за тривиальной опечатки выполнил рутом от рута rm *.

Оно бы все ничего, ни одна директория не пострадала, ну, отругался на корневые директории, однако побился один системный линк, а именно:

lrwxrwxrwx 1 root root 9 May 13 11:55 bin -> ./usr/bin

А на машине у всех пользователей, включая рута, шелл - /bin/bash.

Ой! Что-то страшно!

И не пускает, говорит, No shell.

Правильно, в файле паролей что написано?

root @ myhost / # cat /etc/passwd
root:x:0:0:Super-User:/:/bin/bash

Ага. Рутом, чтобы поменять шелл, не зайдешь. Никем с этим шеллом - не зайдешь. Машинка на ZFS, конечно, было бы с чего стартовать - 5 минут работы, однако...

Машина - стартует. Хоть и не все сервисы. Даже приходит в мультиюзер. Только логиниться не дает.

Перезапускаем кнопкой, лезем в меню GRUB, пробуем запустить в single.

Запускается.

Спрашивает пароль рута. Говорим. И, о чудо - ругнувшись пару раз на отсутствующий шелл, запускает-таки Борн.

Уф. Пронесло.

Смотрим жертвы и разрушения. /usr/bin присутствует со всем содержимым. Повезло, что не -rf опции были. Ссылки /bin нет. Создаем:

# ln -s /usr/bin /bin

Выходим-заходим-перегружаемся.

Авек плезир.

"Реконструкция завершена!"

Моралистам, желающим тыкнуть "Не сиди под рутом", замечу вот что - pkgadd/pkgrm не под рутом не работает.

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

четверг, 20 августа 2009 г.

Семь раз отмерь, потом еще семь раз отмерь - потом один раз отрежь немного

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

Итак,

Первая категория.

Вместо того, чтобы качать мышыцы в заклинательном покое*, наши джентльмены лениво прожигают жизнь в Великой Сети, однако тратят там время отнюдь не на профессиональные нужды. Пользуясь тем, что большая часть их хозяйства худо-бедно - однако работает, они уныло плывут по течению и, в подавляющем большинстве случаев, когда жареная птица клюнет в нижние 90, даже не способны самостоятельно нагуглить нужный ответ в инете (даже если он находится в первых трех хитах по тривиальному запросу - но зато на форумы - смотри ниже - они приходят с криком "Я ничего в интернете не нашел по теме!". Ясный пень - он и не искал, надеясь, что уже кто-то за него всю работу сделал и просто плюнет в рот жеваной морковкой - даром. Как раз с таких остолопов и лупит бабки за ответы ставший уже знаменитым Experts exchange);

при необходимости решения какой-либо задачи оказывается (внезапно, о как!), что дряблые растренированные мозговые мышыцы шевелить - это не в курилке трындеть и пальцы гнуть перед планктоном, и что задачу решать-таки нужно, соответственно, начинается лихорадочная беготня по форумам с отчаянными криками, что "Все пропало, шев, все пропало!" и в поисках максимально готового решения, ибо мозгой шевелить-таки неприкольно, а шев уже клюет в нижние 90, как орел - Прометея клевал в печень;

поскольку форумы, как правило (исключения весьма редки), состоят из анонимных вась пупкиных, зовут которых никто и мнение которых никак, уровень советов соответствующий, что, однако, совсем не мешает данной категории принимать мнения за абсолют и размахивать ими потом как флагом перед неофитами, уверяя, что сие и есть Истина (за примерами далеко ходить не нужно, например, всем известный форум, анонимный гуру которого как-то вещнул, что native compilation в Оракле-де дает всего 1% выигрыша в производительности и вообще вещь нестоящая), причем - что характерно - сами они не пробовали проделать то, на что ссылаются;**

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

На работе обычно находятся с 9 до 18, продуктивность стремиться к нулю, и, по мнению дилетантов, они и являются идеалом айтишника. (На самом деле они принципиально ничего не добиваются в профессиональном плане, поскольку ничегошеньки для этого не делают).

Вторая категория.

Вторая категория - о, это особый случай. Это дзен, это созерцание, это RMS в кубе!

Категория, почти абсолютно похожая на первую, но с двумя существенными разницами:

1. Под анекдотическим ретроградством и патологическим нежеланием что-либо делать по работе лежит солидный философский фундамент: "Любой новый софт/хард/функционал по определению дыряв/глюкав/сырой" (нужное подчеркнуть) и "нужно выждать один/два/три/пять/десять релизов, чтобы исправили, а лучше дождаться EOL и пару лет после, тогда и бороться будет не с чем либо все баги исправят" (То, что при этом продукт уже физически не поддерживается и отсутсвие патчей означает не залатывание всех дыр, а всего лишь полное прекращение всех фаз саппорта, в их возвышенные дзен-головы как-то не приходит).

2. При возникновении около седалища жареной птички либо включается оба полушария мозга на всю мощь (в случае истинных но скрытых гениев IT) и задача решается на "раз-два-три!" а затем снова медитация, либо задача откидывается как несущественная для постижения сути дзен и не решается никогда.

Как и в первой категории, истинный вес обычно стремиться к нулю - ибо лениво к высотам переться, зато "я ангел, а вы все черти, чорные, как сисадмин". ;)

На работе находятся значительно за пределами 9-18, но проводят время в глубокомысленном чтении высокодуховных почтовых рассылок и дискуссий Настоящих Айтишников, однако сами почти никогда к дискуссиям не присоединяются - либо влом, либо сказать нечего.

Тоже ничего не добиваются как профессионалы (обычно), поскольку влом-м-м-м.... Надо ж напрягаться, работать, а блаженное ничегонеделание и ощущение сопричастности к Великим греет и наполняет ощущением значимости....

Третья категория.

Вновь появившаяся. Совершенный неологизм.

Щенячий энтузиазм в кубе.

Лучше всего характеризуется поговорками "Слышал звон, но не знает, где он" и "Куда конь с копытом - туда и рак с клешней".

Услышав (обычно на курсах) о новом функционале от кого-то опытного, причем слушая через слово, они стремглав кидаются, не покурив толком маны и не имея заклинательного покоя (либо желания там тренироваться, старшОй же сказал что все элементарно и даже САМ показал насколько все просто ;)), к боевым серверам. Которым, по описанным в предыдущем предложении причинам, вследствие этого приходит быстрый и обычно необратимый песец. Или БАП. (Я сознательно опускаю ссылку на реальный БАП-2, отголоски и заклинания коего описаны в предыдущей статье. Аффтар БАП-2 меня понял ;)).

Дорогой младший брат! То, что старший рассказывает и показывает легко и непринужденно - это следствие многолетней каждодневной практики! Полезешь крутить "солнышко" на турнике вслед за мастером спорта - шею свернешь нафиг! Исключения бывают - но они редки, как чорный сисадмин жемчуг.

В принципе, если у данной категории отобрать синий кабель, оным кабелем разукрасить нижние 90, выгнать ссаными тряпками из серверной, забрать пароль рута и пару лет его не давать, запереть в заклинательном покое, до предъявления доказательств компетентности к боевым машинам на выстрел не подпускать - из нее иногда произрастает четвертая категория.

Рабочее время айтишников третьей категории приближается к кондициям четвертой категории, однако они еще пытаются усидеть на двух стульях между работой и драйвингом, бабслеем, спиртвеем, игроманией, видеофильмами и прочим более увлекательным времяпрепровождением.... (наивные...). При сохранении тенденции, и подправляемые время от времени мощными пинками старших братьев, иногда имеют шанс на старости лет даже премию Тьюринга отхватить (две предыдущие категории такого шанса не имеют априорно - в силу своего особого мозгоустройства). Правда, на этом пути подстерегает карьера продавца сосисок на базаре или мойщика посуды в кафе - как результат особо рокового БАП, сотворенного руками означенной третьей категории в результате недосмотра старших братьев из второй категории. ;)

Четвертая категория.

Наиболее продвинутая категория.

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

А также либо гениальными мозгами - позволяющими иногда добиваться-таки премии Тьюринга, либо исключительно твердой задницей и отсутствием лени + любознательность (что является исключительно адекватной заменой истинной гениальности).

Как правило, упираются всю свою жизнь, беспредельно накачивая мышцы и становясь overcvalified (истинное проклятие в устах рекрутеров для оной категории!) - либо получают-таки премию Алана и остаток дней почивают на лаврах.

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

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

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

___________________________________
Самое интересное, что писать я, в общем-то, собирался совсем о другом - о свойствах второй и третьей категории и того, что из этого проистекает ввиду доминирования двух упомянутых категорий.

Но если вы вдруг испытываете баттхёрт от того, что узнали себя в одной из описанных категорий - смиритесь с этим фактом, ибо каменты один черт отключены, нагадить в них низ-зя и отключены они насовсем. ;)

PS. Аффтар хоть и жжот, но в ней - намек. Это не полная и даже не всеобъемлющая классификация профессиональных искривлений, в частности, я опустил девелоперов, внедренцев, саппортников, консультантов, эникейщиков и других, однако основные категории визуально опознаются при встрече четко.
___________________________
* Оставим пока в покое тот факт, что заклинательный покой еще необходимо иметь или создать. Это не имеет отношения к теме статьи, поскольку тот, кто желает - ищет возможности, кто не желает - ищет причины. С другой стороны, не каждый имеет под задницей сановскую лабораторию с сервером JumpStart для ураганной переустановки пострадавших машин с flash-архивов либо собственный Sun-ок для игрищ с блудницами "на убой".Лучше потратить средства не на приобретение камня Мерлина в заклинательный покой, а на трэш-угар-и содомию, не так ли? ;) Ну или, как минимум, просадить в MMORPG...

** Как писал еще О'Генри в рассказе "Как скрывался Черный Билл": "... как говорил двоюродный брат одного ковбоя, видевшего Черного Билла в Матаморасе."

вторник, 11 августа 2009 г.

Как убить ZFS root pool

Вы не поверите, коллеги, но при всей легендарной устойчивости ZFS ко всякого рода шаловливой деятельности админов, существует-таки вполне легитимный способ ушатать ее - да не что попало, а зеркалированный root pool, это воплощение надежности!

Впрочем, давайте по порядку.

Ноги, как всегда, растут из той незыблемой аксиомы, что вдумчиво курил маны и знал их наизусть лишь один Чорный Сисадмин.

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

Факт номер два, неочевидный. При создании ZFS пула с использованием сокращенной нотации дисков (то есть cxtydz вместо, скажем, cxtydzs0) командой zpool create c0t0d0, на указанном диске без единого предупреждения выносится метка диска и вместо нее записывается метка EFI, с единственным слайсом на весь диск. То же самое произойдет и при выполнении соманды zpool attach [имя пула] c0t1d0s0 c0t0d0. На диске c0t0d0 будет создана метка EFI и он будет приаттачен к пулу, даже если это root pool*.

_____________________________
* Теперь это не особенность, а баг 6740164. В обновлении в конце статьи дополнительная информация.

Факт номер три. Диск с EFI-меткой не является загружаемым в текущих релизах Солярис при использовании ZFS.

Хотя думающий прямо сисадмин и не станет пытаться ставить или мигрировать ZFS root pool не на слайсы, иногда это пытаются сделать, проигнорировав предупреждение мануала.

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

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

Итак, вперед и с песней. Поехали резать кошек.

На исходной позиции мы имеем свежеотмигрированную систему Solaris 10 5/09 на единственном слайсе s0:

server5# zpool status
pool: rpool
state: ONLINE
scrub: none requested
config:

NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
c0t1d0s0 ONLINE 0 0 0

errors: No known data errors

Приаттачим теперь к пулу второй диск в сокращенной нотации и посмотрим, получится ли:

server5# zpool attach -f rpool c0t1d0s0 c0t0d0
server5# zpool status
pool: rpool
state: ONLINE
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scrub: resilver in progress for 0h0m, 0.15% done, 0h32m to go
config:

NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
mirror ONLINE 0 0 0
c0t1d0s0 ONLINE 0 0 0
c0t0d0 ONLINE 0 0 0

errors: No known data errors

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

Проверим факт номер два:

server5# format -e
Searching for disks...done

AVAILABLE DISK SELECTIONS:
0. c0t0d0
/pci@1e,600000/pci@0/pci@a/pci@0/pci@8/scsi@1/sd@0,0
1. c0t1d0
/pci@1e,600000/pci@0/pci@a/pci@0/pci@8/scsi@1/sd@1,0
Specify disk (enter its number): 0
selecting c0t0d0
[disk formatted]
/dev/dsk/c0t0d0s0 is part of active ZFS pool rpool. Please see zpool(1M).

FORMAT MENU:
disk - select a disk
type - select (define) a disk type
partition - select (define) a partition table
current - describe the current disk
format - format and analyze the disk
repair - repair a defective sector
label - write label to the disk
analyze - surface analysis
defect - defect list management
backup - search for backup labels
verify - read and display labels
inquiry - show vendor, product and revision
scsi - independent SCSI mode selects
cache - enable, disable or query SCSI disk cache
volname - set 8-character volume name
! - execute , then return
quit
format> partition

PARTITION MENU:
0 - change `0' partition
1 - change `1' partition
2 - change `2' partition
3 - change `3' partition
4 - change `4' partition
5 - change `5' partition
6 - change `6' partition
7 - change `7' partition
8 - change '8' partition
select - select a predefined table
modify - modify a predefined partition table
name - name the current table
print - display the current table
label - write partition map and label to the disk
! - execute , then return
quit
partition> print
Current partition table (original):
Total disk sectors available: 143358320 + 16384 (reserved sectors)

Part Tag Flag First Sector Size Last Sector
0 usr wm 256 68.36GB 143358320
1 unassigned wm 0 0 0
2 unassigned wm 0 0 0
3 unassigned wm 0 0 0
4 unassigned wm 0 0 0
5 unassigned wm 0 0 0
6 unassigned wm 0 0 0
7 unassigned wm 0 0 0
8 reserved wm 143358321 8.00MB 143374704

И правда, метка EFI! Тем временем у нас завершился ресильверинг, пул вполне себе здоров:

server5# zpool status
pool: rpool
state: ONLINE
scrub: resilver completed after 0h3m with 0 errors on Tue Aug 11 12:48:20 2009
config:

NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
mirror ONLINE 0 0 0
c0t1d0s0 ONLINE 0 0 0
c0t0d0 ONLINE 0 0 0

errors: No known data errors

Теперь смертельный номер. Сейчас мы попытаемся нарушить ограничения и переаттачим первый диск пула как весь диск:

server5# zpool detach rpool c0t1d0s0
server5# zpool status
pool: rpool
state: ONLINE
scrub: resilver completed after 0h3m with 0 errors on Tue Aug 11 12:57:01 2009
config:

NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
c0t0d0 ONLINE 0 0 0

errors: No known data errors

server5# zpool attach rpool c0t0d0 c0t1d0
server5# zpool status
pool: rpool
state: ONLINE
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scrub: resilver in progress for 0h0m, 0.17% done, 0h29m to go
config:

NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
mirror ONLINE 0 0 0
c0t0d0 ONLINE 0 0 0
c0t1d0 ONLINE 0 0 0

errors: No known data errors

Йо-хо-хо, у нас zfs root pool на целых дисках с EFI-метками! Конец света!

Нельзя ли прямо сейчас, пока мы не перезагрузились, вернуть все взад?

server5# zpool detach rpool c0t0d0
server5# zpool status
pool: rpool
state: ONLINE
scrub: resilver completed after 0h3m with 0 errors on Tue Aug 11 13:05:36 2009
config:

NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
c0t1d0 ONLINE 0 0 0

errors: No known data errors
server5# format -e
Searching for disks...done

AVAILABLE DISK SELECTIONS:
0. c0t0d0
/pci@1e,600000/pci@0/pci@a/pci@0/pci@8/scsi@1/sd@0,0
1. c0t1d0
/pci@1e,600000/pci@0/pci@a/pci@0/pci@8/scsi@1/sd@1,0
Specify disk (enter its number): 0
selecting c0t0d0
[disk formatted]

FORMAT MENU:
disk - select a disk
type - select (define) a disk type
partition - select (define) a partition table
current - describe the current disk
format - format and analyze the disk
repair - repair a defective sector
label - write label to the disk
analyze - surface analysis
defect - defect list management
backup - search for backup labels
verify - read and display labels
inquiry - show vendor, product and revision
scsi - independent SCSI mode selects
cache - enable, disable or query SCSI disk cache
volname - set 8-character volume name
! - execute , then return
quit
format> label
[0] SMI Label
[1] EFI Label
Specify Label type[1]: 0
Warning: This disk has an EFI label. Changing to SMI label will erase all
current partitions.
Continue? y
Auto configuration via format.dat[no]?
Auto configuration via generic SCSI-2[no]?
format> partition

PARTITION MENU:
0 - change `0' partition
1 - change `1' partition
2 - change `2' partition
3 - change `3' partition
4 - change `4' partition
5 - change `5' partition
6 - change `6' partition
7 - change `7' partition
select - select a predefined table
modify - modify a predefined partition table
name - name the current table
print - display the current table
label - write partition map and label to the disk
! - execute , then return
quit
partition> print
Current partition table (default):
Total disk cylinders available: 14087 + 2 (reserved cylinders)

Part Tag Flag Cylinders Size Blocks
0 root wm 0 - 25 129.19MB (26/0/0) 264576
1 swap wu 26 - 51 129.19MB (26/0/0) 264576
2 backup wu 0 - 14086 68.35GB (14087/0/0) 143349312
3 unassigned wm 0 0 (0/0/0) 0
4 unassigned wm 0 0 (0/0/0) 0
5 unassigned wm 0 0 (0/0/0) 0
6 usr wm 52 - 14086 68.10GB (14035/0/0) 142820160
7 unassigned wm 0 0 (0/0/0) 0

partition> 6
Part Tag Flag Cylinders Size Blocks
6 usr wm 52 - 14086 68.10GB (14035/0/0) 142820160

Enter partition id tag[usr]: unassigned
Enter partition permission flags[wm]:
Enter new starting cyl[52]: 0
Enter partition size[142820160b, 14035c, 14034e, 69736.41mb, 68.10gb]: 0gb
partition> 0
Part Tag Flag Cylinders Size Blocks
0 root wm 0 - 25 129.19MB (26/0/0) 264576

Enter partition id tag[root]:
Enter partition permission flags[wm]:
Enter new starting cyl[0]: 0
Enter partition size[264576b, 26c, 25e, 129.19mb, 0.13gb]: 14086e
partition> label
[0] SMI Label
[1] EFI Label
Specify Label type[0]: 0
Ready to label disk, continue? y

partition> ^D
server5#

server5# zpool attach -f rpool c0t1d0 c0t0d0s0
cannot attach c0t0d0s0 to c0t1d0: device is too small

Соотношения разделов s0 SMI и EFI:

Total disk cylinders available: 14087 + 2 (reserved cylinders)

Part Tag Flag Cylinders Size Blocks
0 root wm 0 - 14086 68.35GB (14087/0/0) 143349312
1 swap wu 26 - 51 129.19MB (26/0/0) 264576
2 backup wu 0 - 14086 68.35GB (14087/0/0) 143349312
3 unassigned wm 0 0 (0/0/0) 0
4 unassigned wm 0 0 (0/0/0) 0
5 unassigned wm 0 0 (0/0/0) 0
6 unassigned wm 0 0 (0/0/0) 0
7 unassigned wm 0 0 (0/0/0) 0

Total disk sectors available: 143358320 + 16384 (reserved sectors)

Part Tag Flag First Sector Size Last Sector
0 usr wm 256 68.36GB 143358320
1 unassigned wm 0 0 0
2 unassigned wm 0 0 0
3 unassigned wm 0 0 0
4 unassigned wm 0 0 0
5 unassigned wm 0 0 0
6 unassigned wm 0 0 0
7 unassigned wm 0 0 0
8 reserved wm 143358321 8.00MB 143374704

server5# format -e
Searching for disks...done

AVAILABLE DISK SELECTIONS:
0. c0t0d0
/pci@1e,600000/pci@0/pci@a/pci@0/pci@8/scsi@1/sd@0,0
1. c0t1d0
/pci@1e,600000/pci@0/pci@a/pci@0/pci@8/scsi@1/sd@1,0
Specify disk (enter its number): 0
selecting c0t0d0
[disk formatted]

FORMAT MENU:
disk - select a disk
type - select (define) a disk type
partition - select (define) a partition table
current - describe the current disk
format - format and analyze the disk
repair - repair a defective sector
label - write label to the disk
analyze - surface analysis
defect - defect list management
backup - search for backup labels
verify - read and display labels
save - save new disk/partition definitions
inquiry - show vendor, product and revision
scsi - independent SCSI mode selects
cache - enable, disable or query SCSI disk cache
volname - set 8-character volume name
! - execute , then return
quit
format> partition

PARTITION MENU:
0 - change `0' partition
1 - change `1' partition
2 - change `2' partition
3 - change `3' partition
4 - change `4' partition
5 - change `5' partition
6 - change `6' partition
7 - change `7' partition
select - select a predefined table
modify - modify a predefined partition table
name - name the current table
print - display the current table
label - write partition map and label to the disk
! - execute , then return
quit
partition> 0
Part Tag Flag Cylinders Size Blocks
0 root wm 0 - 14086 68.35GB (14087/0/0) 143349312

Enter partition id tag[root]:
Enter partition permission flags[wm]:
Enter new starting cyl[0]: 0
Enter partition size[143349312b, 14087c, 14086e, 69994.78mb, 68.35gb]: 143358320b
`143358320b' is out of the range 0 to 143349312
Enter partition size[143349312b, 14087c, 14086e, 69994.78mb, 68.35gb]:

Оба-на, низ-зя! Диски одинаковые, а слайсы с метками EFI и SMI разные по размеру, мизерно разные - 0,01 Гб, сиречь восемь секторов - однако уже ничего влегкую назад не вернуть.

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

server5# zpool status
pool: rpool
state: ONLINE
scrub: resilver completed after 0h3m with 0 errors on Tue Aug 11 13:53:49 2009
config:

NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
mirror ONLINE 0 0 0
c0t1d0 ONLINE 0 0 0
c0t0d0 ONLINE 0 0 0

errors: No known data errors

server5# init 6
server5# svc.startd: The system is coming down. Please wait.
svc.startd: 94 system services are now being stopped.
svc.startd: The system is down.
syncing file systems... done
rebooting...

SC Alert: Host System has Reset
Probing system devices
Probing memory
Probing I/O buses
screen not found.
keyboard not found.
Keyboard not present. Using ttya for input and output.
Probing system devices
Probing memory
Probing I/O buses

Sun Fire V215, No Keyboard
Copyright 2008 Sun Microsystems, Inc. All rights reserved.
OpenBoot 4.30.0.a, 1024 MB memory installed, Serial #80951694.
Ethernet address 0:14:4f:d3:39:8e, Host ID: 84d3398e.

Rebooting with command: boot
Bad magic number in disk label
Can't open disk label package
Boot device: /pci@1e,600000/pci@0/pci@a/pci@0/pci@8/scsi@1/disk@0,0:a File and args:
Bad magic number in disk label
Can't open disk label package
Evaluating:

Can't open boot device

ok

Ой. Померла.

Если, однако не перезагружаться или если останется хотя бы одно зеркало на слайсе, вернуть систему в исходное положение все же можно. Просто детачим EFI-зеркала, переразбиваем их с помощью format -e и возвращаемся к правильному положению легко и просто.

Но мы же храбрые парни, ломать так ломать.

Итак, померла покойница. Бедный многострадальный server5, предлагаю почтить его память вста...

Вопрос первый. Можно ли для начала хотя бы достать с пула какие-нибудь данные? (В крайнем случае, брутально переустановим систему, да?)

ok boot net -s

........

# zpool import
pool: rpool
id: 16520876323152732858
state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:

rpool ONLINE
mirror ONLINE
c0t1d0 ONLINE
c0t0d0 ONLINE
# zfs list
no datasets available
# zpool import rpool
cannot mount '/rpool': failed to create mountpoint
cannot mount '/rpool/ROOT': failed to create mountpoint
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
rpool 9.08G 57.9G 95K /rpool
rpool/ROOT 6.58G 57.9G 18K /rpool/ROOT
rpool/ROOT/zfsBE 6.58G 57.9G 6.58G /
rpool/dump 512M 57.9G 512M -
rpool/swap 2.00G 59.9G 16K -

Гхм. Пул импортировался. Можно монтировать датасет и выволакивать данные.

(Да, я в курсе, что политкорректно будет сменить точку монтирования пула на /a и после этого уже достукиваться до контента пула итп. Процитированная выше последовательность написана для представителей интеллектуального большинства ;) )

Однако - нельзя ли все же что-нибудь втереть или вправить или еще что-нибудь, дабы не поступать по-окошечному, и не переустанавливаться?

# zpool status
pool: rpool
state: ONLINE
scrub: none requested
config:

NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
mirror ONLINE 0 0 0
c0t1d0 ONLINE 0 0 0
c0t0d0 ONLINE 0 0 0

errors: No known data errors
# zpool detach rpool c0t1d0
# zpool status
pool: rpool
state: ONLINE
scrub: none requested
config:

NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
c0t0d0 ONLINE 0 0 0

errors: No known data errors
# format -e
Searching for disks...done

AVAILABLE DISK SELECTIONS:
0. c0t0d0
/pci@1e,600000/pci@0/pci@a/pci@0/pci@8/scsi@1/sd@0,0
1. c0t1d0
/pci@1e,600000/pci@0/pci@a/pci@0/pci@8/scsi@1/sd@1,0
Specify disk (enter its number): 1
selecting c0t1d0
[disk formatted]

FORMAT MENU:
disk - select a disk
type - select (define) a disk type
partition - select (define) a partition table
current - describe the current disk
format - format and analyze the disk
repair - repair a defective sector
label - write label to the disk
analyze - surface analysis
defect - defect list management
backup - search for backup labels
verify - read and display labels
inquiry - show vendor, product and revision
scsi - independent SCSI mode selects
cache - enable, disable or query SCSI disk cache
volname - set 8-character volume name
! - execute , then return
quit
format> label
[0] SMI Label
[1] EFI Label
Specify Label type[1]: 0
Warning: This disk has an EFI label. Changing to SMI label will erase all
current partitions.
Continue? y
Auto configuration via format.dat[no]?
Auto configuration via generic SCSI-2[no]?
format> partition

PARTITION MENU:
0 - change `0' partition
1 - change `1' partition
2 - change `2' partition
3 - change `3' partition
4 - change `4' partition
5 - change `5' partition
6 - change `6' partition
7 - change `7' partition
select - select a predefined table
modify - modify a predefined partition table
name - name the current table
print - display the current table
label - write partition map and label to the disk
! - execute , then return
quit
partition> print
Current partition table (default):
Total disk cylinders available: 14087 + 2 (reserved cylinders)

Part Tag Flag Cylinders Size Blocks
0 root wm 0 - 25 129.19MB (26/0/0) 264576
1 swap wu 26 - 51 129.19MB (26/0/0) 264576
2 backup wu 0 - 14086 68.35GB (14087/0/0) 143349312
3 unassigned wm 0 0 (0/0/0) 0
4 unassigned wm 0 0 (0/0/0) 0
5 unassigned wm 0 0 (0/0/0) 0
6 usr wm 52 - 14086 68.10GB (14035/0/0) 142820160
7 unassigned wm 0 0 (0/0/0) 0

partition> 6
Part Tag Flag Cylinders Size Blocks
6 usr wm 52 - 14086 68.10GB (14035/0/0) 142820160

Enter partition id tag[usr]: unassigned
Enter partition permission flags[wm]:
Enter new starting cyl[52]: 0
Enter partition size[142820160b, 14035c, 14034e, 69736.41mb, 68.10gb]: 0gb
partition> 1
Part Tag Flag Cylinders Size Blocks
1 swap wu 26 - 51 129.19MB (26/0/0) 264576

Enter partition id tag[swap]: unassigned
Enter partition permission flags[wu]:
Enter new starting cyl[26]: 0
Enter partition size[264576b, 26c, 25e, 129.19mb, 0.13gb]: 0gb
partition> 0
Part Tag Flag Cylinders Size Blocks
0 root wm 0 - 25 129.19MB (26/0/0) 264576

Enter partition id tag[root]:
Enter partition permission flags[wm]:
Enter new starting cyl[0]: 0
Enter partition size[264576b, 26c, 25e, 129.19mb, 0.13gb]: 14086e
partition> print
Current partition table (unnamed):
Total disk cylinders available: 14087 + 2 (reserved cylinders)

Part Tag Flag Cylinders Size Blocks
0 root wm 0 - 14086 68.35GB (14087/0/0) 143349312
1 unassigned wu 0 0 (0/0/0) 0
2 backup wu 0 - 14086 68.35GB (14087/0/0) 143349312
3 unassigned wm 0 0 (0/0/0) 0
4 unassigned wm 0 0 (0/0/0) 0
5 unassigned wm 0 0 (0/0/0) 0
6 unassigned wm 0 0 (0/0/0) 0
7 unassigned wm 0 0 (0/0/0) 0

partition> label
[0] SMI Label
[1] EFI Label
Specify Label type[0]: 0
Ready to label disk, continue? y

partition> ^D
#

# zpool attach -f rpool c0t0d0 c0t1d0s0
cannot attach c0t1d0s0 to c0t0d0: device is too small

Не получается. Диски одинаковые, слайс максимальный, а, поскольку SMI-слайс чуть меньше чем с EFI - не получается. Что и требовалось доказать.

Неужели песец?

Окей, мы еще потанцуем. Так как мы влипли из-за предельного размера слайсов, отцепим одно из зеркал и попробуем приаттачить диск большего размера, только уже с нормальной меткой и слайсом во весь размер:

# format -e
Searching for disks...done

AVAILABLE DISK SELECTIONS:
0. c0t0d0
/pci@1e,600000/pci@0/pci@a/pci@0/pci@8/scsi@1/sd@0,0
1. c0t1d0
/pci@1e,600000/pci@0/pci@a/pci@0/pci@8/scsi@1/sd@1,0
Specify disk (enter its number): ^D

# zpool attach -f rpool c0t0d0 c0t1d0s0
# zpool status
pool: rpool
state: ONLINE
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scrub: resilver in progress for 0h0m, 0.17% done, 0h19m to go
config:

NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
mirror ONLINE 0 0 0
c0t0d0 ONLINE 0 0 0
c0t1d0s0 ONLINE 0 0 0

errors: No known data errors

Порядок. Остается отключить диск c0t0d0 и аналогично сделать реаттач в зеркало второго большего диска, предварительно создав на нем метку SMI и слайс 0 (гм, я не уверен, что это для всех менее брутальный, чем переустановка, способ ;)).

Есть ли менее варварский способ вернуть к жизни систему, приведенную в незагружаемое состояние описанным выше способом?

Теоретически - есть (на практике я этого не проверял ввиду отсутствия свободного времени).

Если сделать снапшот пула (до или после перезагрузки - после импорта), отправить его конвейером на другой локальный диск, скажем, размеченный в UFS (ну или по сети), переразбить исходные диски и восстановить описанным здесь способом со снапшота - есть хорошая вероятность не искать два новых диска большего размера.

Короче говоря, дорогие коллеги. Курите мануалы вдумчиво до возникновения проблемы - и вас не посетит Чорный Сисадмин.

Описанная выше проблема - это не баг ZFS, и даже не особенность. Скорей, это способ интеллектуального большинства, получив в руки кристаллический фаллос, сломать его и порезать руки до крови. ;)

Собственно, проблема в данном случае лишь одна и она сидит перед консолью. ;) Гибкость, которую предоставляет ZFS своим адептам, может быть опасной в некоторых кудрявых /dev/hands, кои /dev/hands заставляют вспомнить не к ночи помянутый режим "DEFAULT - Я недоумок" в Windows Vista. :)

Запомните, днентльмены. UNIX не считает своего админа (и даже пользователя) недоумком по определению, следовательно, такой режим ей глубоко чужд. "Используй голову, Люк!"

Небольшой совет на прощанье. Не следует полагаться на рассказы других, которые рассказы вы, к тому же, неважно помните. Берите в ваш заклинательный покой игровую машину, и тренируйтесь на ней до совершенства, которому, как известно, нет предела. Только потом подходите к боевым серверам.

"Фокусы - это ловкость рук, и никакого мошенства!"

Обновление от 12 августа 2009
_______________________

Кому-то эта особенность настолько сильно встала поперек горла, что ее посчитали багом (причем неоднократно, и здесь тоже) и исправили патчем ZFS 141909-02.

Режим "Админ-тоже недоумок" (хотя, казалось бы, прочитать мануал, где это было задокументировано с самого начала, что, большие трудности?) в действии.

Плохая новость. Патч - не публичный. Требуется техподдержка. Соответственно, до выхода нового релиза бедным крестьянам остается лишь вдумчиво курить и чтить мануалы и помнить о смерти.

понедельник, 10 августа 2009 г.

Конфигурирование IPFilter на машине-роутере/форвардере

Долгое время мне не удавалось написать удовлетворяющую меня и эффективную конфигурацию IPFilter на машинах-роутерах и форвардерах. Хотя по интернету гуляет достаточно большое количество разнообразных примеров и готовых конфигураций, все они (на мой взгляд) не являются удовлетворительными, полными либо эффективными (в плане производительности).

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

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

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

1. Машина находится внутри ДМЗ и обеспечивает контролируемый доступ из сетей ДМЗ во внутреннюю сеть, которая, в свою очередь, должна быть изолирована как ДМЗ в ДМЗ.
2. В то же время, в эту внутреннюю сеть должен быть доступ из внешней ДМЗ по целому ряду сервисов, в числе которых присутствуют SSH, X11, при этом необходимо обеспечивать невозможность транзита целого ряда протоколов во внутреннюю сеть.
3. Внутренняя сеть должна иметь доступ на машину-роутер для доступа к определенным сервисам машины-роутера - TFTP, NFS, FTP, DNS, NTP. Дополнительно, внутренняя сеть должна иметь возможность контролируемого выхода в интернет, использования внешних служб DNS, и роутер должен иметь возможность селективного запрета доступа во внешние сети по определенным портам и протоколам (например, по HTTP).
4. Кроме того, что машина является роутером, она имеет не два подключенных порта, а три, при этом, на третьем порту имеется ряд сервисов, доступ к которым осуществляется из внешней ДМЗ и интернет, и, соответственно,данный порт должен иметь полноценную защиту.
5. Разумеется, большинство сервисов машины-роутера должны быть доступны лишь из прилегающих сетей.

Задача, в общем, достаточно проста на первый взгляд. Однако лишь на первый взгляд. Большее, по отношению к бастионной машине, количество сервисов и нахождение машины в интрасети (а не в интернет) совсем не упрощает задачу конфигурирования брэндмауэра. Особенно при использовании стратегии "Запрещаем все, и лишь выбранные протоколы пропускаем" - которая является наиболее безопасной и адекватной.

Опыт написания конфигураций привел меня к нескольким основным принципам конфигурирования IPF (да и вообще любого брэндмауэра) на роутерах и форвардерах.

Перечислим эти принципы вкратце:

1. Внешний роутинговый и сервисный интерфейс конфигурируется по принципу "Все запрещено, разрешены лишь сервисные порты и порты роутинга". По сути, внешний интерфейс конфигурируется подобно бастионной машине, и отличается от конфигурации бастиона лишь некоторыми послаблениями.
2. Внутренний роутинговый интерфейс конфигурируется по принципу обратной стороны бастиона - "Разрешено практически все по пути на внешний интерфейс, лишь некоторые сервисы/хосты/сети блокируются". Не следует конфигурировать его как внешний интерфейс - прохождение пакетов сервисов и обратные сессии будут блокированы.
3. Дополнительные интерфейсы могут быть сконфигурированы и как бастион, и как роутер - в зависимости от потребности. Характер конфигурации определяется настройками роутинга/форвардинга.

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

Прежде, чем мы начнем, несколько пояснений. Данная конфигурация роутера с тремя интерфейсами, имеет следующие подключения:

# Router host
#
# Host with three interfaces:
# bge0 - external as 192.168.219.30/24 (athena)
# bge1 - internal as 192.168.219.31/24 (pallada)
# bge2 - external as 192.168.219.200/24 (zeus)

На интерфейсе bge0 присутствует трафик трех сетей - 219й (внутренней), 201й и 211й (внешних по отношению к внутренней), на интерфейсе bge1 полностью подключена 219я внутренняя сеть, интерфейс bge2 подключен внешним маршрутом к интернету и сконфигурирован как бастион (не является роутинговым). Машина сконфигурирована как статический роутер RIPv2, и является шлюзовой для доступа из сетей 201 и 211 в сеть 219.

Итак, первый блок - уже достаточно традиционный, блокирующий мусор и попытки сканирования fingerprint:

# ---------------------
# Common blocking rules
# ---------------------

# Block all IP fragments
block in quick all with frag

# Block all short IP fragments
block in quick proto tcp all with short

# Block any IP packets with options set in them
block in quick all with ipopts

# Block nmap OS fingerprint attempts
block in log first quick proto tcp from any to any flags FUP

Дабы разрешить прохождение служебных пакетов роутеров и разрешить транзит пакетов, обрабатываемых роутером, следом идет сответствующий блок (см. презентацию Glenn Brunette):

# Allow routing info
pass in quick proto udp from any to port=route
pass in quick proto icmp from any to any icmp-type 9 # Routeadvert
pass in quick proto igmp from any to any # Pass IGMP

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

Далее конфигурации роутеров традиционно имеют разрешающий блок для loopback-интерфейса:

# Make sure the loopback allows packets to traverse it
# lo0 interface
pass in quick on lo0 all
pass out quick on lo0 all

Далее определяем группы правил с привязкой к интерфейсам. Группы дают большое преимущшество в скорости обработки пакетов в сравнении с массивом не сгруппированных правил, поскольку срабатывают как единая группа при приходе пакета на интерфейс, на котором определены.

# Rules groups setup
# Group 100 - Blocked networks and/or protocols/ports
# Group 100 setup
block in all head 100
# Group 200 - Opened incoming ports on bge0
# Group 200 setup
pass in on bge0 head 200
# Group 300 - Opened incoming ports on bge1
# Group 300 setup
pass in on bge1 head 300
# Group 400 - Opened incoming ports on bge2
# Group 400 setup
pass in on bge2 head 400
# Group 700 - Outgoing and callback sessions
# Group 700 setup
pass out all head 700

При использовании групп следует иметь в виду следующие тонкости:

1. Группа как правило привязывается к интерфейсу (хотя это не закон, и не привязанные группы правил имеют свои преимущества и могут использоваться исключительно для удобства).
2. При приходе пакета на интерфейс, пакет прогоняется через группы правил, привязанные к интерфейсу и проверяется на непривязанных правилах только в случае их наличия. Таким образом, чем меньше будет несгруппированных правил в конфигурации, тем меньше накладные расходы на обработку пакета и тем выше производительность файрвола.
3. Группы не могут содержать взаимоисключающих действий, например, одновременного сочетания pass и block либо не могут быть одновременно определены для различных интерфейсов.

Следующая группа правил позволяет пинговать интерфейсы, но только из двух внешних сетей и только пропуская пакеты ICMP ECHO REQUEST и ICMP ECHO REPLY:

# Pass ICMP Echo on bge0 from internal networks
# bge0 interface
pass in quick on bge0 proto icmp from 192.168.201.0/24 to 192.168.219.0/24 icmp-type echo group 200
pass in quick on bge0 proto icmp from 192.168.211.0/24 to 192.168.219.0/24 icmp-type echo group 200
pass out quick on bge0 proto icmp from 192.168.219.0/24 to any icmp-type echorep
# Pass ICMP Echo on bge1 from internal networks
# bge1 interface
pass in quick on bge1 proto icmp from 192.168.201.0/24 to 192.168.219.0/24 icmp-type echo group 300
pass in quick on bge1 proto icmp from 192.168.211.0/24 to 192.168.219.0/24 icmp-type echo group 300
pass out quick on bge1 proto icmp from 192.168.219.0/24 to any icmp-type echorep
# Pass ICMP Echo on bge2 from internal networks
# bge2 interface
pass in quick on bge2 proto icmp from 192.168.201.0/24 to 192.168.219.200/24 icmp-type echo group 400
pass in quick on bge2 proto icmp from 192.168.211.0/24 to 192.168.219.200/24 icmp-type echo group 400
pass out quick on bge2 proto icmp from 192.168.219.0/24 to any icmp-type echorep

Мы не открываем ICMP отовсюду, а только и исключительно из интрасети. Разумеется, совсем по хорошему было бы и ответные правила echorep сделать лишь в сторону интрасети (так было бы более безопасно), однако это ощутимо увеличивает количество правил и немного снижает производительность.

Поскольку машина - роутер, установим активное правило невидимости роутера для traceroute:

# Stealth for traceroute (hide as hop)
block in quick on bge0 fastroute proto udp from any to 192.168.219.0/24 port 33434 - 33465
block in quick on bge1 fastroute proto udp from 192.168.219.0/24 to any port 33434 - 33465

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

# Anti-spoofing rules
#block in quick from 192.168.0.0/16 to any group 100
block in quick from 172.16.0.0/12 to any group 100
block in quick from 10.0.0.0/8 to any group 100
#block in quick from 127.0.0.0/8 to any group 100
block in quick from 0.0.0.0/8 to any group 100
block in quick from 169.254.0.0/16 to any group 100
block in quick from 192.0.2.0/24 to any group 100
block in quick from 204.152.64.0/23 to any group 100
block in quick from 224.0.0.0/3 to any group 100

# Anti-spoofing rules 2 - reversed
#block in quick from any to 192.168.0.0/16 group 100
block in quick from any to 172.16.0.0/12 group 100
block in quick from any to 10.0.0.0/8 group 100
#block in quick from any to 127.0.0.0/8 group 100
block in quick from any to 0.0.0.0/8 group 100
block in quick from any to 169.254.0.0/16 group 100
block in quick from any to 192.0.2.0/24 group 100
block in quick from any to 204.152.64.0/23 group 100
block in quick from any to 224.0.0.0/3 group 100

Также запретим транзит пакетов netbios через наш роутер:

# Block netbios packets
block return-rst in quick proto tcp from any to any port=135 flags S keep state group 100
block return-icmp-as-dest(port-unr) in quick proto udp from any to any port=137 group 100
block return-rst in quick proto tcp from any port=137 to any flags S keep state group 100
block return-icmp-as-dest(port-unr) in quick proto udp from any port=137 to any group 100
block return-rst in quick proto tcp from any port=138 to any flags S keep state group 100
block return-icmp-as-dest(port-unr) in quick proto udp from any port=138 to any group 100
block return-rst in quick proto tcp from any port=139 to any flags S keep state group 100
block return-icmp-as-dest(port-unr) in quick proto udp from any port=139 to any group 100

Если трафик netbios нужно пропускать, данный набор правил следует закомментировать.

Далее идет основной блок разрешающих правил для сервисов и транзитных портов. Он достаточно хорошо описан в предыдущей статье. Стоит лишь подчеркнуть один достаточно специфический блок правил, касающийся трафика X11:

# 177 port - x11 service. Disable port on Internet servers!
# Access from internal networks only
# bge0 interface
pass in quick on bge0 proto udp from 192.168.201.0/24 to 192.168.219.0/24 port=177 keep state group 200
pass in quick on bge0 proto udp from 192.168.211.0/24 to 192.168.219.0/24 port=177 keep state group 200

В нашем случае машина-роутер не является прокси-сервером X11, соответственно, мы всего лишь пропускаем XCDMP-пакеты внутрь 219й сети, обратные сессии из 201 и 211 сети устанавливаются транзитом через роутер, не открывая дисплея на самом роутере за счет блока правил возвратных сессий (описывается ниже).

Роутер является сервером DNS для 219 сети:

# 53 port - DNS
# bge1 interface
# Allow incoming DNS requests to server
pass in quick on bge1 proto tcp/udp from 192.168.219.0/24 to any port=domain keep state group 300

Также он является сервером NTP для той же самой сети:

# 123 port - NTP
# bge1 interface
# Allow incoming NTP requests to server
pass in quick on bge1 proto udp from 192.168.219.0/24 to any port=ntp keep state group 300

Завершает конфигурацию блок исходящих правил и правил для возвратных сессий сервисов (группа 700):

# Allow connections originating from local machine out
pass out quick proto tcp from any to any flags S/SA keep state group 700
# Enable outgoing UDP to use traceroute from server
# Note: We dont open it for security reasons
pass out quick proto udp from any to any keep state group 700
pass out quick proto icmp from any to any keep state group 700

И, наконец, самое главное - основные блокирующие правила:

# Finally block any unmatched
block in quick on bge0 all # On bge0
block in quick on bge2 all # On bge2

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

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

Вот и весь набор правил для роутера/форвардера. Он весьма компактен, быстро работает, и умещается менее, чем в 12 Кб.

PS. В данном примере не используется NAT/PAT. Мы рассмотрим их в одной из следующих статей.

понедельник, 3 августа 2009 г.

Кошки вкусные III

Уж сколько раз твердили миру... Кошек на самом деле нужно уметь готовить!

Снова и снова ходят феерические слухи - экстракт из пересказа пересказов неизвестного сисадмина о том, что якобы ZFS в три раза медленнее UFS.

Вот снова документ (от Sun), в котором английским по белому, внятно написано, как надо использовать семейство сториджей 7000 совместно с Oracle.

Для интересующихся - данное семейство использует ZFS в качестве volume manager/fs.

В документе яснее ясного сказано, что и как. Снова и снова - все дело в прокладке между сиденьем и клавиатурой.

Джентльмены, если вы лично не проверили что-либо на себе - не надо распространять диких слухов.

В данном случае речь идет не о существовании Бога либо реальности американского полета на Луну (хотя как раз последнее очень просто поддается не болтологической проверке - если задействовать голову - "Используй голову, Люк!" - всего-то и нужен приличный радар) - а о вполне реальных и, главное, проверяемых вещах.

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

PS. Подобно тому, как от предъявителя рекордных бенчмарков требуют точные спецификации системы (смотреть хотя бы здесь), от заявляющего, что нечто работает хуже, чем заявлено производителем, окружающие вправе спросить такие же точные спецификации и условия, в которых получили плохой результат.