Всем привет!
Сразу оговорюсь, что описанное здесь решение превосходно подойдёт и для использования в малых и средних организациях. А может, даже и в крупных...
А также, сразу оговорюсь, для чего это всё нужно было делать дома, и зачем вся эта головная боль. Нужно это было, в первую очередь, мне. Это моя блажь, которую давно хотелось воплотить в жизнь. Хотелось иметь свой личный сайт, свою личную почту и свой личный фтп-шник, и чтобы это обязательно работало на своём личном сервере, где повелителем бы я, и только я, целиком и полностью. Само собой, что и путь для этого лежит, пожалуй, самый сложный. Поэтому, тех, кого это пугает, и тех, кто не испытывает такой же блажи, эта статья не заинтересует.
Ну, а для тех, кто заинтересовался, опишу то, что имеется:
- свой домен example.com с двумя DNS-записями вида:
- www.example.com. A <ваш белый IP-адрес>
- example.com. A <ваш белый IP-адрес>
- и записью MX вида:
- example.com. MX 10 example.com.
- Также, очень желательно бы сделать ещё и PTR-запись для вашего домена у провайдера. Но мой провайдер, к сожалению, отказал мне в этом, как физическому лицу.
- Имеем небольшую квартиру, в которой не особо много места для дополнительного системника и для дополнительного источника шума.
Домен можно зарегистрировать на www.nic.ru. Там же, и сделать все нужные записи на DNS-сервере. От себя скажу, что там это всё делается очень быстро и очень удобно, даже если вы вообще в первый раз подобной процедурой занимаетесь.
Ну, а что касается железа, то оно должно было отвечать параметрам: компактный; бесшумный; непрожорливый; с некоторым запасом производительности для моих нужд. Я остановился вот на такой подборке:
http://www.nix.ru/autocatalog/motherboards_asustek/ASUS_E35M1I_E350_Hudson_M1_PCIE_DVI_SATA_MiniITX_2DDRIII_119243.html
http://www.nix.ru/autocatalog/memory_modules_corsair/Corsair_XMS3_TW3X4G1333C9A_DDRIII_4Gb_2Gb_PC310600_58601.html
http://www.nix.ru/autocatalog/ssd_kingston/SSD_SATA_6Gb_Kingston_SSDNow_V200_SV200S37A_64G_127007.html
http://www.nix.ru/autocatalog/cases_antec/DeskTop_Antec_ISK100_MiniITX_90W_115600.html
Решение действительно получилось весьма компактное и бесшумное. А также весьма сердитое для своих таких размеров. Твердотел потому, что мне хотелось получить ударостойкую систему. Потому как, это чудо будет стоять у меня на столе, и, возможно, его придётся двигать с места на место иногда. К сожалению, денег хватило лишь на 64-ёхгиговый. Но, в будущем, планирую поставить второй твердотел более внушительного объёма.
Операционную систему я для своего сервера выбрал FreeBSD. Почему именно её? Да потому, что мне так захотелось Хотя бы из-за того, что это мой первый сервер на FreeBSD, и ему всё равно когда-то суждено было быть.
Этап 1. Установка и общая подготовка сервера.
Сперва наперво, сразу хочу показать, как у меня расположен сервер, относительно домашней сети:
Т.е. сервер, как и вся локальная сеть, будет прикрыт извне маршрутизатором. Ну, а на самом маршрутизаторе я настроил проброс нужных портов извне до своего сервера.
Скачиваем свежий дистрибутив FreeBSD. На мой момент, это была девяточка:
И приступаем к установке. На этапе, когда установщик спрашивает: Would you like to set a non-default key mapping for your keyboard? Отвечаем yes и выбираем Russian koi8-r. Затем, система попросит указать имя нашего сервера. Я указал просто example.com (имя своего зарегистрированного домена). Потом установщик спросит, какие компоненты ставить. Выбираем lib32, ports и src. Далее, установщик спросит, как будем разбивать диск на партишены — жмём Manual и видим вот такую картинку:
Здесь я нажимаю кнопку Auto, а затем — кнопку Partition. Система нам покажет, как бы она разбила диск по умолчанию:
И вот здесь то я кое-что изменю. Для начала, удалю партишины ada0p2 и ada0p3. Затем, создам заново ada0p2, выбрав свой размер. И обязательно нажму кнопку Options при её создании:
для того, чтобы выбрать опцию TRIM, поскольку накопитель у меня твердотельный стоит:
Затем, добавляю своп-партишин ada0p3, делая его всего в один гигабайт:
Объясняю, почему именно так: Во-первых, чтобы выиграть хоть несколько дополнительных гигабайт свободного места. Во-вторых, на сервере у меня 4гб ОЗУ, коих должно хватить сполна для всех сервисов, поэтому не вижу необходимости в большом свопе.
После разбиения диска на партишены, нажимаем finish, а потом commit. Система начнёт устанавливаться. После установки, система попросит ввести пароль для root и предложит сконфигурировать подключение к сети, на что я соглашаюсь и ввожу свои сетевые реквизиты:
IP-адрес 192.168.0.100
маска 255.255.255.0
шлюз 192.168.0.1
ДНС 192.168.0.1
После конфигурирования сети, установщик спросит, настроены ли наши часы в БИОСе по всемирному координированному времени (UTC). В своём случае, я нажал no, поэтому установщик попросил меня указать мой часовой пояс.
Далее будет спрашиваться, какие демоны включить в автозагрузку. Я выбрал sshd и ntpd. А на дальнейший вопрос о том, хочу ли я, чтоб система создавала крашдампы при сбоях, я ответил отрицательно, ибо места на твердотеле итак мало.
Would you like to add users to the installed system now? Отвечаю положительно и создаю одного пользователя с банальным названием admin. Важный момент! Когда система задаст вот такой вопрос, о том, хотим ли мы пользователя включить в какие-либо дополнительные группы, то пишем группу wheel:
Включать пользователя в эту группу нужно для того, чтобы он потом смог принимать обличье root через команду su в удалённой сессии ssh. После создания пользователя установщик покажет окно с названием Final configuration, в котором выбираем exit. А на последующий вопрос, хотим ли мы что-то ещё вручную сконфигурировать в консоли, отвечаем отрицательно и перезагружаем машину. Во время перезагрузки на забудем зайти в БИОС и поставить загрузку с жёсткого диска.
На этом, система установлена. Но этого нам ещё очень и очень мало. Чтобы можно было комфортно работать, нам нужно установить несколько программ. Но чтобы это сделать, надо сначала обновить и проиндексировать порты. Сразу надо отметить, что в дальнейшем подразумевается, что наша машина с FreeBSD имеет прямой и не ограниченный выход в интернет. Поэтому, прежде, чем двигаться далее, убедитесь, что так оно и есть.
Заходим в систему под root и выполняем вот такие команды:
portsnap fetch update
portsnap extract
Обновление портов займёт некоторое время. Ждём. Ну а потом, лично я, сразу же ставлю программы, без которых мне не комфортно — это midnight commander и nano. Ставим миднайт коммандер:
cd /usr/ports/misc/mc
make install clean
Опции сборки миднайт коммандера я оставляю по умолчанию (они итак почти все включены). Но! Миднайт коммандер, по зависимости, потянет установку такого важного компонента, как perl. И вот в опциях его сборки нам надо выставить вот такие опции:
Эти возможности будут нужны для нашего вэб-сервера nginx, который мы позже будем ставить. Подробнее об этом тут. Также, mc потянет за собой и ещё несколько зависимостей. Здесь я приведу скриншоты сборки лишь тех компонентов, где я менял опции сборки. Это:
После установки mc ставим консольный текстовый редактор nano:
cd /usr/ports/editors/nano
make install clean
Затем, перезагружаем систему командой reboot.
Кстати, у меня, при загрузке системы и после того, как появляется приглашение в консоль, выскакивает некая ругань, связанная с демоном ntpd. Вот сейчас, когда у нас есть mc, частично решим эту проблему. Найдём файл /etc/hosts и закомментируем в нём строчку:
# ::1 localhost localhost.my.domain
Потому как IPv6 в нашей системе всё равно не используется. Частично проблема решена потому, что мы ещё пока не отключили поддержку IPv6 в самом ядре. Этим и не только мы сейчас займёмся. Нам желательно бы оптимизировать настройки ядра на предмет отключения в нём не только IPv6, но и лишних драйверов. Также, включим в ядре поддержку фаервола, ибо какой же сервер без фаервола. Но сначала подстрахуемся и сохраним наше текущее ядро на тот случай, если тюнинг ядра не удастся. Делаем команду:
cp -Rp /boot/kernel /boot/kernel.good
Если вдруг тюнингованное ядро окажется нерабочим, то здесь описано, как загрузиться со старым ядром. Теперь, переходим в каталог /usr/src/sys/amd64/conf и находим файл GENERIC. Тут же, делаем его копию с каким-нибудь своим названием. Например, я сделал с названием mykernel. Затем, надо отредактировать свой файл. Самым первым делом находим вот эту строчку:
ident GENERIC
И меняем её на ваше имя ядра:
ident mykernel
Затем отключаем IPv6:
# options INET6
А для активации фаервола добавляем в конец файла строчки:
# включить фаервол
options IPFIREWALL
# делать логи пакетов, для которых в правилах есть опция 'log'
options IPFIREWALL_VERBOSE
# Ограничение повторяющихся логов на случай атак типа флудинга.
options IPFIREWALL_VERBOSE_LIMIT=5
# включение перенаправления (проброса) пакетов.
options IPFIREWALL_FORWARD
# включение возможности NAT
options IPDIVERT
# Включение возможности ограничивать скорость трафика.
options DUMMYNET
# Почему-то, многие эту опцию включают. Но я не стал. Эта опция означает, что во время загрузки сервер будет открыт до тех пор, пока не включится фаервол.
# options IPFIREWALL_DEFAULT_TO_ACCEPT
Что касается остальных опций, относительно поддерживаемого железа, то тут у каждого будут свои настройки. Я стараюсь отключить всё лишнее. Хотя, кое-что, я думаю, можно отключить у всех, например, всё, что связано со звуком, firewire, usb wireless, да и вообще всё беспроводное отключить можно. Также и PCMCIA карты, флоппи, лишние raid-контроллеры.
Итак, после того, как всё-таки конфиг редактировать закончили, переходим в каталог /usr/src и там делаем команды:
make buildkernel KERNCONF=mykernel
make installkernel KERNCONF=mykernel
Когда ваше ядро соберётся и установится, то пока не спешите перезагружаться. Давайте сразу всё подготовим для фаервола. Во-первых, в файл /etc/rc.conf добавим строчки:
firewall_enable="YES"
firewall_type="/etc/ipfw.rules"
ipfw_enable="YES"
Потом создадим файл /etc/ipfw.rules вот с таким содержимым:
# сброс всех правил
-f flush
# разрешить любой доступ через интерфейс-петлю
add 00050 allow all from any to any via lo0
# разрешить любой исходящий трафик с сервера
add 00055 allow all from me to any
# разрешить прохождение пакетов со статусом 'установлен'
add 00075 allow tcp from any to any established
# разрешить весь ICMP-трафик
add 00100 allow icmp from any to any
# разрешить серверу обмениваться любым трификом со шлюзом
add 00150 allow all from 192.168.0.1 to me via em0
# Вот в этом правиле мы перечисляем открытые порты к нашему серверу. Можно заранее прописать всё нужное.
add 00170 allow tcp from any to me 22,10000,80,443,25,465,21 via em0
# Запретить всё остальное
add 10000 deny all from any to any
Примечание: em0 — эта так моя сетевуха назвалася в системе. Вот теперь перезагружаем сервер. Если ядро получилось работоспособное, то сервер нормально загрузится, и фаервол заработает.
Далее, я предлагаю русифицировать нашу систему. В этом мне помогла вот эта статья. Там перечислено несколько методов Но я выбрал для себя один. Для начала, находим в файле /etc/rc.conf строчку: keymap="ru.koi8-r.kbd" и сразу после неё добавляем ещё четыре:
scrnmap="koi8-r2cp866"
font8x16="cp866b-8x16"
font8x14="cp866-8x14"
font8x8="cp866-8x8"
Сохраняем изменения. Затем, надо внести изменения ещё в два файла. Сначала находим файл /etc/profile и добавляем в него строчки:
LANG=ru_RU.KOI8-R; export LANG
MM_CHARSET=KOI8-R; export MM_CHARSET
Потом находим файл /etc/csh.login и в него добавляем:
setenv LANG ru_RU.KOI8-R
setenv MM_CHARSET KOI8-R
После чего, перезагружаем систему и радуемся родному языку.
Примечание: для того, чтобы русские символы отображались корректно, вам нужно в своём ssh-клиенте, которым вы, в дальнейшем, будете подключаться к серверу, указать кодировку KOI8-R. Я, как линуховод, вначале съел собаку на этом этапе, позабыв, что в федоре у меня кодировка UTF-8. Но после того, как в konsole переключил кодировку на KOI8-R, всё стало нормально.
Продолжим. В дальнейшем нам понадобится одна наиполезнейшая программа под названием Webmin, ибо через неё многие вещи очень удобно делать. Поэтому установим webmin:
cd /usr/ports/sysutils/webmin
make install clean
После установки, запустим скрипт конфигурирования /usr/local/lib/webmin/setup.sh, который задаст кое-какие вопросы:
Log file directory [/var/log/webmin]: жмём энтер
Full path to perl (default /usr/bin/perl): жмём энтер
Web server port (default 10000): если надо, то порт можно изменить на другой подходящий. Я менять не стал.
Login name (default admin): здесь тоже на ваше усмотрение. Я оставил админа.
Login password: вводим пароль
Use SSL (y/n): вот здесь я ответил положительно. Вдруг когда-нибудь придётся заходить на сервер извне...
После завершения скрипта конфигурирования можно пользоваться вебмином зайдя вот так: https://192.168.0.100:10000. И не забудем в файл rc.conf добавить строчку:
webmin_enable="YES"
Также, не забудем и переключить вебмин на русский язык с локалью KOI8-R. Это делается в меню Webmin --> Webmin Configuration --> Language.
Следующее, что очень желательно сделать для общей подготовки сервера — это установить Apcupsd, чтобы сервер корректно выключался при отключении электричества. Вы же не забыли подключить сервер к ИБП? Установим apcupsd:
cd /usr/ports/sysutils/apcupsd
make install clean
Опции сборки я оставил по умолчанию. Не забываем в rc.conf добавить строчку:
apcupsd_enable="YES"
Затем, найдём файл конфигурации /usr/local/etc/apcupsd/apcupsd.conf и отредактируем некоторые строчки. На самом деле, конфигурирование apcupsd я уже описывал и в других своих статьях: тут и здесь. Но во FreeBSD надо будет внести несколько больше изменений в конфиг:
# Кабель, которым ИБП подсоединён к серверу.
UPSCABLE usb
# Тип ИБП
UPSTYPE usb
# этот параметр оставляем пустым
DEVICE
# уровень заряда батареи, при котором сервер начнёт выключаться
BATTERYLEVEL 10
# оставшееся время работы батареи, меньше которого сервер начнёт выключаться
MINUTES 8
# Подключаться к сервису apcupsd можно будет только с самого сервера. Позже, тут можно будет добавить свой рабочий комп, чтоб отслеживать отслеживать состояние ИБП.
NISIP 127.0.0.1
Последний момент, который тоже очень важен — это включение запуска fsck при старте сервера. К сожалению, я об этом узнал уже после того, как однажды у меня накрылась файловая система. И когда я начал гуглить в надежде найти спасение, то наткнулся вот на это статью:
http://myfreebsd.ru/overview/avtomaticheski-zapusk-fsck-y-pri-starte-freebsd
в которой сказано, что предохраняться то надо было заранее! Поэтому в файл /etc/rc.conf добавляем вот такие строчки:
fsck_y_enable="YES"
background_fsck="NO"
Вот на этом, думаю, общая подготовка сервера закончена. Перейдём ко второму этапу, в котором настроим веб-сервер и развернём болванку для сайта.
Комментарии
Всё остальное, что тут написано -- тоже всё реально настроено/настраивалось, но уже у меня на работе.