Archive

Archive for the ‘linux’ Category

Увеличение conntrack таблицы в Linux

October 16th, 2009

Иногда, при повышенной сетевой нагрузке из-за большого количества соединений происходит превышение лимита на conntrack соединения. При этом в системном логе появляются сообщения:

Oct 16 21:40:24 my-host kernel: ip_conntrack: table full, dropping packet.
Oct 16 21:40:29 my-host kernel: printk: 817 messages suppressed.

Посмотрим какое ограничение у нас прописано сейчас:

sysctl -a|grep net.ipv4.netfilter.ip_conntrack_max

И сколько физически используется сейчас:

sysctl -a|grep net.ipv4.netfilter.ip_conntrack_count

Решением этой проблемы является увеличение данного лимита:

sysctl net.ipv4.netfilter.ip_conntrack_max=631072

Не лишне данный параметр записать в sysctl.conf

linux , ,

Добавление IP-алиасов в Debian

October 12th, 2009

/etc/network/interafces:

auto lo
iface lo inet loopback

allow-hotplug eth0
auto eth0
iface eth0 inet static
        address 1.2.3.2
        netmask 255.255.255.0
        network 1.2.3.0
        broadcast 1.2.3.255
        gateway 1.2.3.1
        dns-nameservers 208.67.222.222

auto eth0:0
iface eth0:0 inet static
        address 1.2.3.3
        netmask 255.255.255.0
        broadcast 1.2.3.255

auto eth0:1
iface eth0:1 inet static
        address 1.2.3.4
        netmask 255.255.255.0
        broadcast 1.2.3.255

Рестартим сеть:

/etc/init.d/networking restart

linux

Установка memcached на CentOS 5

September 25th, 2009
yum --enablerepo=remi install memcached

Конфиг (/etc/sysconfig/memcached):

PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 127.0.0.1"

Запуск:

chkconfig memcached on
/etc/init.d/memcached start

Если надо еще PHP расширение к нему:

yum --enablerepo=remi install php-pecl-memcache
или для PHP 5.2.10
rpm -ihv http://rpms.famillecollet.com/enterprise/5/olds/x86_64/php-pecl-memcache-3.0.4-1.el5.remi.x86_64.rpm
/etc/init.d/httpd reload

linux

Установка nginx с PHP как FastCGI на Debian Linux

September 9th, 2009

Отличная статья по этой теме здесь

linux

Справка по aptitude в Linux Debian

September 9th, 2009

Преимущество aptitude над apt состоит в том, что она лучше справляется с обработкой зависимостей и рекомендуется разработчиками Debian в качестве основного средства для управления пакетами.
Если вы раньше пользовались утилитами apt, то можете просто начать пользоваться aptitude, в большинстве случаев это не вызовет никаких проблем.
Справка по ключам:
install – Установить/обновить пакеты
remove – Удалить пакеты
purge – Удалить пакеты и их файлы конфигурации
hold – Зафиксировать пакеты
unhold – Отменить команду hold для пакета
markauto – Пометить пакет, что он был установлен автоматически
unmarkauto – Пометить пакет, что он был установлен вручную
forbid-version – Запретить aptitude обновлять определённую версию пакета.
update – Загрузить список новых/обновлённых пакетов
safe-upgrade – Perform a safe upgrade
full-upgrade – Perform an upgrade, possibly installing and removing packages
forget-new – Забыть, какие пакеты “новые”
search – Поиск пакета по имени и/или выражению
show – Показать подробную информацию о пакете
clean – Удалить загруженные файлы пакетов
autoclean – Удалить старые загруженные файлы пакетов
changelog – Посмотреть changelog пакета
download – Загрузить файл .deb для пакета
reinstall – Загрузить и (возможно) переустановить уже установленный пакет

Параметры:
-h Этот текст помощи
-s Имитировать действия, но не выполнять их на самом деле.
-d Только загрузить пакеты, ничего не устанавливать и не удалять.
-P Всегда спрашивать подтверждение или действия
-y Предполагать ответ ‘yes’ на простой вопрос yes/no
-F format Задать формат отображения результатов поиска; смотрите руководство
-O order Задать формат сортировки результатов поиска; смотрите руководство
-w width Задать ширину вывода результатов поиска
-f Принудительно исправлять неработоспособные пакеты.
-V Показывать версию устанавливаемых пакетов.
-D Показывать зависимости автоматически изменяемых пакетов.
-Z Показывать изменение размера установки каждого пакета.
-v Отображать дополнительную информацию. (может быть введено несколько раз)
-t [release] Задать выпуск, из которого должны быть установлены пакеты
-q Не выводить индикатор прогресса в режиме командной строки.
-o key=val Вручную установить значение параметра настройки с именем ‘key’
–with(out)-recommends Указать, будут ли рекомендуемые пакеты
трактоваться как строгие зависимости
-S fname Читать aptitude информацию о расширенном статусе из fname.
-u Загрузить список новых пакетов при запуске.
-i Запустить установку при запуске.

После выполнения, например, aptitude search package_name в левой колонке можно увидеть два ряда статусов:
Значения основного статуса следующие:
i (от installed) – пакет установлен в системе:
p (от purge) – пакет не был установлен или был удален “вчистую”
c (от clean) – пакет, удаленный с сохранением конфигурационных файлов;
v (от virtual) – т.н. виртуальные пакеты, то есть просто списки реальных пакетов, один из которых будет использоваться в той или иной ситуации.

Дополнительный статус пакета может принимать такие значения:
A (от Auto) – пакет был установлен не самостоятельно, а автоматически, как зависимость другого пакета;
h (от hold) – для пакета зафиксирована его текущая версия, то есть он не будет обновляться при выполнении операторов upgrade и dist-upgrade (см. ниже);
u (от unpacked) – пакет был получен, распакован, но не инкорпорирован в файловую систему и не сконфигурирован;
C (от half-Configured) – пакет, установка которого оборвалась на стадии конфигурирования;
H (от Half-installed) – пакет, установка которого оборвалась на стадии инсталляции;
B (от Broken) – т.н. “сломанные” пакеты – то есть содержащие ошибки внутри себя или утратившие свои зависимости.

linux , ,

Из какого пакета файл?

July 22nd, 2009

Отличная статья отвечающая на вопрос Из какого пакета установлен файл?

FreeBSD, linux , , ,

Простой скрипт бэкапа типового веб-сервера

June 23rd, 2009

Скрипт может создавать локальный архив из указанных каталогов, с указанными исключениями; архив mysql-баз. Может закачивать их на указанный FTP-сервер. Автоматически удаляет старые архивные копии (два варианта правил). Есть поддержка полного и инкрементального бэкапов. Работает под FreeBSD и Linux. Есть шифрование архивов и отправка уведомления о результатах на электронную почту.
Текст всех файлов ниже. Возможно удобнее будет скачатьархив:
файл backup.sh

#!/bin/sh

# Kiloservers.com sample backup script
# Last changes from: 23-07-2009

# Global backup tasks
mysql="YES" # need backup mysql bases? YES || NO
filebackup="YES" # need perform backup local files? YES || NO
savelocalbackup="YES" # need save backup on local drive? YES || NO
uploadbackup="YES" # need upload backup to FTP server? YES || NO
encryptbackup="NO" # need encrypt backup? YES || NO. If "YES" setup "encryptkey".
emailresult="YES" # need send e-mail with the results of backup? YES || NO. If "YES" setup "emailforresult".

# Common parametrs
backuptype="full" # 'full' or 'incremental'-files changed after last full backup
scriptdir="/etc/backup-complect" # homedir of this script
backupdir="/home/backup" # where save local backup
incfile="incfile" # file/dirs include to backup. Change content of this file
exfile="exfile" # file/dirs exclude from backup. Change content of this file
minfreespace="5000" # Minimal free space on backup slice in MB to start backup
encryptkey="" # Secret key to encrypt backup. Min 10 symbols recommended. Make sure that this key is kept in a safe place!
gpgpath="/usr/local/bin/" # path to gpg program
ftppath="/usr/bin/" # path to ftp client program
emailforresult="" # e-mail for backup results
sendmailpath="/usr/sbin/" # path to sendmail program

# FTP settings
ftphost="" # backup host
ftpuser=""
ftppass=""

# SQL settings
sqluser="root"
sqlpass=""
sqlhost="localhost"
allbases="YES" # 'YES' or 'NO'. Backup all bases or only from 'backupsqlbases' parametr
backupsqlbases="mysql" # bases list separate by space
mysqlutilspath="/usr/local/bin/" # path to 'mysql' and 'mysqldump' folder. No need to change.
sqldef="--single-transaction --skip-add-locks --skip-disable-keys --force" # parametrs for mysqldump


#######################
##### just do it! #####
#######################

salt=`< /dev/urandom tr -dc A-Za-z0-9 | head -c8` # random string for more secure ftp uploads
freespace=`df -m $backupdir | grep dev | awk '{print $4}'` # current free space on backupdir slice
hostn=`hostname`
backupstartdate=`date "+%Y-%m-%d %H:%M %Z%n"`

# check to exist backupdir
if [ ! -d $backupdir ];  then
   echo "$backupdir backupdir is no exist! Backup canceled."
   exit
fi

# check to exist mysql/mysqldump program
if [ $mysql = YES ]; then
    if [ ! -f $mysqlutilspath"/mysql" ];  then
        mysqlutilspath="/usr/bin/"
        if [ ! -f $mysqlutilspath"/mysqldump" ];  then
            echo "mysqldump program is not exist on this path $mysqlutilspath ! Backup canceled."
            exit
        fi
    fi
fi

# check to email setup
if [ $emailresult = YES ]; then
    if [ $emailforresult = "" ]; then
        echo "You should setup emailforresult parametr. Backup canceled."
        exit
    fi

    if [ ! -f $sendmailpath"/sendmail" ];  then
        echo "You should setup sendmail before. Backup canceled."
        exit
    fi
fi

# check to exist ftp client program
if [ $uploadbackup = YES ]; then
    if [ ! -f $ftppath"/ftp" ];  then
        ftppath="/usr/local/bin/"
        if [ ! -f $ftppath"/ftp" ];  then
            echo "FTP client program is not exist on this path $ftppath ! Backup canceled."
            echo "To install ftp client on CentOS/RHEL:"
            echo "yum install ftp"
            exit
        fi
    fi

    # remove old ftp logs
    if [ -f $scriptdir"/ftpdump.txt" ];  then
        rm $scriptdir"/ftpdump.txt"
    fi
fi

# check to free space on backupdir
if [ $minfreespace -ge $freespace ]; then
    echo "Free space not enought! Backup canceled."
    exit
fi

# check gpg and secret key
gpgext=""
if [ $encryptbackup = YES ]; then
    if [ $encryptkey = "" ]; then
        echo "You must install the encryption key. Exit."
        exit
    fi

    if [ ! -f $gpgpath"/gpg" ];  then
        gpgpath="/usr/bin/"
        if [ ! -f $gpgpath"/gpg" ];  then
            echo "GnuPG v.1 is not found. You must setup path to GnuPG v.1 in gpgpath or setup GnuPG v.1."
            echo "To setup GnuPG v.1 on FreeBSD use:"
            echo "pkg_add -r gnupg1"
            echo "or"
            echo "cd /usr/ports/security/gnupg1 && make install"
            echo ""
            echo "To setup GnuPG v.1 on CentOS/RHEL use:"
            echo "yum install gnupg"
            echo ""
            echo "Backup canceled."
            exit
        fi
    fi
    gpgext=".gpg"
fi

# check OS
checkos=`uname -a | grep -c "FreeBSD"`

# if FreeBSD
if [ $checkos = "1" ]; then
    newerparam=" --newer-mtime-than "$scriptdir"/metka"
fi

# if Linux
if [ $checkos = "0" ]; then
    newerparam=" --newer "$scriptdir"/metka"
fi

if [ $backuptype = full ]; then
    newerparam=""
fi


incfile=$scriptdir"/"$incfile
exfile=$scriptdir"/"$exfile
curdate=`date "+%Y-%m-%d%n"`
curdatewithhours=`date "+%Y-%m-%d-%H%n"`

# get list of all mysql bases
if [ $mysql = YES ]; then
    echo "Get MySQL databases list"
    if [ $allbases = YES ]; then
        backupsqlbases=`echo "show databases"|$mysqlutilspath'mysql' --user=$sqluser --password=$sqlpass --host=$sqlhost|grep -v "^D"`
    fi
fi

# create remote current day folder
if [ $uploadbackup = YES ]; then
    echo "Create remote current day folder"
    ftp -i -n $ftphost 2>&1 1>>$scriptdir/ftpdump.txt <<END_SCRIPT
    quote USER $ftpuser
    quote PASS $ftppass
    mkdir /$curdate
    quit
END_SCRIPT
fi


if [ ! -d $backupdir"/"$curdate ];  then
    echo "Creating "$backupdir"/"$curdate
    mkdir $backupdir"/"$curdate
    chmod 777 $backupdir"/"$curdate
fi
cd $backupdir"/"$curdate

# create and upload mysql bases backup
if [ $mysql = YES ]; then
    echo "Begin export databases"
    for base in $backupsqlbases
        do
        $mysqlutilspath'mysqldump' $sqldef --user=$sqluser --password=$sqlpass --host=$sqlhost $base > $backupdir/$curdate/$base.sql
    done

    echo "Begin compress databases"
    nice -n 15 tar -cz -f $backupdir/$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz $backupdir/$curdate/*.sql
    rm $backupdir/$curdate/*.sql

    # get filesize
    if [ $checkos = "1" ]; then
        sqlbackupfilesize=`stat -f %z $backupdir/$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz`
        else
        sqlbackupfilesize=`stat -c %s $backupdir/$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz`
    fi

    if [ $encryptbackup = YES ]; then
        echo "Begin encrypt databases archive"

        echo "$encryptkey" | $gpgpath/gpg --no-tty --passphrase-fd 0 --cipher-algo AES256  -cq $backupdir/$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz
        rm $backupdir/$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz

        # get filesize for gpg files
        if [ $checkos = "1" ]; then
            sqlbackupfilesizegpg=`stat -f %z $backupdir/$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz$gpgext`
            else
            sqlbackupfilesizegpg=`stat -c %s $backupdir/$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz$gpgext`
        fi
    fi

    if [ $uploadbackup = YES ]; then
        echo "Begin upload databases archive"
        ftp -i -n $ftphost 2>&1 1>>$scriptdir/ftpdump.txt <<END_SCRIPT
        quote USER $ftpuser
        quote PASS $ftppass
        binary
        put $backupdir/$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz$gpgext /$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz$gpgext
        quit
END_SCRIPT
    fi

    if [ $savelocalbackup = NO ]; then
        echo "Remove local copy databases archive"
        rm $backupdir/$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz
        rm $backupdir/$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz$gpgext
    fi
fi

# create and upload file backup
if [ $filebackup = YES ]; then
    echo "Begin compress files archive"

    nice -n 15 tar -cz $newerparam -f $backupdir/$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz -T $incfile -X $exfile

    # get filesize
    if [ $checkos = "1" ]; then
        filebackupfilesize=`stat -f %z $backupdir/$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz`
        else
        filebackupfilesize=`stat -c %s $backupdir/$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz`
    fi

    if [ $encryptbackup = YES ]; then
        echo "Begin encrypt files archive"

        echo "$encryptkey" | $gpgpath/gpg --no-tty --passphrase-fd 0 --cipher-algo AES256  -cq $backupdir/$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz
        rm $backupdir/$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz

        # get filesize for gpg files
        if [ $checkos = "1" ]; then
            filebackupfilesizegpg=`stat -f %z $backupdir/$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz$gpgext`
            else
            filebackupfilesizegpg=`stat -c %s $backupdir/$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz$gpgext`
        fi
    fi

    if [ $uploadbackup = YES ]; then
        echo "Begin upload files archive"
        ftp -i -n $ftphost 2>&1 1>>$scriptdir/ftpdump.txt <<END_SCRIPT
        quote USER $ftpuser
        quote PASS $ftppass
        binary
        put $backupdir/$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz$gpgext /$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz$gpgext
        quit
END_SCRIPT
    fi

    if [ $savelocalbackup = NO ]; then
        echo "Begin remove local copy files archive"
        rm $backupdir/$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz
        rm $backupdir/$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz$gpgext
    fi
fi


# update special file for incremental backup
touch $scriptdir/metka

backupenddate=`date "+%Y-%m-%d %H:%M %Z%n"`

# send result e-mail
if [ -f $backupdir/report ];  then
    rm $backupdir/report
fi

if [ $emailresult = YES ]; then
    echo "Send a e-mail with the results"

    echo "Subject: $hostn `date "+%Y-%m-%d%n"` backup result" >> $backupdir/report

    echo "Backup started: $backupstartdate
Backup ended: $backupenddate" >> $backupdir/report

    echo "After backup free space on "$backupdir" - "`df -m $backupdir | grep dev | awk '{print $4}'`" MB" >> $backupdir/report

    if [ $filebackup = YES ]; then
        echo "Current file backup - "$filebackupfilesize" bytes - "$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz >> $backupdir/report

        if [ $encryptbackup = YES ]; then
            echo "Current encrypted file backup - "$filebackupfilesizegpg" bytes - "$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz$gpgext >> $backupdir/report
        fi
    fi

    if [ $mysql = YES ]; then
        echo "Current mysql backup - "$sqlbackupfilesize" bytes - "$hostn-sql-backup-$curdatewithhours-$salt.tar.gz >> $backupdir/report

        if [ $encryptbackup = YES ]; then
            echo "Current encrypted mysql backup - "$sqlbackupfilesizegpg" bytes - "$hostn-sql-backup-$curdatewithhours-$salt.tar.gz$gpgext >> $backupdir/report
        fi
    fi

    if [ $uploadbackup = YES ]; then
        echo "Error during ftp upload: " >> $backupdir/report
        cat $scriptdir"/ftpdump.txt" >> $backupdir/report
    fi

    echo "
Local backup folder statistics:" >> $backupdir/report
    if [ $checkos = "1" ]; then
        du -hc -d 1 $backupdir >> $backupdir/report
        else
        du -hc --max-depth=1 $backupdir >> $backupdir/report
    fi

    cat $backupdir/report | $sendmailpath"/sendmail" $emailforresult
    rm $backupdir/report
fi

echo "Backup complete"
exit

Файл exfile

/var/log/
/home/mysql
*.bz2
*.err
*.flv
*.log
*.zzz
*.rar
*.wmv
*.gz
*.bz2
*.avi
*.zip

Файл incfile

/etc
/usr/local/etc

файл install.txt

INSTALLATION:

1. Copy this folder to /etc/
2. Create "backupdir" folder
3. Edit "incfile" (dirs are included in the backup) and "exfile" (dirs deleted from the backup) files
4. If need - create SQL user for backup and set "mysql" to YES
5. If need - set "encryptbackup" to YES and set encryptkey. To decrypt use "gpg -o output_filename.tar.gz -d encrypted_filename.gpg"
6. Setup "emailforresult"
7. Configure spacer.sh to check the free space
8. Create cron task. For example, for full backup, at first day of month .. and check free space:
###################
5       7       1       *       *       root    /etc/backup-complect/spacer.sh 2> /dev/null
15       7       1       *       *       root    /etc/backup-complect/backup.sh 2> /dev/null
###################
9. Perform the test run:
cd /etc/backup-complect
./backup.sh


IMPORTANT!
Do not forget to do a test restore!

Файл spacer.sh

#!/bin/sh

# Kiloservers free space and count files checker.
# The script deletes old files from "backupdir" until not enough free space
# OR
# deletes old files from "backupdir" until number of files reaches the required
# Last changes from: 23-07-2009

# Settings
mode="space" # work mode: "space" or "count".
minfreespace="5000" # Minimal free space in MB. Actual for "space" mode
count="6" # how many files stored. Actual for "count" mode
backupdir="/home/backup" # directory to check

### Begin ###
echo "Mode $mode active"

# check OS
checkos=`uname -a | grep -c "FreeBSD"`

if [ $mode = "space" ]; then
    while [ `df -m $backupdir | grep dev | awk '{print $4}'` -lt $minfreespace ]
    do
        if [ $checkos = "1" ]; then
            filetodelete=`find $backupdir -type f -exec stat -f "%Sm %N" -t %Y%m%d%H%M%S {} \; | sort -n | head -1 | cut -d' ' -f2`
            else
            filetodelete=`find $backupdir -type f -exec stat -c "%Y %n" {} \; | sort -n | head -1 | cut -d' ' -f2`
        fi

        if [ -z $filetodelete ]; then
            echo "No files found. Exit"
            exit
            else
            rm $filetodelete
            echo "Deleted $filetodelete"
        fi
    done
fi

if [ $mode = "count" ]; then
    while [ `find $backupdir -type f | wc -l` -gt $count ]
    do
        if [ $checkos = "1" ]; then
            filetodelete=`find $backupdir -type f -exec stat -f "%Sm %N" -t %Y%m%d%H%M%S {} \; | sort -n | head -1 | cut -d' ' -f2`
            else
            filetodelete=`find $backupdir -type f -exec stat -c "%Y %n" {} \; | sort -n | head -1 | cut -d' ' -f2`
        fi

        if [ -z $filetodelete ]; then
            echo "No files found. Exit"
            exit
            else
            rm $filetodelete
            echo "Deleted $filetodelete"
        fi
    done
fi

echo "Check complete"

FreeBSD, linux, Uncategorized ,

Добавление нового диска в Linux

June 10th, 2009

Проверяем, что диск виден в системе:

fdisk -l

Допустим, новый диск виден как /dev/sdb
Создаем раздел на нем:

fdisk /dev/sdb
n
p
2

Создаем фс:

mkfs.ext3 /dev/sdb1 -j

Создаем папку для монтирования, прописываем label новому диску, монтируем:

mkdir /mnt/newdisk
e2label /dev/sdb1 /mnt/newdisk
mount /dev/sdb1 /mnt/newdisk

Добавляем в fstab:

LABEL=/mnt/newdisk              /mnt/newdisk                    ext3    defaults        1 2

linux , ,

Базовая установка LAMP в Debian

June 7th, 2009

Ставим апач:

apt-get install apache2 php5 libapache2-mod-php5 php5-curl

Конфиги в /etc/apache2/
Для добавления виртуалхоста создаем его конфиг (domain.com) в /etc/apache2/sites-available/ и:

a2ensite domain.com

Для выключения:

a2dissite domain.com

Для включения модулей апача:

a2enmod rewrite

Ставим мускул:

apt-get install mysql-server mysql-client php5-mysql

Конфиги в /etc/mysql/

Ставим nginx:

apt-get install nginx

linux , , , ,

Изменение media для сетевухи под linux

June 3rd, 2009

Меняем:

ethtool --change eth0 autoneg off speed 10 duplex full

Чтобы действовало после перезагрузки добавляем в файл /etc/sysconfig/network-scripts/ifcfg-eth0:

ETHTOOL_OPTS="autoneg off speed 10 duplex full"

linux ,

Скрипт установки типового веб-сервера на Linux (CentOS)

May 13th, 2009

Задача: в автоматическом режиме установить основное ПО необходимое для работы веб-сервер: nginx/Apache/PHP/MySQL/vsftpd.
Скачать скрипт целиком

#!/bin/bash

### ver. 0.98 from 11.10.2010

os=`cat /etc/issue |grep -c CentOS`
if [ $os = "0" ]; then
    echo "This script work only on CentOS. Exit."
    exit
fi

echo "Enter username to create (default, admin):"
read USER
echo "This host is VPS? (yes/no. Default, no):"
read thisvps
echo "Use Remi repos? (yes/no. Default, yes):"
read useremi

if [ -z $USER ]; then
    USER=admin
fi
if [ -z $thisvps ]; then
    thisvps=no
fi
if [ -z $useremi ]; then
    useremi=yes
fi

confighost=unix-notes.ru
USERPASS=`< /dev/urandom tr -dc A-Za-z0-9 | head -c15`
SQLPASS=`< /dev/urandom tr -dc A-Za-z0-9 | head -c15`
thiswebazilla=`uname -a | grep -c "webazilla"`

sestat=`sestatus|grep -c enabled`
if [ $sestat = "1" ]; then
    sed -i 's/enforcing/disabled/gi' /etc/selinux/config
    sed -i 's/permissive/disabled/gi' /etc/selinux/config
    chkconfig sshd on
    echo "Need reboot to SELinux disable ... After reboot run script again"
    exit
fi

checkarch=`uname -a | grep -c "i386"`
if [ $checkarch = "1" ]; then
    PL=i386
    else
    PL=x86_64
fi

# check to exist homedir
if [ ! -d /home ];  then
   echo "/home is no exist! setup canceled."
   exit
fi

iptables -F
iptables -X
/etc/init.d/iptables save

# add additional dns servers, OpenDNS
echo "nameserver 8.8.8.8" >> /etc/resolv.conf


mkdir /root/.ssh
cd /root/.ssh
chown -R root /root
chmod -R 400 /root

if [ $thisvps = "no" ]; then
    cd /etc
    rm -f /etc/sysctl.conf
    wget http://$confighost/config/linux/sysctl.conf
    sysctl -p

    ln -fs /usr/share/zoneinfo/Europe/Moscow /etc/localtime
    yum --noplugins -y install ntp
    ntpdate pool.ntp.org
    echo "1 1 * * * root ntpdate pool.ntp.org" >> /etc/crontab
fi

if [ $thisvps = "yes" ]; then
    ln -fs /usr/share/zoneinfo/Europe/Moscow /etc/localtime
fi

if [ $PL = x86_64 ]; then
        cd /root
        rpm -ihv http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
        wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
        rpm -ihv /root/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm

        if [ $useremi = yes ]; then
            rpm -ihv http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
        fi
fi

if [ $PL = i386 ]; then
        cd /root
        rpm -ihv http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
        wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
        rpm -ihv /root/rpmforge-release-0.3.6-1.el5.rf.i386.rpm

        if [ $useremi = yes ]; then
            rpm -ihv http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
        fi
fi

if [ $useremi = yes ]; then
    yum --noplugins --enablerepo=remi install mc.$PL vsftpd.$PL httpd.$PL httpd-devel.$PL php.$PL mysql-server.$PL php-mysql.$PL nginx.$PL mod_geoip.$PL php-mbstring.$PL php-gd.$PL php-mcrypt.$PL make.$PL which.$PL
    else yum --noplugins install mc.$PL vsftpd.$PL httpd.$PL httpd-devel.$PL php.$PL mysql-server.$PL php-mysql.$PL nginx.$PL mod_geoip.$PL php-mbstring.$PL php-gd.$PL php-mcrypt.$PL make.$PL which.$PL
fi

chkconfig --level 2345 mysqld on
chkconfig --level 2345 httpd on
chkconfig --level 2345 vsftpd on
chkconfig --level 2345 nginx on
chkconfig --level 2345 cups off
chkconfig --level 2345 sendmail on
chkconfig --level 2345 sshd on

cd /etc/vsftpd
rm -f /etc/vsftpd/vsftpd.conf
wget http://$confighost/config/linux/vsftpd.conf
chmod 400 /etc/vsftpd/vsftpd.conf

cd /usr/local/src
wget http://$confighost/config/mod_rpaf-0.6.tar.gz
tar xzf mod_rpaf-0.6.tar.gz
cd mod_rpaf-0.6
ln -s /usr/sbin/apxs /usr/sbin/apxs2
make rpaf-2.0
make install-2.0

cd /etc/httpd/conf.d
wget http://$confighost/config/linux/mod_rpaf.conf
iplist=`ifconfig | grep inet | awk '{print $2}' | awk -F: '{print $2}' | grep -v '^$' | tr "\n" " "`
sed -i "s/127.0.0.1/$iplist/g" /etc/httpd/conf.d/mod_rpaf.conf

# Create user and setup user folders
adduser -d /home/$USER -m -s /sbin/nologin $USER
echo "$USER:$USERPASS" |chpasswd
mkdir /home/$USER/domains
chmod -R 755 /home/$USER

cd /home/$USER
wget http://$confighost/config/linux/create_domain.sh
sed -i "s/testuser/$USER/g" /home/$USER/create_domain.sh
chmod +x /home/$USER/create_domain.sh
mkdir /etc/httpd/vhosts
cd /etc/httpd/vhosts
wget http://$confighost/config/linux/sample

cd /home/$USER
wget http://$confighost/config/linux/create_base.sh
sed -i "s/INSERTPASSHERE/$SQLPASS/g" /home/$USER/create_base.sh
chmod +x /home/$USER/create_base.sh

cd /home/$USER
wget http://$confighost/config/linux/create_multi_bases.sh
sed -i "s/INSERTPASSHERE/$SQLPASS/g" /home/$USER/create_multi_bases.sh
sed -i "s/username/$USER/g" /home/$USER/create_multi_bases.sh
chmod +x /home/$USER/create_multi_bases.sh


cd /etc/httpd/conf/
rm -f /etc/httpd/conf/httpd.conf
wget http://$confighost/config/linux/httpd.conf
rm -f /etc/httpd/conf.d/proxy_ajp.conf
rm -f /etc/httpd/conf.d/welcome.conf

cd /etc/nginx/
rm -f /etc/nginx/nginx.conf
wget http://$confighost/config/linux/nginx.conf
iplist2=`ifconfig | grep inet | awk '{print $2}' | awk -F: '{print $2}' | grep -v '^$'|grep -v 127.0.0.1 | sed 's/\(.*\)/listen \1;/'`
sed -i "s/user_name/$USER/gi" /etc/nginx/nginx.conf
sed -i "s/IPADDR/$iplist2/gi" /etc/nginx/nginx.conf

mkdir /home/mysql
mkdir /home/mysql/tmp
chown -R mysql /home/mysql/
chmod -R 755 /home/mysql/
cd /etc
rm -f /etc/my.cnf
if [ $thisvps = "no" ]; then
    wget http://$confighost/config/linux/my.cnf
fi
if [ $thisvps = "yes" ]; then
    wget http://$confighost/config/linux/vps/my.cnf
fi
service mysqld start
mysqladmin password $SQLPASS
echo "DELETE FROM mysql.user WHERE Password=''" | mysql --password=$SQLPASS

service vsftpd start
service httpd start
service nginx start
service cups stop

if [ $PL = x86_64 ]; then
        cd /root
        wget http://$confighost/config/linux/ZendOptimizer-3.3.3-linux-glibc23-x86_64.tar.gz
        tar zxvf /root/ZendOptimizer-3.3.3-linux-glibc23-x86_64.tar.gz
        cd /root/ZendOptimizer-3.3.3-linux-glibc23-x86_64
        ./install.sh
fi

if [ $PL = i386 ]; then
        cd /root
        wget http://$confighost/config/linux/ZendOptimizer-3.3.3-linux-glibc23-i386.tar.gz
        tar zxvf /root/ZendOptimizer-3.3.3-linux-glibc23-i386.tar.gz
        cd ZendOptimizer-3.3.3-linux-glibc23-i386
        ./install.sh
fi

echo "##############################"
echo "Setup ready!"
echo "FTP username: $USER"
echo "FTP password: $USERPASS"
echo "MySQL root password: $SQLPASS"
echo "##############################"

linux

Базовые вещи в iptables

May 5th, 2009

Применяется первое правило удовлетворяющее критерию. Для действий ACCEPT, DROP, REJECT обработка правил приостанавливается.

Примеры правил:
Посмотреть полный список всех актуальных правил:

iptables-save

ставить в конец цепочки правило блокирующее трафик с IP

iptables -A INPUT -i eth0 -s 1.2.3.1 -j DROP

вставить первым разрешающее правило для подсети

iptables -I INPUT 1 -i eth0 -s 192.168.0.0/24 -j ACCEPT

разрешить весь входящий трафик по loopback

iptables -I INPUT 1 -i lo -j ACCEPT

пример исп-я указания протокола (tcp,udp,icmp,all), адреса назначения, порта источника/назначения

iptables -A INPUT -p tcp -d 1.2.3.1 --sport 3389 --dport 22 -j DROP

разрешить входящие подключения на веб-сервер

iptables -A INPUT -i eth0 -p TCP -m multiport --dports 80,443 -j ACCEPT

разрешить трафик по уже установленным соединениям

iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

разрешаем входящие эхо-запросы

iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

удаляем правило по критерю

iptables -D INPUT --dport 80 -j DROP

Листинг правил с номерами:

iptables -L POSTROUTING -t nat -n -v --line-numbers
iptables -L FORWARD -n -v --line-numbers

удаляем правило по номеру (нумеруются с 1, цепочку надо указывать)

iptables -D INPUT 1
iptables -D FORWARD 55
iptables -t nat -D POSTROUTING 15

листинг всех правил во всех цепочках без резолва

iptables -L -n

листинг правил из цепочки

iptables -L INPUT

очистка всех правил

iptables -F

очистка правил в цепочке

iptables -F INPUT

добавление новой цепочки

iptables -N samplechain

удаление заданной цепочки

iptables -X samplechain

Политика по умолчанию для цепочки INPUT устанавливается в ACCEPT

iptables -P INPUT ACCEPT

linux

Базовая настройка IPtables, защита sshd от перебора пароля

April 1st, 2009
chkconfig iptables on
service iptables start
iptables -F
iptables -N SSH_CHECK
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j SSH_CHECK
iptables -A SSH_CHECK -m recent --set --name SSH
iptables -A SSH_CHECK -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
/etc/init.d/iptables save

На 5 минут будет установлена блокировка ip-адреса подбирающего пароли к sshd через 3 попытки .

linux , ,

Перенаправление почты root-а на внешний ящик (linux)

March 30th, 2009

Правим /etc/aliases (или /etc/mail/aliases, смотря какая система), пишем:

root: address@domain.com

Выполняем команду newaliases и все.

linux, почта ,

Блокировка консоли в Linux/FreeBSD

March 24th, 2009

Для настройки автологоута в bash надо поместить в ~/.bash_profile (время в секундах):

export TMOUT=600

Для настройки автологоута в tcsh надо поместить в ~/.cshrc или в ~/.tcshrc

set autologout = (VAL1 VAL2)

Где,
VAL1 : Время неактивности в минутах после которого происходит автоматический логоут
VAL2 : Время неактивности в минутах после которого происходит автоматическая блокировка

Для ручной блокировки консоли в Linux ставим

yum install vlock

Для ручной блокировки консоли во FreeBSD используется

lock

FreeBSD, linux

Заметка о работе с Yum

March 16th, 2009
yum upgrade #Обновить все пакеты
yum install package #Установить пакет
yum remove package #Удалить пакет
yum update package #Обновить пакет
yum --enablerepo=remi update package #Обновить с приоритетом реп-я remi
yum search package #Поиск пакета по имени и описанию
yum list package #Поиск пакета по имени
yum list installed #список всех установленных пакетов
yum info package #Подробная информация о пакете
yum deplist package #Посмотреть зависимости пакета
yum localinstall path_to_package #Установить пакет с диска
yum clean all #часто помогает при глюках yum-а
yum --noplugins install package #отключить плагины на время операции. Использовать когда мало памяти

linux ,

Включение свопа в Linux

March 12th, 2009
swapon -s #смотрим состояние свопа
dd if=/dev/zero of=/swapfile bs=1024 count=4194304 # создаем файл, 4Г
mkswap /swapfile #подготавливаем своп
swapon /swapfile #включаем его в системе

Чтобы он остался и после ребута, добавляем в fstab:

/swapfile swap swap defaults 0 0

linux ,

Оптимизация sysctl в linux

March 6th, 2009
net.core.somaxconn=16384
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=1
net.core.wmem_max=8388608
net.core.rmem_max=8388608
net.core.netdev_max_backlog=2500
net.ipv4.conf.all.arp_filter=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.tcp_max_syn_backlog=4096
net.ipv4.tcp_fin_timeout=25
net.ipv4.tcp_timestamps=0
net.core.rmem_default=262144
net.core.wmem_default=262144
net.ipv4.tcp_keepalive_time=1800
net.ipv4.netfilter.ip_conntrack_max = 131072

Чтобы применить на лету:

sysctl -p

Необходимо учесть, что с таким кипаливом через полчаса будут рваться неактивные tcp-соединения. Например, ssh-сессии.

linux ,

Установка RAID1 на работающей Linux-системе

March 6th, 2009

Установка OpenVPN на Linux (в OpenVZ контейнер)

March 2nd, 2009

Ставим openvpn из yum-а или из RPM http://dag.wieers.com/rpm/packages/openvpn/

yum install openvpn lzo-devel
chkconfig openvpn on

Если ставится версия 2.0 то лучше поставить поверх из исходников последнюю версию (2.1 или старше) и переписать бинарник /usr/local/sbin/openvpn -> /usr/sbin/openvpn

На хост машине для контейнера надо разрешить tun-устройства и модули ната для iptables:

vzctl set 900 --save --devnodes net/tun:rw
vzctl stop 900
vzctl set 900 --save --iptables "ip_conntrack iptable_filter iptable_mangle ipt_state iptable_nat ip_nat_ftp ip_conntrack_ftp"
vzctl start 900

Затем подготавливаем папки конфигов:

cp -R /usr/share/openvpn/easy-rsa/2.0 /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
chmod 777 *
mkdir /etc/openvpn/keys

Для версии 2.2 и старше будет чуть по другому:

cp -R /usr/share/doc/openvpn-2.2.0/easy-rsa /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa/2.0
chmod 777 *
mkdir /etc/openvpn/keys
touch /etc/openvpn/keys/index.txt
echo "01" > /etc/openvpn/keys/serial

в vars-файле в /etc/openvpn/easy-rsa/2.0 заменяем строку:

export KEY_DIR=...

на

export KEY_DIR=/etc/openvpn/keys

Генерируем все сертификаты:

cd /etc/openvpn/easy-rsa
. ./vars
./clean-all
./build-ca
./build-key-server server
./build-dh
openvpn --genkey --secret /etc/openvpn/keys/ta.key
./build-key client1
./build-key client2

В процессе генерации сертификатов можно ничего не вводить. Все оставить по дефолту.
Последняя строчка делается столько раз, сколько надо ключей для клиентов.
Не забыть, что если дата на клиенте меньше чем дата на сервере в момент генерации сертификата – подключение не пройдет.

Включаем роутинг:

echo 1 > /proc/sys/net/ipv4/ip_forward

и правим соотвествующую строчку в sysctl.conf

Конфиг для сервера /etc/openvpn/server.conf:

proto tcp
dev tun
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh1024.pem
tls-server
tls-auth /etc/openvpn/keys/ta.key 0
server 10.10.10.0 255.255.255.0
ifconfig-pool-persist /etc/openvpn/ipp.txt
client-to-client
duplicate-cn
keepalive 10 60
ping-timer-rem
comp-lzo
user nobody
group nobody
persist-key
persist-tun
verb 4
mute 10
log /var/log/openvpn/openvpn.log
status /var/log/openvpn/openvpn-status.log
push "dhcp-option DNS 208.67.222.222"

Ставим, включаем и делаем роутинг в iptables:

yum install iptables
# делаем автостарт файрволу
chkconfig iptables on
# правило для нат-а, VE_IP_ADDRESS заменить на IP, который будет у вас "исходящим" для впн-трафика
iptables -t nat -A POSTROUTING -s 10.10.10.0/255.255.255.0 -o venet0 -j SNAT --to-source VE_IP_ADDRESS
# сохраняем правила
/etc/init.d/iptables save
# еще раз смотрим на сохраненные правила и проверяем
iptables -t nat -L
mkdir /var/log/openvpn
chmod 777 /var/log/openvpn
service openvpn start

Конфиг одного клиента (будет работать для Windows XP, Windows Vista и Windows 7):

dev tun
proto tcp
remote vpn.domain.com
client
resolv-retry infinite
redirect-gateway def1
ca ca.crt
cert client1.crt
key client1.key
tls-client
tls-auth ta.key 1
cipher BF-CBC
ns-cert-type server
comp-lzo
persist-key
persist-tun
verb 4
route-metric 1
route-method exe
route-delay 2

Для Windows Vista, Windows 7 запускать клиента надо с админскими правами через батник:

cd c:\vpn\
"c:\program files\openvpn\bin\openvpn.exe" c:\vpn\client1.ovpn
pause

ЗЫ. На хостовой ноде может быть не загружен модуль ядра tun. Тогда:

modprobe tun
modprobe -l |grep tun

linux , ,