Окт 31 2008

Установка и настройка ISC DHCP сервера

DHCP сервер вещь очень полезная и конечно есть в портах FreeBSD:

cd /usr/ports/net/isc-dhcp30-server
make install clean

Read more »

Окт 30 2008

Настройка репликации MySQL

Настройку репликации начинаем с сервера-мастера, первым делом необходимо указать в /var/db/mysql/my.cnf(для версий MySQL<5.1) или в /usr/local/etc/my.cnf:
Read more »

Окт 29 2008

Настройка mpd

Для того что бы, mpd нормально заработал, необходимо включить поддержку NETGRAPH в ядре,
я добавил в конфигурацию ядра такие строки:

options NETGRAPH
options NETGRAPH_ASYNC
options NETGRAPH_BPF
options NETGRAPH_ECHO
options NETGRAPH_ETHER
options NETGRAPH_HOLE
options NETGRAPH_IFACE
options NETGRAPH_KSOCKET
options NETGRAPH_L2TP
options NETGRAPH_LMI
options NETGRAPH_MPPC_ENCRYPTION
options NETGRAPH_ONE2MANY
options NETGRAPH_PPP
options NETGRAPH_PPTPGRE
options NETGRAPH_RFC1490
options NETGRAPH_SOCKET
options NETGRAPH_TEE
options NETGRAPH_TTY
options NETGRAPH_UI
options NETGRAPH_VJC

После пересборки ядра и перезагрузки, приступаем к установке mpd:

cd /usr/ports/net/mpd
make install clean

Пример конфигурационного файла:

#По умолчанию подгружаем секции pptp0-pptp4
default:
    load pptp0
    load pptp1
    load pptp2
    load pptp3
    load pptp4
pptp0:
#Создаем новый интерфейс ng0
    new -i ng0 pptp0 pptp0
#Задается локальный и удаленный ip адреса
    set ipcp ranges 192.168.20.251/32 192.168.20.252/32
#Подключаем параметры описанные в секции pptp_standart
    load pptp_standart
pptp1:
    new -i ng1 pptp1 pptp1
    set ipcp ranges 192.168.0.251/32 192.168.0.253/32
    load pptp_standart
pptp2:
    new -i ng2 pptp2 pptp2
    set ipcp ranges 192.168.0.251/32 192.168.0.254/32
    load pptp_standart
pptp3:
    new -i ng3 pptp3 pptp3
    set ipcp ranges 192.168.0.251/32 192.168.0.249/32
    load pptp_standart
pptp4:
    new -i ng4 pptp4 pptp4
    set ipcp ranges 192.168.0.251/32 192.168.0.250/32
    load pptp_standart
pptp_standart:
#Запрещаем звонки по требованию
    set iface disable on-demand
#Запрещаем режим мультилинк ppp
    set bundle disable multilink
    set iface idle 0
#Требуем chap авторизации
    set link no pap chap
    set link enable chap
#Включаем сжатие данных
    set ipcp yes vjcomp
#Опции для совместимости с Windows клиентами
    set iface enable tcpmssfix
    set pptp disable windowing
    set pptp disable delayed-ack
#Устанавливаем DNS 
    set ipcp dns 192.168.0.15
#Включаем компрессию данных
    set bundle enable compression
#Включаем компрессию данных, совсестимую с Windows-клиентами
    set ccp yes mppc
#Включаем шифрование, совместимое с Windows-клиентами
    set ccp yes mpp-e40
    set ccp yes mpp-e128
    set ccp yes mpp-stateless
    set bundle yes crypt-reqd
    set ccp yes mpp-stateless
#Задаем адрес для входящих соединений
    set pptp self 89.252.34.107
#Разрешаем входящие соединения
    set pptp enable incoming
    set pptp disable originate

Данные для авторизации описываются в файле mpd.secret:

#     login             pass            ip
hilik                     hilik               192.168.0.11

Так же для нормальной работы требуется файл mpd.links в нем описываются интерфейсы mpd:

pptp0:
    set link type pptp
pptp1:
    set link type pptp
pptp2:
    set link type pptp
pptp3:
    set link type pptp
pptp4:
    set link type pptp

Если так получилось что, mpd завершился аварийно или был убит killall -9 mpd, то он оставляет после себя интерфейсы и запустить вновь mpd не получается. Исправить эту ситуацию можно выполнив команду:

ngctl shutdown ng0:
ngctl shutdown ng1:
ngctl shutdown ng2:
ngctl shutdown ng3:
ngctl shutdown ng4:
Окт 26 2008

Бекап mysql

Бекап всего, что есть на сервере, вот от чего постоянно болит голова у системного администратора. Для резервного копирования баз mysql существует масса инструментов. Один из простых и эффективно работающих это AutoMySQLBackup. Он представляет из себя bash скрипт. В настройке он очень прост. После того как вы его скачаете с http://sourceforge.net/projects/automysqlbackup/ и распакуете, под FreeBSD необходимо сделать небольшие изменения, изначально начало скрипта выглядит так:

#!/bin/bash

Это надо изменить на:

#!/usr/local/bin/bash

Это мы изменили путь к командному интерпретатору bash, он находится немного в другом месте в FreeBSD, в отличии от Linux для которого и ведется разработка этого скрипта.
Далее приступим к настройке. Все настройки хранятся опять таки внутри скрипта:
1. Настраиваем авторизацию на доступ к mysql, находим строки и заменяем своими параметрами

# Username to access the MySQL server e.g. dbuser
#Имя пользователя для доступа к MySQL серверу
USERNAME=hilik
# Username to access the MySQL server e.g. password
#Пароль для доступа к MySQL серверу, если пароль 
#не установлен, то можно оставить пустым
PASSWORD=hilik
# Host name (or IP address) of MySQL server e.g localhost
#IP адрес или имя хоста на котором находится
#MySQL сервер
DBHOST=localhost

2. Перечисляем базы которые необходимо бекапить

# List of DBNAMES for Daily/Weekly Backup e.g. "DB1 DB2 DB3"
DBNAMES="mysql hilik"

3. В какой директории будем складывать бекапы

BACKUPDIR="/home/share/mysql-backup"

4. E-Mail для отчетов

MAILADDR="hilik@hilik.org.ua"

Далее идет секция дополнительных настроек. Как правило менять эти настройки нет необходимости.
Устанавливаем в крон на периодическое выполнение.

crontab -e

Устанавливаем выполнение на 0 часов, скрипт находится в /root/bin/:

0 0 * * * /root/bin/automysqlbackup.sh

Восстановить базу после бекапа довольно просто. Достаточно найти в указанной для бекапа директории, нужный бекап — распаковать его и с помощью команды mysql вставить назад. Делается это так:

mysql -uhilik -philik < hilik_2008-10-20_00h10m.Monday.sql

Здесь hilik_2008-10-20_00h10m.Monday.sql — это имя файла бекапа базы hilik, после распаковки.

Окт 26 2008

Apache, mod_realip

При создании ферм http серверов, обнаруживается что теперь все соединения приходят не от фактических ip адресов клиентов, обращающихся к вебсерверу, а от адресов проксирующих серверов. И после этого перестают работать баны по адресам, статистика в логах ведется не корректно и так далее и тому подобное.
Для apache версии 1.3.X существует специальный модуль, mod_realip, написанный Игорем Сысоевым.
Устанавливаем его:

cd /usr/ports/www/mod_realip/
make install clean

Теперь приступим к конфигурированию:
в первую очередь надо найти и раскоментировать такие строки в httpd.conf

LoadModule realip_module      libexec/apache/mod_realip.so

и

 AddModule mod_realip.c

Это мы подгрузили модуль mod_realip, теперь изменяем настройку виртуального сервера:

<virtualhost 127.0.0.1:80>
    DocumentRoot /home/www/hilik.org.ua
    ServerName hilik.org.ua
    #Включаем модуль для виртуал хоста
    RealIP on
    #Согласно этой настройке, если в заголовке 
    #Host: передается адрес 127.0.0.1, то его 
    #необходимо заменить на адрес передаваемый 
    #в заголовке X-Forwarded-For.
    RealIP localhost 127.0.0.1 xfwd
    <directory /home/www/hilik.org.ua>
        Options FollowSymLinks
        AllowOverride all
    </directory>
</virtualhost>

Теперь можно сделать:

apachectl configtest

и если ошибок не последовало то:

/usr/local/etc/rc.d/apache.sh restart
Окт 25 2008

SSH, безпарольный доступ

Иногда бывает так, что надо что бы при входе на сервер, не требовалось набирать пароль, но надо, что бы при этом не уменьшалась безопасность ssh. В пакете ssh обязательно присутствует утилита ssh-keygen, которая генерирует пару ключей: один публичный, который вы можете разместить на том сервере на который необходимо заходить по ssh без пароля(id_rsa.pub) и приватный(id_rsa).

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

Предшествует генерации ключей небольшой диалог:

1. Enter file in which to save the key (/home/user/.ssh/id_rsa): — предлагается изменить имя по умолчанию файла ключа, как правило не надо менять

2. Enter passphrase (empty for no passphrase): — предлагается ввести ключевую фразу, дополнительную защиту авторизации по ключу. В том случае если злоумышленник похитит ключ, без ключевой фразы он не сможет им воспользоваться. Если мы оставим эту строку пустой — защита ключа будет отключена.

3. Enter same passphrase again: — просят повторить ключевую фразу

На этом вопросы окончены, ssh-keygen выводит фингерпринт ключа и в домашнем каталоге, в подкаталоге .ssh размещаются файлы с ключами.

Теперь id_rsa.pub необходимо скопировать на тот хост на который вы будете заходить без пароля и сохранить его в домашнем каталоге в подкаталог .ssh в файл authorized_keys, в этом файле может находится несколько публичных ключей, по тому количеству приватных ключей — которое у вас есть.

Побочным эффектом, на который стоит обратить внимание всем системным администраторам, является то что даже если вы заменили кому нибудь пароль(поставили звезду в master.passwd) авторизация по ключу все равно будет работать.

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

Окт 23 2008

Смена шлюза по умолчанию… удаленно

Что делать, если нужно изменить default, а сервер находится далеко.
Перезагружать сервер очень не хочеца.
Допустим ситуация такая:

ip удаленного сервера: 195.66.136.7
default gateway:195.66.136.254
netmask: 255.255.255.0
new default gateway: 195.66.136.1

Адрес компьютера с которого мы должны иметь доступ:

ip: 89.252.34.107

Нужно первым делом прописать маршрут к своей машине через новый маршрут.
Делаем это так:

route add -host 89.252.34.107 195.66.136.1

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

route change default 195.66.136.1

Такое усложнение смены маршрута, вызвано тем, что я не раз натыкался на то что бывает не все в порядке с новым маршрутизатором и смена дефолта простым route change default приводит к потере управления и поездке за тридевять земель что бы перезагрузить его.

Окт 22 2008

rsync

Часто требуется синхронизировать содердимое каталогов на разных серверах. Для этого проще всего настроить rsync.
Устанавливаем из портов:

cd /usr/ports/net/rsync/
make install clean

Эту операцию нужно сделать и там где будет стоять сервер(оттуда мы будем получать новые и измененные файлы) и на клиенте(он будет вытягивать к себе изменения).
Пример настройки сервера(rsyncd.conf):

pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
#Секция описывающая директорию
#которую мы можем синхронизировать
[bin]
        uid = root
        gid = wheel
#путь к директории
        path = /usr/home/sh/bin/
        comment = My bin 
        max connections = 4
        read only = yes
#IP с которого разрешено подключаться
        hosts allow = 89.252.34.110
#Пользователь которому разрешено подключаться
        auth users = hilik
        max verbosity = yes
#Файл в котором хранятся данные авторизации
        secrets file = /usr/local/etc/rsyncd.secrets

Пример /usr/local/etc/rsyncd.secrets:

hilik:hilik

В файле описан в первом поле login во втором пароль на сессию
После того как вышеописанные процедуры будут выполнены, необходимо включить автозапуск rsyncd в rc.conf

echo "rsyncd_enable=YES" >>/etc/rc.conf

Можно запускать сервер:

/usr/local/etc/rc.d/rsyncd start

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

#!/bin/sh
#Устанавливаем пароль
RSYNC_PASSWORD='hilik'
export RSYNC_PASSWORD
#Указываем какой локальный каталог предназначен для синхронизации
PATH='/home/sh/bin'
#Путь к команде rsync
RSYNC='/usr/local/bin/rsync'
#Название экспортируемой директории
#Так как она описана в rsyncd.conf
EXP='bin'
#Адрес хоста с которым мы будем синхронизировать каталоги
HOST='89.252.34.107'
#Имя пользователя
USER='hilik'
#Непосредственный запуск rsync
#Конструкция --exclude="*~" запрещает синхронизацию файлов с ~ в конце
$RSYNC -av --exclude="*~" rsync://$USER@$HOST/$EXP $PATH

После того как мы создали скрипт синхронизации мы можем его выполнить.