Перед началом данной статьи необходимо внимательно взглянуть на Вашу сборку.
Если там присутствуют файлы с расширением *.so (l2lt.so и.т.п) то сборка по данному реководству работать не будет, для того, чтоб она работала необходимо дополнительно установить и настроить эмуляцию Linux, что могу в дальнейшем расписать если будет в этом необходимость. На FreeBSD прекрасно работают все сборки на исходниках овера и многие другие. Если данных файлов нет, то запасаемся пивком и поехали...
Статья ориентирована на новичков в UNIX.
OS FreeBSD тестировалась лично мной не один год, и показала большую стабильность (осебенно при DDoS атаке) в работе по сравнению с любой сборкой Linux разве что OS OpenBSD. FreeBSD вообще в узких кругах считается одной из лучших систем, не зря ее используют на своих серверех google и ряд других очень крупных проектов. В то же время она является системой очень требовательной к правильной настройке.
Описываю установку и настройку под х64 по той простой причине, что 32 битные платформы на мой взгляд начинают морально устаревать и практически все современные процессоры поддерживают x64.
Скачиваем ISO образ под 64 битную платформу:
CD
http://ftp6.ru.freebsd.org/pub/FreeBSD/ISO...amd64-disc1.iso
DVD
http://ftp6.ru.freebsd.org/pub/FreeBSD/ISO...d64-dvd1.iso.xz (перед записью файл нужно распаковать)
Записываем образ на диск, ставим машину, включаем, заходим в биос, выставляем dvd привод на первое место в загрузку при старте, сохраняем и пускаем в перезагруз.
При загрузке FreeBSD лоадера выбираем 1. FreeBSD (default), далее выбираем страну,, кодировку (koi-8r по дефолту), после чего нас выводит на окно параметров установки. Выбираем Standat и жмем enter.
Перед нами меню разметки диска. Если на нем есть какие либо разделы, удаляем их клавишей D, после чего выставляем авторазметку (весь диск под систему) последовательным нажатием, сначало клавиша A, затем клавиша Q
Перед нами меню установки загрузчика. Выбираем Standart (Install a standart MBR) и жмем enter.
После этого мы попадаем в меню разметки разделов диска. Если сервер тестовый, то смело ставьте авторазметку методом последовательного нажатия клавишей A затем Q.
Если сервер не тестовый и уже предназначен для работы то к составлению разделов нужно отнестись более внимательно, при необходимости могу проконсультировать, здесь описывать все тонкости не хватит времени.
По окончании установки разделов Вас выведет на окно конфигурации установки, где необходимо поставить галочку только на опции Developer (галочка устанавливается клавишей пробел), языковые пакеты не выбираем, нажимаем энтер, нас снова выкинет на окно с выбранной опцией Developer. При помощи TAB перескакиваем на OK и жмем Enter.
Опция установки - CD/DVD - Enter. В сл. окне еще раз Enter после чего начнется установка системы.
По окончании установки проходим ряд параметров конфигурации:
1. Would you like to configure any Ethernet network devices?
YES
2. Do you want to try IPv6 configuration of the interface?
NO
Окно конфигурации сетевых настроек инрерфейса:
Host: srv.domain.com
(Обязательно домен 3 уровня. Можно от балды. Если у вас к примеру есть домен domain.com то в окне host укажите что то вроде srv.domain.com или game.domain.com)
При нажатии TAB переходим к сл. окну Domain где уже необходим параметр домена 2 уровня - он станет автоматом.)
Domain: domain.com
IPv Gateway: xx.xxx.xxx.xxx (IP шлюза по умолчанию)
Name server: xxx.xxx.xxx.xx (IP DNS сервера)
IPv4 Address: xxx.xxx.xxx.xx (IP сервера)
Netmask: 255.255.xxx.xxx (маска сети)
ОК - Enter.
3. Would you like to bring the re0 (имя вашего интерфейса) interface up right now?
YES
4. Do you want this machine to function as a network gateway?
NO
5. Do you want to configure inetd and the network services that it provides?
NO
6.
Would you like to enable SSH login?
YES - Будьте внимательны, если Вы отрицательно ответите на этот вопрос то не сможете удаленно зайти на сервер по SSH пока не включите загрузку SSH демона локально.
7.
Do you want to have anonymous FTP access to this machine?
NO
8.
Do you want to configure this machine as an NFS server?
NO
9.
Do you want to configure this machine as an NFS client?
NO
10.
Would you like to customize your system console settings?
11.
Would you like to set this machine's time zone now?
YES - Далее выбираем страну и город.
12. Does this system have a PS/2, serial, or bus mouse?
NO
13. User Confirmation Requested
The FreeBSD package collection.
NO - Никакие пакеты нам сейчас ставить не нужно.
14. User Confirmation Requested
Would you like to add any initial user account to the system?
YES - создаем дополнительного пользователя в групе wheel, в целях безопасности при удаленном входе на сервер по SSH необходимо залогиниться именно этим юзером, после чего перейти в root командой SU Менять настройки безопасности и позволять удаленно логиниться сразу в рута настоятельно не рекомендую.
Выбираем User, жмем enter.
Login ID: - имя пользователя. Пусть в текущем примере это будет test
UID: - Не трогаем, оставляем как есть.
Group: Вводим значение wheel
В два сл. окна вводим пароль после чего перепрыгиваем на OK и жмем Enter, более ничего менять не нужно.
В появившемся окне выбираем Exit, жмем enter, затем 2 раза вводим пароль который будет использоваться для пользователя root.
15. User Confirmation Requested
Visit the general configuration menu.
NO
Далее в появившемся окне клавишей TAB переходим на кнопку в самом низу X Exit Install и жмем enter.
На вопрос о перезагрузке отвечаем положительно (YES) После чего вынимаем диск из DVD привода, подтверждаем выемку в появившемся окне. Машина уйдет в перезагрузку.
На этом установка операционной системы FreeBSD завершена.
Дожидаемся окончания перезагрузки и переходим к непосредственной настройке системы.
Логинимся под пользователем root. (Если работаем локально то можно залогиниться сразу под root) Если выполняем удаленный вход по SSH то необходимо залогиниться под пользователем, которого мы создали, в данном примере test и после этого дать команду su. Система попросит пароль от рута, вводим его (стоит заметить что ввод пароля не будет отображаться никак, даже звездочками).
Для удаленной работы по SSH потребуется SSH клиент. Вполне удобен клиент Putty, скачать можно отсюда http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe
Проверяем:
srv# uname -a
FreeBSD srv.domain.com 8.2-RELEASE FreeBSD 8.2-RELEASE #0: Thu Feb 17 02:41:51 UTC 2011 root@mason.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC amd64
srv#
Все ОК.
Первым делом обновляем дерево портов:
srv# cd /usr/ports && portsnap fetch && portsnap fetch extract && portsnap fetch update
Дожидаемся окончания, мин. 15, в зависимости от скорости интернет канала и машины.
Ставим необходимый для удобства работы софт.
Загрузчик файлов.
srv# cd /usr/ports/ftp/wget
srv# make config
Снимаем галочку с IPV6 и жмем ок
srv# make install clean
Все галочки Options в появившихся кокнах которые будут выскакивать оставляем по умолчанию.
Ждем окончания установки.
srv# rehash
Установка завершена.
Ставим файлменеджер MC
srv# cd /usr/ports/misc/mc
srv# make install clean
Параметры в появившихся окнах конфигурации оставляем по умолчанию.
srv# rehash
Установка завершена.
Устанавливаем MySQL сервер.
srv# cd /usr/ports/databases/mysql51-server
srv# make install clean
srv# rehash
Настраиваем:
srv# cd /usr/local
srv# ./bin/mysql_install_db --user=mysql
srv# echo 'mysql_enable="YES"' >> /etc/rc.conf
Стартуем
srv# /usr/local/etc/rc.d/mysql-server start
Устанавливаем пароль для пользователя root MySQL, где 1234567 смените на пароль root для MySql (Внимание! Пользователь root системы и пользователь root MySQL вещи совершенно разные, разные должны быть и пароли)
/usr/local/bin/mysqladmin -u root password 1234567
Создаем файл настроек:
srv# touch /var/db/mysql/my.cnf
Редактируем
srv# ee /var/db/mysql/my.cnf
Вписываем следующее:
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
init-connect="SET NAMES utf8"
skip-character-set-client-handshake
log_error = /var/db/mysql/mysql.err
[mysql]
default-character-set=utf8
[mysqld_safe]
default-character-set=utf8
[client]
default-character-set=utf8
[mysqldump]
default-character-set=utf8
После того как вписали, нажимаем ESC затем подтверждаем энтером изменения.
Это базовые настройки, стоит иметь ввиду, что на серверах с онлайном 300+ необходима более точная настройка MySQL а именно правильное выставление параметров кешей. И совершенно не важно какая операционная система используется, Linux или FreeBSD. Типмчная ошибка многих, бросить все по умолчанию а затем думать почему при большом онлайне начинаются лаги,- потому что при большом онлайне нагрузка на MySQL очень немалая. Еще ко всему сказанному хочу добавить то, что если Вы используете обычные жесткие диски SATA 7200 оборотов, то бодьте готовы к тому, что при онлайне 800+ может возникнуть ситуация, что не хватает скорости успевать отрабатывать запросы мускул. Идеал для геймсервера это SSD c ежедневным бэкапом на другой хард или ftp. Очень часто данная ошибка проявляет себе при открытии сервера, когда масса народа ломится на логинпорт и форум зафлужен воплями о невозможности зайти. Вообще это тонкая и отдельная тема выходящая за рамки данной статьи и описывать все нюансы я не стану.
Рестартим MySQL
srv# /usr/local/etc/rc.d/mysql-server restart
Проверяем
srv# ps -aux | grep mysql
mysql 86479 0.0 0.0 8296 1920 ?? Is 6:59PM 0:00.00 /bin/sh /usr/local/bin/mysqld_safe --defaults-extra-file=/var/db/mysql/my.cnf --user=mysql --datadir=/var/db/mysql --pid-file=/
mysql 86577 0.0 0.6 63272 26340 ?? I 6:59PM 0:00.07 /usr/local/libexec/mysqld --defaults-extra-file=/var/db/mysql/my.cnf --basedir=/usr/local --datadir=/var/db/mysql --log-error=/
root 86596 0.0 0.0 9124 1484 0 S+ 7:06PM 0:00.00 grep mysql
srv#
Все ОК.
Работу с MySQL из коммандной строки описывать не стану, долго да и не нужно, кому нужно тот и сам найдет на просторах интернета. Упростим задачу.
Ставим Webmin
srv# cd /usr/ports/sysutils/webmin
srv# make install clean
srv# rehash
Добавляем в автозапуск при старте
srv# echo 'webmin_enable="YES"' >> /etc/rc.conf
Сетапим
srv# /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: пароль на webmin
Password again: пароль на webmin
Use SSL (y/n): y
Стартуем
srv# /usr/local/etc/rc.d/webmin start
Заходим: https://192.111.111.111:10000
IP разумеется свой
Логинимся: admin и Ваш пароль
Меняем язык по умолчанию Webmin - Change Language and Theme - Webmin UI language - Personal choice - Russian UTF-8
Нажимаем Make changes, ждем пока применятся настройки и обновляем страницу.
Идем - Службы - Сервер баз данных MySQL
Вводим пароль от пользователя root MySql и сохраняем после чего попадаем на страницу конфигурации MySQL.
Первым делом удаляем базу Test, затем переходим в Права баз данных и удаляем там все что есть, возвращаемся в список баз данных.
Переходим в пункт Права пользователя, Удаляем там целиком все за исключением
root localhost
Должен остаться только один пользователь root c хостом localhost и заполненным полем шифрованный пароль.
Нажимаем создание нового пользователя
Создаем поочереди пользователей l2login и l2 server
Узлы - оставляем галочку любой так как к серверу MySQL будет коннектиться сайт сервера для выборок статистики и записи аккаунтов.
Права - ничего не отмечаем, нажимаем создать.
В оканцовке создания пользователей в вэбмине имеем следующее
l2login Любой *92CC53429A963CC7A5D91CA0DC471F44E7AACAAB None Нет
l2server Любой *92CC53429A963CC7A5D91CA0DC471F44E7AACAAB None Нет
root localhost *92CC53429A963CC7A5D91CA0DC471F44E7AACAAB None Все
Возвращаемся в список баз данных.
Нажимаем создание новой базы данных, имя базы данных l2login, Character set utf8, Collation order utf8_general_ci
Анналогичным образом создаем базу l2server
Переходим в пункт Права баз данных - Создание новых прав базы данных
Базы данных - галочку на Selected - из списка выбираем базу l2login, Имя пользователя l2login, Узлы - любой Права - держа клавишу Shift отмечаем там все пункты и нажимаем создать.
Повторяем то же самое для базы l2server. В оканцовке имеем следубщий вид:
l2login l2login Любой Все
l2server l2server Любой Все
Настройка MySQL завершена, мы имеем работающий сервер MySQL с созданными базами и пользователями под логин и геймсервер.
Следующим этапом у нас будет установка Jave платформы, установка сборки, и настройка фаервола.
Ставим Java
srv# cd /usr/ports/java/jdk16
srv# make install clean
Убираем там галочку с пункта WEB Enable the browser plugin and Java Web Start, жмем ОК и тут же получаем облом с ошибкой. Ошибка связанная с гемороем лицензионного соглашения.
Делаем следующее:
srv# cd /usr/ports/distfiles
srv# wget http://www.java.net/download/jdk6/6u3/prom...24_sep_2007.jar
srv# wget http://www.java.net/download/jdk6/6u3/prom...24_sep_2007.jar
Далее идем на http://www.eyesbeyond.com/freebsddom/java/jdk16.html Качаем оттуда Patches 4 (нюанс в том что напрямую его не качнуть так как надо согласиться с лицензионным соглашением) и кидаем скачанный файл куда нибудь на хост, после чего
srv# wget http://хост_куда_залили.ru/bsd-jdk16-patches-4.tar.bz2
srv# cd /usr/ports/java/jdk16
srv# make install clean
Пролистываем соглашение до конца, вводим yes и нажимаем enter.
В выскакивающих окнах конфигураций при установке пакетов оставляем все опции как есть по умолчанию.
Непосредственно перед окончанием инсталляции мы получаем очередной облом описанный выше но другого дополнительного пакета. Топаем http://www.FreeBSDFoundation.org/cgi-bin/d..._07-b02.tar.bz2 соглашаемся с соглашением, качаем файл, кидаем на хост.
srv# cd /usr/ports/distfiles
srv# wget http://хост_куда_залили.ru/diablo-caffe-fr..._07-b02.tar.bz2
srv# cd /usr/ports/java/jdk16
srv# make install clean
srv# rehash
По окончании установки проверяем:
srv# java -version
java version "1.6.0_07"
Diablo Java SE Runtime Environment (build 1.6.0_07-b02)
Diablo Java HotSpot 64-Bit Server VM (build 10.0-b23, mixed mode)
srv#
Все ОК.
Создаем отдельного пользователя без привелегий в системе из под которого будет работать сборка.
srv# adduser l2game
Username: l2game
Full name: l2game
Uid (Leave empty for default):
Login group [l2game]:
Login group is l2game. Invite l2game into other groups? []:
Login class [default]:
Shell (sh csh tcsh nologin) [sh]: sh
Home directory [/home/l2game]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]:
Enter password: пароль для пользователя
Enter password again: пароль для пользователя
Lock out the account after creation? [no]:
Username : l2game
Password : *****
Full Name : l2game
Uid : 1002
Class :
Groups : l2game
Home : /home/l2game
Home Mode :
Shell : /bin/sh
Locked : no
OK? (yes/no): yes
adduser: INFO: Successfully added (l2game) to the user database.
Add another user? (yes/no): no
Goodbye!
srv#
Итого мы создали пользователя с логином l2game
Ставим на сервер оболочку bash (нужна для некоторых сборок)
srv# cd /usr/ports/shells/bash
srv# make install clean
srv# rehash
srv# cd /bin
srv# ln -s /usr/local/bin/bash bash
Настраиваем фаервол.
В примере описываю настройку PF, мне он очень понравился.
Для использования PF крайне желательно пересобрать ядро с его поддержкой а не грузить все отдельным модулем, чем сейчас и займемся.
srv# cd /sys/amd64/conf
srv# cp GENERIC L2
srv# ee L2
Прямо под концом секции options дописываем следующее:
device pf
device pflog
device pfsync
options ALTQ
options ALTQ_CBQ # Class Bases Queuing (CBQ)
options ALTQ_RED # Random Early Detection (RED)
options ALTQ_RIO # RED In/Out
options ALTQ_HFSC # Hierarchical Packet Scheduler (HFSC)
options ALTQ_PRIQ # Priority Queuing (PRIQ)
options ALTQ_NOPCC # Required for SMP build
Жмем эскейп и затем подтверждаем энтером сохранение. Далее:
srv# config L2
Kernel build directory is ../compile/L2
Don't forget to do ``make cleandepend && make depend''
srv# cd ../compile/L2
srv# make depend && make && make install
Ждем окончания сборки и установки нового ядра.
По окончании установки создаем скрипт правил фаервола PF:
srv# touch /etc/pg.conf
Узнаем имя своего сетевого интерфейса:
srv# ifconfig
У меня это re0, у вас может быть другим. Запомните, если Вы ошибетесь в конфигурационном файле PF в случае удаленной работы вы можете попросту потерять свой сервер после рестарта.
Редактируем:
srv# ee /etc/pf.conf
Приводим файл к следующему виду а так же не забываем отредактировать там свой IP и имя интерфейса:
###Имя Вашего сетевого интерфейса
ext_if = "re0"
###IP адрес Вашего сервера
ext_ip = "192.168.1.221/32"
###Частные сети(не трогать)
private_nets = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, 0.0.0.0/8, 240.0.0.0/4 }"
###Нормализация###
set block-policy drop
set state-policy floating
set loginterface $ext_if
set limit { frags 100000, states 100000 }
set optimization normal
set skip on lo0
scrub in all
###Фильтр###
antispoof quick for { lo0, $ext_if }
block log all
block drop in quick on $ext_if from $private_nets to any
###Разрешаем все исходящие соединения по протоколам TCP, UDP, ICMP
pass out on $ext_if proto tcp from any to any
pass out on $ext_if proto icmp from any to any
pass out on $ext_if proto udp from any to any keep state
###Разрешаем входящие на логинсервер
pass in on $ext_if proto tcp from any to $ext_ip port 2106 flags S/SA synproxy state
###Разрешаем входящие на геймсервер
pass in on $ext_if proto tcp from any to $ext_ip port 7777 flags S/SA synproxy state
###разрешаем SSH
pass in on $ext_if proto tcp from any to $ext_ip port 22 flags S/SA synproxy state
###разрешаем входящие на MySQL
pass in on $ext_if proto tcp from xxx.xxx.xxx.xx to $ext_ip port 3106 flags S/SA synproxy state
pass in on $ext_if proto tcp from xxx.xxx.xxx.xx to $ext_ip port 3106 flags S/SA synproxy state
###Где xxx.xxx.xxx.xx IP на котором работает Ваш сайт а так же ваш домашний IP
# чтоб была возможность подконнектиться к мускулу в случае надобности навикатом
###В случае нескольких геймсерверов, когда нужно открыть из вне порт 9014
#pass in on $ext_if proto tcp from xxx.xxx.xxx.xx to $ext_ip port 9014 flags S/SA synproxy state
#pass in on $ext_if proto tcp from xxx.xxx.xxx.xx to $ext_ip port 9014 flags S/SA synproxy state
#pass in on $ext_if proto tcp from xxx.xxx.xxx.xx to $ext_ip port 9014 flags S/SA synproxy state
###Где xx.xxx.xxx.xx IP Ваших геймсерверов, никому другому на этом порту делать нефик
PF очень функциональный фаервол и тут я описал только базовые опции, описывать отдельные опции и все тонкости настроек касаемые защиты от DDoS атак я не стану, кому будет интересно читайте мануалы по PF.
Единственное, в данном конфиге я порезал входящий траффик по протаколам UDP и ICMP. На геймсервере данные протоколы вовсе не нужны, причем вырезание входящих коннектов по данным протоколам отметает ряд DDoS атак.
Добавляем PF а автозагрузку:
srv# ee /etc/rc.conf
Дописываем туда:
pf_enable="YES"
pf_program="/sbin/pfctl"
pf_flags=""
pf_rules="/etc/pf.conf"
pflog_enable="YES"
pflog_logfile="/var/log/pf.log"
pflog_program="/sbin/pflogd"
pflog_flags=""
Сохраняем, закрываем. Отправляем сервер в перезагрузку:
srv# reboot
Сервер готов к установке сборки.
Редактируем все конфиги сборки под работу на сервере, пакуем в gzip архив и сливаем на хост.
Логинимся по ssh на сервер под созданным пользователем l2game
srv# wget http://хост.ру/имя_файла_сборки.gz
srv# tar xvzf имя_файла_сборки.gz
Устанавливаем права доступа на файлы сборки:
srv# find /home/l2game/gameserver -type f -exec chmod 644 {} \;
srv# find /home/l2game/gameserver -type d -exec chmod 755 {} \;
На все файлы с расширением SH необходимо дать права на запуск:
Пример...
srv# cd /home/l2game/gameserver
srv# chmod +x startgameserver.sh startloginserver.sh
Стартуем сборку:
srv# cd /home/l2game/gameserver
srv# ./startloginserver.sh
srv# ./startgameserver.sh
Подключаемся игровым клиентом.... Пользуемся...
Небольшой FAQ по статье.
Почему в MySql нужно создавать отдельную базу под логин и отдельную под гейм, зачем создавать отдельных пользователей а не работать из под учетной записи root MySql?
Потому что если у вас хакнут сайт и сольют с конфига данные пользователя root MySql вам не только вайпнут игровые базы, а похерят вообще все базы мускула если таковые будут иметь место. Отдельная база логинсервера полезна если используется один логин и несколько геймов и инсталлить все в одну базу попросту нерационально.
Почему нежно создавать отдельного пользователя без привелегий в системе под работу сборки?
Потому что если этого не сделать по умолчанию вы стартанете ее под учетной записью root, а пользователь root имеет все права в системе и в случае если ваша сборка будет с шеллами, бэкдорами и прочей нечистью и при этом будет запущена из под рута, Вам так отымеют целиком весь сервер, что вы глазам своим с трудом поверите. Итог - полная переустановка операционки и всего ПО с нуля. В случае хака сборки которая работает из под отдельного пользователя максимум что можно сделать, так это убить все файлы этого пользователя включая сборку и при этом никак не навредить всей системе. А убитые файлы за считанные минуты можно откатить из бэкапа.
PS
Форумные тролли, критики, которые могут только критиковать чужие труды и у которых за плечами нет ни одной своей работы могут идут лесом дружно взявшись за руки, я не обращаю на ваше нытье ни малейшего внимания.
Статья написана мной лично, ни откуда ничего не слизано, опубликована только здесь.
По всем вопросам касаемым написанному желательно писать в личку дабы не разводить тут флудильню.
Понравилось, жми спасибку, вам это ничего не стоит а мне приятно за час потраченного времени которого у меня катастрофически нехватает.