Мысли вслух

2008-07-28

HTTP AntiVirus Proxy

Вот вспомнил про замечательную штука HAVP и решился прикрутить проверку на вирусы HTTP-трафика.
Поскольку прокси-сервер уже имелся (в лице SQUID) будем их каскадировать.

После некоторых раздумий склонился к схеме squid -> havp, что даёт чистый кэш, меньшую нагрузку на антивирус, хотя и имеются некоторые недостатки - в таком варианте HAVP не проксирует FTP, ну и если метафизический вирус попадёт в кэш, до того как.. короче, будет печально.

дистрибутив на этот раз ubuntu-server-8.04, установлен (с настройками по-умолчанию) clamav,
ну и конешно же squid
havp наличествует в репозитории:
#sudo apt-get install havp

после чего обнаружилось, что и делать больше ничего не надо =) файловая система для врменных файлов
создана с сложена в /var/lib/havp/havp.loop и монтируется из init.d-скрипта при старте с нужными опциями
(HAVP требует mount -o mand для временных файлов)

конфиг /etc/havp/havp.config показал, что для антивирусной проверки используется libclamav что не есть хорошо,
при уже и без того запущеном и работающем clamav-daemon
поэтому приводим конфиг к виду:

#слушаем порт
PORT 3129
#адрес:
BIND_ADDRESS 127.0.0.1
#использовать libclamav
ENABLECLAMLIB false
#использовать clamav-daemon
ENABLECLAMD true
#сокет
CLAMDSOCKET /var/run/clamav/clamd.ctl
#можно подключить еще кучу антивирусов, которых у меня нет =(
ENABLEFPROT false
ENABLEAVG false
ENABLEAVESERVER false
ENABLESOPHIE false
ENABLETROPHIE false
ENABLENOD32 false
ENABLEAVAST false
ENABLEARCAVIR false


Для доступа к сокета надо добавить пользователя calmav в группу havp
# sudo adduser clamav havp


теперь займемся squid.

в конфик squid.conf дописываем:
cache_peer localhost parent 3129 0 proxy-only default
acl ftp proto FTP
acl havp proto HTTP
always_direct allow ftp
always_direct deny all
never_direct allow havp

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

остаётся перезапустить:
# sudo invoke-rc.d clamav-daemon restart
# sudo invoke-rc.d squid restart
# sudo invoke-rc.d havp restart

И конечно же проверить работоспособность, путём скачивания EICAR-сигнатур

2008-05-04

про кодировки pure-ftpd

заставить pure-ftpd нормально работать с кодировками можно так:

# echo UTF-8 >/etc/pure-ftpd/conf/FsCharset
# echo CP1251 >/etc/pure-ftpd/conf/ClientCharset

2008-04-16

Простой фокус с iptables

Есть у меня своя локальная сеть 192.168.0.0/24, есть провайдерская сеть 10.0.0.0/8
Есть DC++ Хаб в моей сети, путь будет 192.168.0.1, должен быть виден из 10.0.0.0/8
Есть шлюз из моей сети в провайдерскую
ну и наконец есть пользовательский компьютер (192.168.0.10) в моей сети, которому нужно работать с хабом в активном режиме.
мой IP в сети провайреда будет 10.0.0.1

Всю настройку будем проводить на шлюзе.
Проблем с видимостью из 10.0.0.0 моего хаба не возникает:

iptables -A PREROUTING -d 10.0.0.1 -p tcp --dport 411 \
-j DNAT --to 192.168.0.1


в пассивном режиме уже можно работать, цепляясь к хабу по внутреннему адресу. Можно убрать проверку IP из настроек хаба, и сообщать ему внешний (10.0.0.1) адрес. Но это костыль, и далеко не всегда работающий.
Лучше подменять адреса

#Маркируем пакет, чтобы не потерялся
iptables -t mangle -A PREROUTING -d 10.0.0.1 -p tcp --dport 411 \
-s 192.168.0.0/24 -j MARK --set-mark 1

# Подменяем маркированным пакетам адреса на нужные
iptables -t nat -A PREROUTING -m mark --mark 1 \
-j DNAT --to 192.168.0.1
iptables -t nat -A POSTROUTING -m mark --mark 1 \
-j SNAT --to 10.0.0.1


Вот и все, осталось только DNAT-ить порт данных для клиента:

iptables -A PREROUTING -d 10.0.0.1 -p tcp --dport 30005 \
-j DNAT --to 192.168.0.10

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

2008-04-10

Самосборный сервер WoW под Linux (и не только)

Запускать сервер будет ManGOS, собирать конечно же из SVN
Нам понадобится:

  1. gcc
  2. make
  3. automake
  4. autoconf
  5. libtool
  6. openssl
  7. libssl-dev
  8. mysql-server
  9. mysql-client
  10. libmysql++-dev
  11. zlib
  12. subversion
  13. unrar
  14. screen
не забываем установить и запомнить root-пароль к MySQL
Все это без проблем ставится из репозитория.

Для выковыривания ресурсов понадобится:
  • Клиент WoW текущей версии (посмотреть поддерживаемую можно на сайте сервера http://mangosproject.org )
  • Для распаковки DBC потребуется утилита WinMPQ http://wow.curse.com/downloads/details/4454/
  • Для распаковки карт утилита ad.exe (обязательно свежая!) https://mangos.svn.sourceforge.net/svnroot/mangos/trunk/contrib/map_extractor/ad.exe
  • Утилиты для выковыривания и сборки vmap (https://mangos.svn.sourceforge.net/svnroot/mangos/trunk/contrib/vmap_assembler/ )
Ну и последнее, что нам понадобится - это база NPC. Я предпочитаю UDB. (http://udbforums.org)
Теперь можно приступать.

= Сборка сервера =


все делаем под пользователем

пишем небольшой скриптик для получения свежих исходников ManGOS и ScriptDev2

обычно нужные исходники получаются так:
$ svn checkout https://mangos.svn.sourceforge.net/svnroot/mangos/trunk mangos
$ svn checkout https://scriptdev2.svn.sourceforge.net/svnroot/scriptdev2 mangos/src/bindings/ScriptDev2


Соб-сно сборка:

$ cd ~/mangos
$ patch -p0 <src/bindings/ScriptDev2/patches/MaNGOS-r5049-Scriptdev2.patch


(необходимо использовать самую старшую версию патча)

$ autoreconf --install --force
$ ./configure --prefix=/opt/mangos

Если что-то нехватает - доставляем, после успешного конфигурения
$ make
$ sudo mkdir -p /opt/mangos
Сделаем себя владельцем папки
$ sudo chown [user].[usergroup] /opt/mangos
установка
$ make install

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

= Выковыривание ресурсов =


Сразу оговорюсь, у меня нет проблем с использованием Windows, но все упомянутые утилиты без проблем работают через wine

maps:
копируем ad.exe в папку с WoW, создаем папку maps (там же, в папке с клиентом) из запускаем ad.exe

dbc:
создаем папку dbc,
запускаем WinMPQ (для тех, кто запускает из-под wine, учтите что она использует GUI)
открываем файл WoW/Data/*lang*/locale-*lang*.MPQ (вместо * свой язык)
выделяем файлы начинающиеся с DBCFilesClient и сохраняем их (Extract) в созданную папку dbc
Если версия клиента заканчивается не на 0 (напр 2.3.3) -
достаем DBC из патчей: точно так же, но (обязательно!) соблюдая порядок обрабатываем файлы
patch-*lang*.MPQ [и patch-*lang*-2.MPQ], сохраняя DBC в ту же папку с заменой более старых. Повторюсь, очередность соблюдать обязательно, и обрабатывать патчи в порядке возрастания их номеров.


vmaps (необязательно):
запускаем makevmaps_SIMPLE.bat правильно отвечаем на все вопросы и долго ждём.

копируем на сервер все полученные ресурсы
WoW/maps в /opt/mangos/data/maps
dbc в /opt/mangos/data/dbc
WoW/vmap/vmaps в /opt/mangos/data/vmaps

= Подготовка базы данных =

прежде чем выполнять команды дочитайте абзац до конца!

Для первой установки все просто:
запускаем скрипты:
  • create_mysql.sql
  • characters.sql
  • mangos.sql
  • realmd.sql
из папки /opt/mangos/share/mangos/sql
$ cd /opt/mangos/share/mangos/sql
$ mysql -uroot -p < create_mysql.sql
$ mysql -uroot -p characters < characters.sql
$ mysql -uroot -p mangos <mangos.sql
$ mysql -uroot -p realmd < realmd.sql
из папки
/opt/mangos/share/scriptdev2/sql/
  • create_database.sql
  • mangos_additional_req.sql
  • mangos_full_scripts.sql
  • scriptdev2_structure.sql

$ mysql -uroot -p < create_database.sql
$ mysql -uroot -p < scriptdev2_structure.sql
$ mysql -uroot -p < mangos_additional_req.sql
$ mysql -uroot -p < mangos_full_scripts.sql


распаковываем базу NPC
$ unrar x UDB_0.9.2_Core_5242_SD2_259.rar
$ mysql -uroot -p mangos < udb_0.9.2_core_5242_sd2_259.sql
Версия может отличаться (и отличается уже на момент написания статьи). Если версия базы и сервера отличаются,
то для полного щастья (и безошибочного импорта базы)
нужно получить ВСЕ SQL-скрипты нужной ревизии! База ManGOS обновляется настолько часто и непредсказуемо, что гарантировать успех импорта более 60 мегабайт данных можно только при условии совпадения версий.
Способ получений нужной ревизии был уже описан выше, SQL скрипты хранятся в папке trunk/sql
Собно её-то мы и получим нужной версии:

для "чистоты эксперемента"
скопируем папку sql из исходников ManGOSа куда-нибудь
$ cp -R sql ~/sql
$ cd ~/sql
$ svn up -r НОМЕР_РЕВИЗИИ sql
точно также нужно поступить с SD2 скриптами (они храняться в папке src/bindings/ScriptDev2/sql ), действия такие же,
поэтому описывать не буду ;)


Теперь мы имеем SQL-скрипты нужной версии, выполняем действия описанные выше, теперь необходимо обновить базу
для совместимости с текущей версией сервера. В папке /opt/mangos/share/mangos/sql/updates/ и /opt/mangos/share/scriptdev2/sql/updates/ есть все необходимое для этого.
Поясню немного,
в папке updates файлы вида:
5445_mangos_spell_affect.sql
Его нужно (обязательно!) применять для обновления базы mangos до ревизии 5445 и выше. А конкретно - он исправляет (добавляет, удаляет) таблицу spell_affect
без наложения данного патча (скрипта) сервер ругнётся на несовместимость этой таблицы при запуске и вывалится.
Применять нужно все скрипты, номер которых больше установленной базы.
Если Вы получали (например) базу версии 5242, то необходимо установить все патчи номер которых больше 5242
применяются они стандартно:

$ mysql -uroot -p DB < PATCH.sql

где DB - база данных, которую правит патч, (mangos, characters, realmd или scriptdev2) повторюсь, название патча в последнее время состоит из
[ревизии в которой он появился]_[базы к которой нужно применить]_[таблицы которую он исправляет].sql
названия апдейтов к SD2 отличаются, но смысл у них тот же, и применять их также необходимо.


после наложения все патчей на базу можно приступать к конфигурации сервера

= Конфигурация ManGOS =

все конфигурационные файлы хранятся в папке /opt/mangos/etc/
собсно их 3
mangos.conf - основной конфиг
realmd.conf - конфиг реалмд (авторизационного сервера)
scriptdev2.conf - конфиг SD2, как несложно догадаться

в последних двух необходимо уточнить данных MySQL сервера, А
в mangos.conf
нужно включить vmaps
vmap.enableLOS = 1
vmap.enableHeight = 1

по желанию поменять порт, bind-ip, ну и конечно же рейты. Конфиг достаточно хорошо документирован и проблем возникнуть не должно,
Замечу, что желательно отключить WorldLog
WorldLogFile = ""
т.к. он у меня (и не только) за несколько часов разрастался до фантастических (в несколько Гб) размеров

последний шаг, обновление реамлиста:
$ mysql -u root -p realmd -e "UPDATE realmlist SET name='[Название реалма]', address='[IP или DNS адрес World-сервера]' WHERE id=1"

= Запуск =

теперь можно запускать:
$ cd /opt/mangos/bin/
$ ./mangos-realmd

и на другой консоли:
$ ./mangos-worldd

если все сделано правильно (особенно с базами) - то ошибок быть не должно.

worldd может иногда вываливаться, это его нормальное состояние, поэтому желательно
перезапускать его. Я перепробовал много разных вариантов (с выгриповыванием PIDa по крону в тч),
но остановился на простейшем бесконечном цикле:
worldd.sh:

#!/bin/bash
while [ true ]
do
./mangos-worldd
echo Attempting to restart...
sleep 10
done

по желанию можно доработать, чтобы проверялись флаги.
запускать желательно в screen-сесссии
$ screen -AmdS mangos worldd.sh
после можно соединиться командой
$ screen -x mangos
точно также можно поступить и с realmd, но он достаточно стабилен и на моей памяти ниразу не вываливался, без моего желания.

= Ссылки =
Официальный сайт разработчиков ManGOS
База NPC UDB
Форум разработчиков ScriptDev2



= P.S. =
Для полноценного сервера нехватает только веб-морды для регистрации и контроля игроков.
В качесте онной предлагаю использовать ManGOS MiniManager
Для его работы необходим apache2, libapache2-php5, php5-mysql, конфигурация минимальная, работоспособность проверенная.

2008-03-20

Старкрафт через инет или настройка OpenVPN

Изначально было желание поиграть в старкрафт (doom, duke 3d и прочие интересные игры работающие на IPX)
будем реализовывать.
Есть (у меня)
1. TCP/IP локалка
2. Сервер с debian-etch (можно и форточку, но тада дальше не читать)
3. несколько клиентских машин с win32
--------------------
Собсна идея такая: поднимаем OpenVPN, а по верх неё гоним IPX/SPX,
ну заодно запустим OpenVPN в бридже. так интереснее

в линуксе:
устанавливаем OpenVPN

$ sudo apt-get -y install openvpn openssl bridge-utils
идем /usr/share/doc/openvpn/examples/easy-rsa/2.0/
(Я скопировал скрипты в свою папку, чтобы не трогать оригинальные файлы и
как можно меньше пользоваться рут-правами)
$ mkdir ~/openvpn $ cp -R /usr/share/doc/openvpn/examples/easy-rsa/2.0/* ~/openvpn/

создаем ключи:
$ cd ~/openvpn $ . ./vars $ ./clean-all $ ./build-dh
долго (или не очень) смотрим на ...+.....+
$ ./build-ca
отвечаем ( можно даже правильно на все вопросы)

$ ./build-key-server server

создаем клиентский ключ:
$ ./build-key client

конфиг сервера:
$ cat > server.conf <<"EOF"
вставить вот это:
-----------8<-------------------------- port 1194
proto udp
dev tap0
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
ifconfig-pool-persist ipp.txt
server-bridge 192.168.0.2 255.255.255.0 192.168.0.100 192.168.0.110
client-to-client
duplicate-cn
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3
EOF

-----------8<-------------------------- Теперь самое сложное, создаем бридж (делать только из системной консоли, или скриптом, но не через SSH, так как соединение закончется при добавлении адаптера! можно прописать в автозагрузку, после того как заработает ессно)


скопируем файлы настройки и сертификаты openvpn в папку /etc/openvpn
$ sudo cp ~/openvpn/ca.crt /etc/openvpn/
$ sudo cp ~/openvpn/server* /etc/openvpn/
$ sudo cp ~/openvpn/ca.crt /etc/openvpn/
$ sudo cp ~/openvpn/dh*.pem /etc/openvpn/



разрешаем на фаерволе весь трафик c/на tap0


теперь можно запускать сервер
$ sudo /etc/init.d/openvpn start
если все без очепяток (в т.ч. моих) -- должно заработать, для полного щастья только
пробросить порт 1194 UDP через шлюз и сервер готов.

==================================================================
Теперь клиенты
раздаем клиентам фалы с ключами: ca.crt, client.crt и client.key
а так же конфиг (server.ovpn) вида:
-----------8<--------------------------

client
dev tap
proto udp
remote 10.0.0.1 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key clint.key
comp-lzo
verb 3


-----------8<--------------------------

скачиваем OpenVPN GUI http://openvpn.se/
устанавливаем, копируем конфиг, ключи и сертификаты в
c:\Program Files\OPenVPN\config
А теперь самое главное (то ради чего все задумывалось):
идем в "Панель управления\Сетевые подключения"
в свойствах TAP-адаптера (который появится после установки OpenVPN)
добавить протокол Microsoft IPX/SPX
и можно соединяться.

P.S.
Все вышесказанное полностью отвечает моим требованиям, но
следует учесть, что подключившись к VPN все клиенты будут находиться в
подсети сервера (не зря же бридж настраивали), со всеми вытекающими последствиями.

P.P.S
Не забыавем заменить IP адреса на свои
в моем примере:
внешний IP: 10.0.0.1
внутренний: 192.168.0.2
адрес шлюза: 192.168.0.1

Ping!

Subj%