Домашний сервер — ESXi, паранойя

Доброго времени суток, уважаемые хабровчане!

На хабре много статей, про то настройку тех или иных кусочков домашнего сервера. Хотелось бы поделиться еще одним вариантом построения домашней сети, нацеленной на сисадмина или разработчика. На этот раз на базе ESXi.

Кого заинтересовало — добро пожаловать под кат.

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

Начнем с самого сервера — IBM System X3200 M2. Достался он мне практически даром. Узнал от друга, что его друг продает какой-то сервер. Созвонились, встретились, и — вуаля, сервер после небольшого моддинга, занял почетное место старой машинки на базе еще Celeron'a 1.8. Должен отметить правда, что корпус был слегка помят, а именно, не хватало нижней части передней крышки, а внутри не было оперативной памяти вообще. Но это мелочи. Сложнее оказалось достать 2 недостающие салазки в корзину. В городе в прямой продаже нет, в специализированных магазинах под заказ — ждать 1.5 мес и сумма 1.5к за штуку… отказался от этой идеи. Заказал с Китая за 500р с доставкой, пришли за те же 1.5 мес.

Итого имеем:

  1. Сервер IBM System X3200 M2
    • Intel® Xeon® X3320 2.5GHz
    • 4Г DDR2 800MHz
    • 5 жестких дисков общим объемом около 2TB (без рейда)
    • ESXi
  2. Ноутбук Asus F3SE (заменяет мне комп — стационарной машины, кроме сервера у меня нет, фактически, это мое рабочее место и средство для развлечений),
  3. Точка доступа LinkSys WRT54GS v7 (WAN, 4xLAN 100Mb,WiFi), перепрошитая с dd-wrt micro (эх, сколько мы с ней пережили :) ),
  4. Телефон с WiFi — Nokia E52.


Цели конечной системы:

  1. Максимально разгрузить ноутбук по программному обеспечению,
  2. Предоставить платформу для разработки и тестов (схема примерно такая: установил, настроил, попробовал, выключил; когда понадобилось — включил заново),
  3. Вместе со смотрящими в сеть сервисами, обеспечить корпоративный уровень защиты сервера и данных. В случае дилеммы «функционал/безопасность» выбирать безопасность.


Итак, приступим к самой интересной части. С этого момента будем считать, что сервер подключен к сети, функционирует 24/7, есть безлимитный интернет, установлен ESXi, создано несколько гостевых систем (win2k8 — 1шт, winxp — 1шт, Fedora 14 — N шт в минимальной конфигурации, или любой другой дистрибутив по вкусу и цвету), если где-то что-то запускается (mc, nano, sudo и прочее), то подразумевается, что оно уже установлено.

Шаг 1. Выбор функционала

Что же нам будет необходимо?
  1. Веб сервера (Apache, IIS, GlassFish/Tomcat),
  2. СУБД (MSSQL, MySQL, FireBird, PostgreSQL),
  3. Torrent-клиент, FlyLinkDC клиент,
  4. SSH доступ ко всем linux-серверам, RDP до одного из Win серверов,
  5. Файловое хранилище.


Шаг 2. Архитектура сети


И вот что у нас примерно должно получиться:
image

Хочу сразу предостеречь уважаемых хабровчан от холивара на тему организации данной сети, она продиктована некоторыми субъективными требованиями, и, пока что, изменяться может только виртуальная ее часть. Простите, но «так исторически сложилось». Однако, конструктивная критика приветствуется. Учту в дальнейшем.

Как видно из диаграммы, из всех виртуальных машин, к физической сети подключена только одна — GALAXY. Этот сервер будет являться шлюзом ко всем виртуальным машинам, будет следить за доступом к важным портам (SSH, RDP) а также вести разнообразные логи.

Шаг 3. Настройка шлюза

Не мудрствуя лукаво, выложу конфиг фаирвола со своего шлюза, с небольшими изменениями. Само собой, все интерфейсы подняты, настроены статические IP, прописаны DNSы, шлюзы, на точке настроен необходимый NAT. Прошу прощения, но все IP и порты заменены или затерты. В этом плане — я параноик если что. :)

firewall.sh
#!/bin/sh

modprobe ip_nat_ftp
modprobe ip_conntrack_ftp
modprobe nf_conntrack_tftp

ipt='/sbin/iptables'

home='#.#.#.#/24'
vmnet='#.#.#.#/24'
mehome='#.#.#.#'
mevmnet='#.#.#.#'

venera='#.#.#.#'

${ipt} -F -t nat
${ipt} -F -t filter
${ipt} -F -t mangle

#established
${ipt} -t filter -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
${ipt} -t filter -A OUTPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT

#allow forwarding
echo "1" > /proc/sys/net/ipv4/ip_forward
${ipt} -t filter -P FORWARD DROP

#log some new connections
${ipt} -A INPUT -m state --state NEW -p tcp --dport 12121 -j LOG --log-level INFO --log-prefix "SSH-NEW : "
${ipt} -A FORWARD -m state --state NEW -d ${venera} -j LOG --log-level INFO --log-prefix "VENERA : "

#localhost
${ipt} -t filter -A INPUT -i lo -j ACCEPT

#icmp home
${ipt} -t filter -A FORWARD -p icmp -s ${home} -j ACCEPT
${ipt} -t filter -A FORWARD -p icmp -d ${home} -j ACCEPT
${ipt} -t filter -A INPUT -p icmp -s ${home} -j ACCEPT
${ipt} -t filter -A OUTPUT -p icmp -d ${home} -j ACCEPT
#icmp vmnet
${ipt} -t filter -A FORWARD -p icmp -s ${vmnet} -j ACCEPT

#dns tcp
${ipt} -t filter -A INPUT -p tcp --sport 53 -j ACCEPT
${ipt} -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
${ipt} -t filter -A FORWARD -p tcp --dport 53 -j ACCEPT
${ipt} -t filter -A FORWARD -p tcp --sport 53 -j ACCEPT

#dns udp
${ipt} -t filter -A INPUT -p udp --sport 53 -j ACCEPT
${ipt} -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
${ipt} -t filter -A FORWARD -p udp --dport 53 -j ACCEPT
${ipt} -t filter -A FORWARD -p udp --sport 53 -j ACCEPT

#ssh
${ipt} -t filter -A INPUT -p tcp --dport 12121 -j ACCEPT

#nat venera (GlassFish[80->8080], SSH[3333->12121])
${ipt} -t nat -A PREROUTING -d ${mehome} -p tcp --dport 3333 -j DNAT --to ${venera}:12121
${ipt} -t nat -A PREROUTING -d ${mehome} -p tcp --dport 80 -j DNAT --to ${venera}:8080
#${ipt} -t filter -A FORWARD -d ${venera} -p tcp --dport 8080 -j ACCEPT
${ipt} -t nat -A POSTROUTING -s ${venera} -j SNAT --to-source ${mehome}
#firwarding for venera
${ipt} -t filter -A FORWARD -s ${venera} -j ACCEPT
${ipt} -t filter -A FORWARD -d ${venera} -p tcp --dport 12121 -j ACCEPT
${ipt} -t filter -A FORWARD -d ${mehome} -p tcp --dport 80 -j ACCEPT

#исходящие временное. оставьте для разрешения доступа этого сервера куда угодно
${ipt} -t filter -A OUTPUT -p all -j ACCEPT

# политика по умолчанию
${ipt} -t filter -A INPUT -p all -j DROP
${ipt} -t filter -A OUTPUT -p all -j DROP


По аналогии с сервером VENERA, настраиваем остальные сервера, включая и исключая нужные порты правилами. Обращу Ваше внимание, что блоке nat venera закомментирована 3я строчка.
Она разрешает соединения к SSH порту 12121. Закомментирована она по описанной ниже причине.

Шаг 4. Паранойя

Кульминацией сего повествования, является реализация техники port knocking.
Возможно кто-либо из вас сталкивался с этой темой, но по тем или иным причинам отбросил ее реализацию.
Кому лень Кто не может сходить по ссылке выше, в двух словах расскажу что это и с чем едят. Эта техника позволяет открывать нужный порт, только после того, как с этого же IP постучались на некую последовательность портов. Причем порты из этой последовательности могут быть даже не открыты. Достаточным признаком, является посылка на этот порт пакета с флагом SYN ( ну или другого, по вашему усмотрению). После того как последовательность верно активирована, выполняется команда, открывающая нужный порт в фаирволе. чтобы закрыть этот порт, нужно, согласно этой же технике, постучаться таким же образом на другую последовательность портов.

Само собой «все уже украдено до нас» (С). Существует демон knockd и клиент вместе с ним, реализующий данный функционал.
Все было бы достаточно просто, если бы я не столкнулся со странной проблемой. Бинарника под RPM системы нет (ткните носом, пожалуйста, если я плохо искал).
Качаем исходники, распаковываем.

./configure
make


Приехали, из исходников код не компилируется с ошибкой gcc «PATH_MAX — undeclared»… что же делать? :)
Правильно. Залезть в исходники и посмотреть что же там не так. Благо, помимо служебных файлов, там всего 4 файла: реализация клиента, сервера и реализация собственного списка (.h + .c). После недолгих размышлений вписал между существующими инклудами еще один в файле сервера:
#include <limits.h>


и все заработало :)
Кстати, с форумов народ пишет, что под FreeBSD ставят без проблем из портов, но я на своей (да, есть у меня и такая виртуалка для тестов) не пробовал. Отпишитесь, пожалуйста, об объективных результатах с последней версией.

Документация к knockd неплохая. Демон простой, удобный, проверил — работает. Так что, с Вашего разрешения, описывать его не буду, но приведу примерный конфиг для данного случая с фаирволом для полноты картины:
[options]
logfile = /var/log/knockd.log

[openSSH]
sequence = порт1,порт2,порт3
seq_timeout = 5
command = /sbin/iptables -A FORWARD -s %IP% -p tcp --dport 8080 -j ACCEPT
tcpflags = syn

[closeSSH]
sequence = порт3,порт2,порт1
seq_timeout = 5
command = /sbin/iptables -D FORWARD -s %IP% -p tcp --dport 8080 -j ACCEPT
tcpflags = syn


Дома использую несколько последовательностей для открытия разных портов к разным виртуальным машинам. К сожалению, порты выбрал только TCP, ибо с ними можно соединяться простым telnet'ом. Но как только разберусь с мобильным клиентом knockd для UDP, обязательно все сделаю как нужно.

На остальных виртуальных машинах заводим необходимые службы, настраиваем все как нам нравится. Не забываем пробросить через виртуальный шлюз нужные порты, и прописать нечто в /etc/knockd.conf, если необходимо. Пользуемся.

Выводы


Этот сервер у меня уже с конца января 2011 года. Чего я на нем только не перепробовал делать/пробовать. И разные сервисы, и Gentoo, и FBSD, и GlassFish, и фаирволы/нат, FireFox на виндовой машине через SSH + XMing и т.п. И все это в одной машине. Теперь я с уверенностью могу заявить, что виртуализация — это круто. К сожалению пока еще не удалось попробовать KVM и XEN (лайв сиди с XEN не в счет — нужно ручками пощупать), но запускать на виртуальной машине еще один гипервизор… даже для моего извращенного мозга, это слишком. Видимо просто не пришло его время.

Скоро придет из другого Китая USB звуковуха, и у меня появится навороченный будильник с управляемым производственным календарем из 1Ски. ^_^
В общем и целом, у кого есть возможность поставить сие чудо на выделенную машину — дерзайте. Возможно кому-то этот топик поможет настроить сервер на работе. Так или иначе, буду рад, что помог.

Спасибо за внимание.

P.S. Я не претендую на 100% защищенность данной схемы, но она куда лучше открытых портов, успокаивает мою параною и дает неоценимый опыт длительного использования. Само собой, стандарные порты на конечных серверах изменены, где это возможно. Не хватает блока по IP адресам злостных брутфорсеров, но это еще все впереди.

UPD: Прошу прощения, если не верно выбрал блог. Ткните, пожалуйста, носом куда лучше его поместить?
Share post

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 54

    0
    но запускать на виртуальной машине еще один гипервизор…
    и не запустите. kvm — однозначно, xen, возможно, будет в pv работать.

    лично я пробовал xen, esx и kvm, но для продакшна остановился на последнем.
    ну, ближе мне kvm оказался как-то, к привычкам и интересам :)
      0
      А виндовс севен на нем у вас завелся(на квм)?
      • UFO just landed and posted this here
          0
          замечательно завелся; xp, 2003, 2008 — аналогично.
            0
            да, забыл — я не использую паравиртуальные драйверы, после тестов мне они показались не только сырыми, но и медленными. так что обычные ide диски в эмуляции, raid 10.
            0
            Интересует именно семерка.
            На проксмоксе на дебиане не завелся.
              0
              увы, не использую панелек, только virsh.
              debian squeeze, qemu-kvm-0.12.5.
            +1
            > и не запустите
            Я имел ввиду что хотелось на физической машине XEN попробовать в первую очередь. Но Fedora только с 15й версии сможет работать как dom0 (и то в планах, а предыдущая рабочая была аж 6я). А другие дистрибутивы ставить просто не хотелось, не более того.

            А чем Вас XEN не устроил? Поделитесь опытом, пожалуйста…
              0
              просто не понравился этот набор кривых патчей к ядру.
              в xen мы и так ежедневно пялимся на амазоне, но идеологически следуем за redhat.
              для себя решили, что pv-режим нам нафиг не упал, за чем тогда патчить ядро, когда есть kvm?
              чисто субъективно мне еще не понравилось то, что есть какой-то dom0, который не видит всех ресурсов фзического хоста, и ему нужен какой-то свой отдельный top, с блекджеком и секретаршами.
                0
                Понял Вас. Спасибо. Учту и обязательно попробую и KVM.
            0
            Бинарника под RPM системы нет (ткните носом, пожалуйста, если я плохо искал).

            Под федорой 14 у меня пересобрался knock-0.5-7.el5.src.rpm для RHEL5 с офф. сайта проекта.
              0
              А веб-сервер у вас зовется SkyNet'ом ;-)
              • UFO just landed and posted this here
                  0
                  Был там, на Apache. =) через некоторое время перенес на IIS 7 (Win2k8 R2). Вот хотел попробовать как будет вести себя по производительности и удобвству GlassFish 3.1, но это чудо на виртуалке жутко тормозит. Я его еще поковыряю конечно, но пока честно скажу не впечатляет совсем.

                  Пока что Apache лидирует по удобству и отклику. IIS конечно тоже хорош, но у меня не бесконечная лицензия на Win2k8, всего год для тестов…
                • UFO just landed and posted this here
                    0
                    Нет проблем. Пробовал, работает.
                    К сожалению чипсет на материнке не поддерживает проброс PCI. Поэтому и звуковую карту заказал внешнюю.
                    • UFO just landed and posted this here
                        0
                        > Попробую и тот и тот погонять. Жаль железки с VT под рукой нет.
                        ESX(i) 3.5 отлично заведётся без VT, правда проброс usb там только через IP
                      0
                      Работает 100%. И флэшки и ключи и даже АТС Panasonic TDA-200 управляется из виртуальной машины.
                      +1
                      За knockd спасибо, не знал, хотя это все элементарно организовывается при помощи ипсета, но тут конечно красивее и функциональнее.
                      Кстати, вместе с knockd неплохо использовать ipset. Т.е. по одной комбинации заносить в перманентный список admins, по второму убирать оттуда.
                      Ибо по --state ESTABLISHED,RELATED не всегда удобно.
                        0
                        Спасибо, посмотрю на досуге.
                        0
                        кинули б уже ссылку на звуковуху а не на домашнюю страницу dx, а параноик вы жесткий однако)
                        сервачок годный получился)
                          +1
                          Прошу прощения, чего-то не догадался сразу)) USB Sound Card
                          0
                          Чем управляете ESX?
                            0
                            vSphere Client. SSH не открыт)
                              0
                              В свете вашей отличной паранои, мне интересно: а куда в сети «смотрит» управляющий интерфейс самого ESX'а?
                                0
                                В локалку, где ноут. Его IP нигде не фигурирует.
                                  0
                                  Best Practice убирать управляющие порты в отдельную физическую сеть, ну или VLAN. Понятно, что дома такое мало реально, но почему бы, например, не «спрятать» VMkernel также за Galaxy? Запускать vSphere Client в виртуалке, которая другим интерфейсом видит управляющий порт. А к ней, через шлюз, например по RDP.
                                  Мне на работе так удобнее. Клиент всегда открыт и рабочий ноут не загружен лишними процессами.
                                  А для troubleshooting'а всегда остаётся локальная консоль.
                                    0
                                    Понял. Узкое место с управляющим портом спрячу. Сразу не сделал, потому что серв стоит без монитора. Просто питание и сеть. Т.е. при потере управления с одной из важных виртуалок пропадет контроль над сервом. Непонятно было как управлять сервом при сбоях и т.п. Подумаю может в VLAN увести как-то аккуратно.
                                    Кстати по поводу проблем, столкнулся со штукой, с работы knock клиент не работает с проксей через метод HTTP CONNECT. Пробовал через FreeCap — без результата. Пока не разобрался это проблема принципиальная, или таки есть решения. Просто прокся ждет ответа от серва при попытке подключения, а порт закрыт, и естественно, мы получаем таймаут по первому порту, а дальше уже серв не принимает, ибо knockd отсекает запросы по sequence timeout.
                                      0
                                      К сожалению, про knock клинет вророй раз слышу, т.ч. ничего по этому поводу подсказать не могу.
                            0
                            А что реально на нем загружено у Вас?

                            И вообще — какой-нибудь core i3 на базе mini-ITX платы — хороший сервак будет? или лучше таки брать серверные процы? чем они лучше?
                              0
                              Смотря, что хотите крутить на этом «сервере»

                              у меня есть «сервер» на E2100 (по моему такой проц) на нём 2 виртуалки с win2003? оcновная задача mssql, оно справляется
                                0
                                Сейчас там:
                                  +1
                                  прошу прощения, ткнул случайно.
                                  Сейчас там:
                                  • Blackcat (Win2k8): uTorrent,MSSQL,IIS, Файловый сервер, FlyLinkDC++ (постоянно чего-то качает)
                                  • Skynet (Fedora 14): Apache, ispauth (небольшой скрипт для авторизации у провайдера, у нас только через веб-интерфейс можно авторизоваться), MySQL, ну и разные скрипты в cron'е.
                                  • Venera (Fedora 14): GlassFish 3.1

                                  Все сервера практически не нагружены, кроме черной кошки — там основная нагрузка на дисковую подсистему.
                                  Вообще, как говорят специалисты по виртуализации ESX, не рекомендуют виртуализировать приложения использующие много памяти. может поэтому GlassFish работает очень не шустро…
                                    0
                                    Если не сложно, дадите ссылки на подобные рекомендации? Профессиональный интерес.
                                      0
                                      У меня эта информация из уст человека, бывшего на конференции, где выступал таковой специалист. Попробую уточнить что и где это было.
                                      А есть какие-то опровержения?
                                        0
                                        Чтобы как-то дискутировать, лучше почитать первоисточники — потому я и поинтересовался ссылками. Возможно там имелись ввиду случаи интенсивной борьбы за физическую память или нечто подобное.

                                        А вообще, вот, например, блог команды архитекторов business critical App on WMware (SAP, Oracle, Java Applications...) Что-то мне подсказывает, что они тоже не соглясятся с теми экспертами :)
                                          0
                                          Понял свой косяк. Видимо медленная работа GlassFish была обоснована некорректной конфигурацией памяти. Спасибо за линк. В гугле я натыкался на эту страничку, но видимо не внимательно читал.
                                +1
                                Кстати посоветую еще одну полезную фичу, которую можно реализовать. Взять какой-то USB войс модем, например huawei e1550, и сделать на его основе Voip-Gsm шлюз. Получится эдакая мини-атс с дешевыми звонками по всему миру почти даром.
                                  0
                                  Хм, интересно, задумаюсь на досуге.
                                  На самом деле с этой чудо-машиной, простор для действий практически безграничный. :)
                                  Было бы на все время…
                                    0
                                    А чуть подробнее на эту тему можно? Или ссылочками поделитесь)
                                      +1
                                      Основной смысл такой, что этот gsm можем умеет звонить/принимать звонки с gsm/ucdma телефонов (в него просто вставляется симка). Используя эту фичу, и бесплатные внутрисетевые звонки можно организовать проброс в/из Gsm Сети в любую sip. Например хотите звонить по тарифам воип — звоните на свой номер стоящий в модеме, он поднимает трубку и дальше тоном добиваете добавочный, он переводит звонок в сип сеть. Или наоборот, звонят вам, например, на скайп, а попадают на ваш мобильный. Крутить там можно как хочешь.
                                      Модем этот стоит сущие копейки. Теоретически можно его заставить слать вам смс-ки или звонить и голосом проговаривать какие-то уведомления. :)

                                      Гуглите по запросам «voip gsm e1550 linux» «asterisk 1550 linux» или просто «asterisk linux»
                                  • UFO just landed and posted this here
                                      0
                                      мм, сейчас думаю да. Да и у меня сравнительно небольшой канал — всего 2Мб. Реализую одну идейку, выложу линк — народ получит свежего мяса, а я проверю как все работает)
                                      0
                                      тоже хочу домой ESX, есть дилемма, взять за 250-300 долларов нормальный сервер на двух xeon / opteron, но с памятью DDR1 или за 200 баксов брендовый десктоп HP/Dell в SmallFormFactor корпусе (в стойке четко 2 юнита по высоте), но уже на Core2Dou и с DDR2
                                      если есть опыт в этом вопросе, подскажите плз.
                                      ESX нужен для Cisco Call Manger, Asterisk, т.е. чисто для домашнего стенда
                                        0
                                        Я бы взял c DDR2, ибо от скорости памяти очень многое зависит. да и шина там ведь пошустрее будет…
                                        Я не в курсе, ели честно, чего больше ест IP-телефония — памяти или проца…
                                          0
                                          а Вы пробовали ставить ESX на обычное (не серверное) железо?
                                            +1
                                            я нет, но знакомый говорит, что на работе покупают и обычные железки под виртуализацию (ESX тоже). Там основная проблема с оборудованием в том плане, что
                                            1. должна быть поддержка виртуализации в процессоре, Intel VT-x
                                            2. Если нужен проброс PCI, то надо поддержку в чипсете Intel VT-d, вики
                                            3. Есть список поддерживаемых ESX устройств, так что от него и пляшут.

                                            Последний пункт, собственно, самый важный. Нужен ли Вам RAID массив, и прочее…
                                              0
                                              в обычных железках часто стоят неподдерживаемые ESXом сетевухи…
                                              0
                                              1. Как я уже замечал выше, для большого круга «домашних» задач можно обойтись и без технологии VT-x.
                                              2. Существует весьма большой неофициальный список совместимисти. Там полно небрендового, но проверенного на работоспособность железа.
                                              3. Вообще, по опыту, кроме CPU, важно иметь проверенный RAID-контроллер (см. пункт 2) и интеловую сетевую (хотя умельцы заводят и другие). Остальное всё менее критично.

                                              PS: если хотите, стукнитесь в личку — попробую поделиться опытом в плане подбора железа
                                                0
                                                спасибо за ответ, вопрос решился покупкой нормального сервера занедорого :)
                                          0
                                          Прошу прощения, но все IP и порты заменены или затерты. В этом плане — я параноик если что. :)

                                          А на картинке?
                                            0
                                            Тоже заменены.
                                            0
                                            Пришла долгожданная звуковуха) видимо скоро будет интересный будильник. Есть предложения чего бы такого реализовать? по окончании напишу отчет =)

                                            Only users with full accounts can post comments. Log in, please.