User Tools

Site Tools


Sidebar


Tags Cloud
start

Last updates

Установка программ и FreeBSD 6.x для безошибочно верной инсталляции Dedikit

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

# portsnap fetch && portsnap extract

Стадия 1

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

# make install clean -C /usr/ports/textproc/libxml2 && make install clean -C /usr/ports/ftp/curl && make install clean -C /usr/ports/mail/cclient && make install clean -C /usr/ports/security/mcrypt && \
make install clean -C /usr/ports/databases/mysql50-server && make install clean -C /usr/ports/www/nginx && make install clean -C /usr/ports/ftp/vsftpd && make install clean -C /usr/ports/graphics/jpeg && \
make install clean -C /usr/ports/graphics/png && make install clean -C /usr/ports/www/oops && make install clean -C /usr/ports/net-mgmt/net-snmp && make install clean -C /usr/ports/devel/libltdl15 && \
make install clean -C /usr/ports/ftp/wget && make install clean -C /usr/ports/net/mpd && make install clean -C /usr/ports/devel/zziplib && make install clean -C /usr/ports/textproc/libxslt && \
make install clean -C /usr/ports/textproc/sablotron && make install clean -C /usr/ports/net/cvsup

Стадия 2

Всяческие рулезы

# mkdir -p /home/mysql && chown mysql\: /home/mysql
# wget http://kyxap.crimea.ua/rc/vimrc -O ~/.vimrc
# wget http://kyxap.crimea.ua/rc/screenrc -O ~/.screenrc
# mkdir -p /opt/etc/php5 && mkdir -p /opt/etc/php4

Предварительно стягиваем последнее древо исходных кодов FreeBSD:

# cat > /root/standart.cvsup << EOF
*default host=cvsup13.us.FreeBSD.org
*default base=/var/db
*default prefix=/usr
*default release=cvs tag=RELENG_6_2
*default delete use-rel-suffix
*default compress
src-all
EOF
# cvsup -g -L 2 /root/standart.cvsup

Включаем поддержку SASL2 по доке Аутентификация SMTP: штатный sendmail + SASL. Для установки дедикита надо выполнить п.1, п.2, п.3, п.5, п.7, п.8.

Если нам необходимо использовать apache-2.2.6, то в файл /boot/loader.conf нам необходимо добавить строчку accf_http_load="YES".
Загружаем модуль:

# kldload accf_http

Включаем форвардинг пакетов:

# sysctl -w net.inet.ip.forwarding=1

Добавляем дефолтные опции для сервера в /etc/make.conf

# cat > /etc/make.conf << EOF
BATCH=yes
WITHOUT_X11=yes
WITHOUT_FONTCONFIG=yes
EOF

Стадия 3

Добавление установленных демонов в список загружаемых сервисов + настройка демонов
Прописываем в /etc/rc.conf флаги для автозапуска нужных нам сервисов.

gateway_enable="YES"
named_enable="YES"
mysql_enable="YES"
mysql_dbdir="/home/mysql"
mysql_args="--skip-locking --skip-name-resolve -O max_connect_errors=500000 -O max_connections=1000"
sendmail_enable="YES"
vsftpd_enable="YES"
mpd_enable="YES"
oops_enable="YES"

В файле /usr/local/etc/vsftpd.conf должны содержаться следующие записи:

anonymous_enable=NO
background=YES
listen=YES
local_enable=YES
write_enable=YES
local_umask=022
chroot_local_user=YES

Создаем дефолтные конфиги для mpd:

cd /usr/local/etc/mpd; cp mpd.conf.sample mpd.conf; cp mpd.links.sample mpd.links; cp mpd.script.sample mpd.script; cp mpd.secret.sample mpd.secret;

В файле /etc/namedb/named.conf ищем строку listen-on { 127.0.0.1; }; и комментируем ее.

Стадия 4

Установка APACHE из исходных кодов
Стягиваем в /opt/src необходимую версию apache отсюда: http://www.apache.org/dist/httpd/
Распаковываем, заходим в директорию с исходными кодами, создаем файл MyConfig.sh, в который записываем следующие строки:
Для apache-1.3.x

#!/bin/sh
OPTIM="-D_FILE_OFFSET_BITS=64 -DDEFAULT_LISTENBACKLOG=1024 -DHARD_SERVER_LIMIT=1024"  ./configure --prefix=/opt/<apache-1.3.x>  --enable-module=so --enable-module=rewrite --enable-module=ssl

Для apache-2.x

#!/bin/sh
OPTIM="-D_FILE_OFFSET_BITS=64 -DDEFAULT_LISTENBACKLOG=1024 -DHARD_SERVER_LIMIT=1024"  ./configure --prefix=/opt/<apache-2.x> --enable-so --enable-cgi --enable-rewrite --with-mpm=worker --with-expat=builtin

Компилируем, устанавливаем и создаем симлинку:

# sh MyConfig.sh
# make
# make install
# ln -s /opt/apache-x.x.x /usr/local/apache

Установка PHP из исходных кодов
Стягиваем в /opt/src необходимую версию php отсюда: http://museum.php.net/
Распаковываем, заходим в директорию с исходными кодами, создаем файл MyConfig.sh, в который записываем следующие строки:
(Для версии apache-1.x ключ –with-apxs, для версии apache-2.x ключ –with-apxs2)
Для php-4.x

#!/bin/sh
CFLAGS="-DEAPI -O2" ./configure  --prefix=/opt/php-4.x \
  --with-apxs=/usr/local/apache/bin/apxs \
  --with-config-file-path=/opt/etc/php4 \
  --enable-calendar \
  --enable-sysvsem \
  --enable-sysvshm \                                                                                                                                                                 
  --enable-sysvmsg \
  --enable-ftp \
  --enable-track-vars \
  --with-zip \
  --with-mysql=/usr \
  --enable-bcmath \
  --with-bz2 \ 
  --with-gd \
  --with-jpeg-dir \
  --with-zlib-dir \
  --with-curl \
  --enable-sockets \
  --with-iconv \
  --enable-mbstring \
  --enable-mbregex \
  --enable-ctype \
  --enable-shmop \
  --enable-wddx \
  --with-imap \
  --with-kerberos \
  --with-freetype-dir \
  --with-dom \
  --with-dom-xslt \
  --with-dom-exslt \
  --with-xmlrpc \
  --enable-xslt \
  --with-xslt-sablot \
  --with-expat-dir=/usr \
  --enable-dbase \
  --with-mime-magic \
  --with-mhash \
  --with-openssl \
  --with-mcrypt \
  --with-imap-ssl \
  --enable-memory-limit

Для php-5.x

#!/bin/sh
CFLAGS="-O2" ./configure  --prefix=/opt/php-5.х \
  --with-apxs2=/usr/local/apache/bin/apxs\
  --enable-calendar \
  --enable-sysvsem \
  --enable-sysvshm \
  --enable-sysvmsg \
  --enable-ftp \
  --with-mcrypt \
  --with-mysql \
  --with-mysqli \
  --enable-bcmath \
  --with-bz2 \
  --with-gd \
  --with-jpeg-dir \
  --with-zlib-dir \
  --with-curl \
  --enable-sockets \
  --with-iconv \
  --enable-mbstring \
  --enable-mbregex \
  --enable-ctype \
  --enable-shmop \
  --enable-wddx \
  --with-imap \
  --with-freetype-dir \
  --with-xmlrpc \
  --enable-dbase \
  --with-mime-magic \
  --with-mhash \
  --with-gettext \
  --with-imap-ssl \
  --with-pear \
  --with-openssl \
  --with-config-file-path=/opt/etc/php5

Компилируем, устанавливаем и создаем симлинку:

# sh MyConfig.sh
# make
# make install
# ln -s /opt/php-x.x.x /usr/local/php

Если при make install ругается что

cp: libs/libphp5.so: No such file or directory

то делаем:

1. run your configure script as it is
2. Open the libtool file that is created in the php source directory
3. find the variable definition: deplibs_check_method=
4. edit it to read: deplibs_check_method="pass_all"
5. run make

В зависимости от версии php, делаем:

# cp /opt/src/php-x.x.x/php.ini-dist в /opt/etc/phpX

Стадия 5

Запуск сервисов

# /etc/rc.d/sendmail restart
# /etc/rc.d/named start
# /usr/local/etc/rc.d/mysq-server start
# /usr/local/etc/rc.d/oops start
# /usr/local/etc/rc.d/vsftpd start
# /usr/local/etc/rc.d/mpd start
# /usr/local/apache/bin/apachectl start
Приложение к Стадии 4

Установка Zend Optimizer
Тянем архив:

# make fetch -C /usr/ports/devel/ZendOptimizer/ && mv /usr/ports/distfiles/ZendOptimizer-* /opt/src

Распаковываем, заходим в директорию и запускаем install-tty.
Следуем инструкциям инсталлятора, в пути к рнр.ini указываем значение переменной –with-config-file-path из файла MyConfig.sh.

2008/02/12 15:45

Аутентификация SMTP: штатный sendmail + SASL

Часто возникает ситуация, когда для пользователей, разъезжающих по командировкам, нужно организовать почтовый релэй.

Проблема в том, что штатный для FreeBSD sendmail настраивается на прием почты только от доверенных IP-адресов (или IP-сетей), и заранее неизвестно, с какого IP-адреса пользователь будет отправлять почту.

Как одно из решений - выдать такому пользователю логин/пароль и настроить sendmail на прием почты, основываясь на этих данных, независимо от IP-адреса, с которого пришел пользователь. Собственно рецепт настройки sendmail'a я и привожу здесь.

Благодарность за рецепт уходит Victor Prylipko <Victor.Prylipko АТ f4.n4635.z2.fidonet.org> из фидо-конференции ru.unix.bsd

Дано:
FreeBSD 4.8 STABLE; sendmail - штатный.

Требуется:
настроить авторизацию клиента использующего Outlook Express при приеме почты от него, нужно для возможности принимать почту от клиента, если он отправляет почту с "чужих" IP-адресов.

1. Ставим из портов cyrus-sasl2 и cyrus-sasl2-saslauthd

# portinstall cyrus-sasl2
# portinstall cyrus-sasl2-saslauthd

2. Из /etc/defaults/make.conf копируем строки в /etc/make.conf

SENDMAIL_CFLAGS=-I/usr/local/include -DSASL=2
SENDMAIL_LDFLAGS=-L/usr/local/lib
SENDMAIL_LDADD=-lsasl2

3. Пересобираем sendmail

# cd /usr/src/lib/libsm
# make clean && make obj && make depend && make
# cd /usr/src/lib/libsmutil
# make clean && make obj && make depend && make
# cd /usr/src/usr.sbin/sendmail
# make clean && make obj && make depend && make && make install

4. Добавляем строку в /etc/rc.conf

sasl_saslauthd_flags="-a sasldb"

5. Запускаем демон SASL-а

# /usr/local/etc/rc.d/saslauthd.sh start

Этот пункт рецепта спонсирован Slava Vovk aka vovk АТ km.ua

6. Создаем Sendmail.conf

# echo pwcheck_method: saslauthd > /usr/local/lib/sasl2/Sendmail.conf

Там же можно указать, где лежит srvtab:

# echo srvtab: /etc/srvtab >> /usr/local/lib/sasl2/Sendmail.conf

7. Добавляем сроки в ваш .mc файл

TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 PLAIN LOGIN')dnl
define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5 PLAIN LOGIN')dnl

В принципе можно ограничится только одним методом LOGIN, если нужно только для Outlook Express (других клиентов я не пробовал).

TRUST_AUTH_MECH(`LOGIN')dnl
define(`confAUTH_MECHANISMS', `LOGIN')dnl

8. Генерим sendmail.cf и устанавливаем его

# cd /etc/mail
# make install restart

9. Заводим пользователя в базу SASL

# saslpasswd2 -a sendmail newuser

проверка, что пользователь добавлен:

# sasldblistusers2

выдаст список пользователей в базе.

10. Создаем пустой файл /etc/srvtab чтобы sendmail в логах не ругался, хотя можно этого и не делать. :-)

11. В настройках Outlook Express - Tools | Accounts… | нужный аккаунт | Properties | Servers | ставим "галочку" My server requires authentication и жмем кнопку Settings… вводим Account name и Password которые занесли в базу в 8-м пункте.

Все, почта от пользователя принимается невзирая на /etc/mail/access.db

2008/02/12 15:38

Управление скоростью закачки в mldonkey с помощью cron

Достаточно создать скрипт, который будет подключаться к mldonkey на management-порт и передавать ему команды через netcat.
Скорость выставляется в килобайтах. Строчка crontab выглядит следующим образом:

5 8,16,23 * * * /opt/scripts/mldonkey.sh >/dev/null 2>&1

Собственно, сам скрипт:

#!/bin/sh
NC="/bin/nc"
HOUR=`/bin/date +'%H'`
case "$HOUR" in
    08)
sh -c "$NC 127.0.0.1 4000 <<EOF
set max_hard_download_rate 200
set max_hard_upload_rate 350
q
EOF" > /dev/null
    ;;
    16)
sh -c "$NC 127.0.0.1 4000 <<EOF
set max_hard_download_rate 100
set max_hard_upload_rate 250
q
EOF" > /dev/null
    ;;
    23)
sh -c "$NC 127.0.0.1 4000 <<EOF
set max_hard_download_rate 400
set max_hard_upload_rate 500
q
EOF" > /dev/null
    ;;
    *)
    exit;
    ;;
esac
2007/12/09 03:39

Проксирование apache через nginx

  • Собираем апачевую приблуду (+ патч by Proforg, если надо ставить под apache2.x) чтобы передавать реальный IP с нгинкса на апач
# cd /opt/src/ && wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.5.tar.gz http://maloletka.ru/patches/rpaf-0.5.patch
# tar xvf mod_rpaf-0.5.tar.gz
# cd mod_rpaf-0.5 && cat ../rpaf-0.5.patch | patch -p0 mod_rpaf-2.0.c
# less README и ставим модуль
  • Шаблон конфига nginx:
user nobody nogroup;
worker_processes 4;
error_log /var/log/nginx/error_log info;
events {
  worker_connections  8192;
  use epoll;
}
http {
  include     /etc/nginx/mime.types;
  default_type    application/octet-stream;
  log_format main
      '$remote_addr - $remote_user [$time_local] '
          '"$request" $status $bytes_sent '
      '"$http_referer" "$http_user_agent" '
      '"$gzip_ratio"';
  client_header_timeout   10m;
  client_body_timeout 10m;
  send_timeout        10m;
  connection_pool_size        256;
  client_header_buffer_size   1k;
  large_client_header_buffers 4 2k;
  request_pool_size       4k;
  gzip off;
  gzip_min_length 1100;
  gzip_buffers    4 8k;
  gzip_types  text/plain;
  output_buffers  1 32k;
  postpone_output 1460;
  sendfile    on;
  tcp_nopush  on;
  tcp_nodelay on;
  keepalive_timeout   75 20;
  ignore_invalid_headers  on;
  index index.html;
  server {
      listen      80;
      server_name domain.com www.domain;
      root /home/clients/vasiliy_pupkinson/domains/domain.com/html;
      location / {
          proxy_pass         http://127.0.0.1:8080/;
          proxy_redirect     off;
          proxy_set_header   Host             $host;
          proxy_set_header   X-Real-IP        $remote_addr;
          proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
          proxy_max_temp_file_size  0;
          client_max_body_size       10m;
          client_body_buffer_size    128k;
          proxy_connect_timeout      90;
          proxy_send_timeout         90;
          proxy_read_timeout         90;
          proxy_buffer_size          4k;
          proxy_buffers              4 32k;
          proxy_busy_buffers_size    64k;
          proxy_temp_file_write_size 64k;
      }
      location ~* ^.+.(jpg|gif|png|avi|mpg|zip|exe)$ {
        root /home/clients/vasiliy_pupkinson/domains/domain.com/html;
        valid_referers none blocked server_names;
        if ($invalid_referer) {
          return   403;
        }
      }
   }
}
  • Шаблон конфига apache:
LoadModule rpaf_module        libexec/mod_rpaf.so
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 APACHE_IPS
Listen 127.0.0.1:8080
ServerName localhost
NameVirtualHost 127.0.0.1:8080
<VirtualHost 127.0.0.1:8080>
      ServerName domain.com
      ServerAlias domain.com
      ServerAlias www.domain.com
      DocumentRoot /home/clients/vasiliy_pupkin/domains/domain.com/html
      CustomLog  /home/clients/vasiliy_pupkin/domains/domain.com/logs/access_log combined
      ErrorLog  /home/clients/vasiliy_pupkin/domains/domain.com/logs/error_log
      ScriptAlias /cgi-bin/ " /home/clients/vasiliy_pupkin/domains/domain.com/html/cgi-bin/ "
      <Directory "/cgi-bin/">
              Options None +FollowSymLinks
      </Directory>
      <Directory />
              Options All -Indexes
              AllowOverride All
      </Directory>
</VirtualHost>

В итоге имеем: nginx на 80 порту ловит все входящие соединения и отдает юзеру все файлы, что попадают под регексп. Я туда еще добавил хотлинк-протект для пущего гламуру.
В регексп успешно можно пихать html, css и т.п.
Все, что не попадает под паттерн, передается apache, который слушает на 127.0.0.1:8080.
Без модуля mod_rpaf апач в логи будет писать src ip 127.0.0.1, так что ставим его обязательно.
Основной недостаток - это необходимость переписывать правила из .htaccess под nginx, что, в принципе, не очень сложно.
А простой redirect и так должен работать.

2007/12/05 05:53

Установка Debian посредством PXE загрузки

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

  • Маунтим рутовый раздел в /mnt
mount -t ext3 /dev/sda1 /mnt
  • Проставляемся debootstrap'ом:
debootstrap etch /mnt http://ftp.debian.org/debian/
  • маунтим proc и чрутимся:
mount -t proc proc /mnt/proc
chroot /mnt
  • заполняем /etc/apt/apt.conf, /etc/apt/sources.list, /etc/resolv.conf, /etc/fstab, /etc/hosts, /etc/hostname, /etc/bash.bashrc:
# cat > /etc/apt/apt.conf
APT::Default-Release "stable";
APT::Force-LoopBreak "true";
# cat > /etc/apt/sources.list
deb http://ftp.debian.org/debian etch main non-free contrib
deb http://security.debian.org/ etch/updates main contrib non-free
deb http://ftp.debian.org/debian etch-proposed-updates main non-free contrib
# cat > /etc/resolv.conf
nameserver YOUR_NAMESERVER1_IP
nameserver YOUR_NAMESERVER2_IP
# cat > /etc/fstab
/dev/sda1     /          ext3      defaults          0 1
/dev/sda2     none       swap      sw                0 0
/dev/sda3     /home      ext3      defaults,errors=remount-ro,noatime,nodiratime 0 0
proc          /proc      proc      defaults          0 0
# cat > /etc/hosts
127.0.0.1     localhost  serverlabel.YOUR_DOMAIN.COM
# cat > /etc/hostname
serverlabel.YOUR_DOMAIN.COM
# cat >> /etc/bash.bashrc
if [ -f /etc/bash_completion ]; then
  . /etc/bash_completion
fi
# cat > /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
  address СИСТЕМНЫЙ IP
  netmask 255.255.255.0
  network СЕТЬ
  broadcast СЕТЬ.255
  gateway ШЛЮЗ
  dns-nameservers YOUR_NAMESERVER1_IP YOUR_NAMESERVER2_IP
# cat > /etc/locale.gen
en_GB ISO-8859-1
en_US ISO-8859-1
ru_RU.KOI8-R KOI8-R
# ln -fs /usr/share/zoneinfo/Etc/UTC /etc/localtime
# cat > /etc/timezone
Etc/UTC
  • Выполняем следующие команды:
# /usr/bin/apt-get update
# /usr/bin/apt-get dist-upgrade
# /usr/bin/apt-get -y -q install ssh alien aria2 arping bash bash-completion bc bridge-utils build-essential busybox bzip2 bzr checkinstall chkconfig chkrootkit coreutils cpio cron curl cvs dash debian-archive-keyring debian-keyring diffutils dmidecode dnsutils dos2unix dosfstools dselect e2fsprogs ebtables ethtool ext3grep extundelete fakeroot findutils fping fuse gcc gdb geoip-bin geoip-database git gzip hdparm hostname htop iotop ipcalc iperf ipmitool iproute iptables iputils-ping less lftp libc6-dev libwww-perl links lm-sensors locales logrotate lrzip lsb-security lsof lvm2 lzma make mdadm mercurial monit mtr mysqltuner mytop nano netcat nmap ntfs-3g ntp openipmi p7zip p7zip-full parallel parted patch pbzip2 pciutils perl pigz procps psmisc pwgen python rkhunter rsync rsyslog ruby screen sed snmp sqlite3 strace subversion sysstat tar tcpdump tcsh telnet tmux unhide unzip usbutils uw-mailutils vim wget whois xinetd xz-utils zip
# /usr/sbin/ntpdate pool.ntp.org
# echo "0 0 * * * /usr/sbin/ntpdate pool.ntp.org >/dev/null 2>&1" | /usr/bin/crontab -
# cd /dev && MAKEDEV generic
# source /etc/bash.bashrc
  • Копируем файлы grub:

# cp -a /usr/lib/grub/i386-pc /boot/grub

  • Собираем и устанавливаем ядро, предварительно скачав и распаковав его в /usr/src:

# cd /usr/src/linux

# make-kpkg --bzImage kernel_image
# dpkg -i /usr/src/linux-image-x.x.x-blablabla.deb
  • Генерируем menu.lst и устанавливаем grub в mbr:
# update-grub
# grub --no-floppy
> root (hd0,0)
> setup (hd0)
> quit
2007/12/05 05:37

Совмещение Nginx и PHP (fast cgi)

  • Ставим nginx стандартными средствами OS
  • Качаем последнюю версию PHP с http://php.net, складываем в /opt/src
  • Тянем патчик с http://php-fpm.anight.org/download.html
  • Распаковываем и патчим исходники рнр.
  • В директории с пропатченными исходниками создаем файлик MyConfig.cgi.sh со следующим содержимым:
#!/bin/sh
CFLAGS="-O2" ./configure  --prefix=/opt/php-x.x.x-fcgi \
  --enable-calendar \
  --enable-sysvsem \
  --enable-sysvshm \
  --enable-sysvmsg \
  --enable-ftp \
  --with-mcrypt \
  --with-mysql \
  --with-mysqli \
  --enable-bcmath \
  --with-bz2 \
  --with-gd \
  --with-jpeg-dir \
  --with-zlib-dir \
  --with-curl \
  --enable-sockets \
  --with-iconv \
  --enable-mbstring \
  --enable-mbregex \
  --enable-ctype \
  --enable-shmop \
  --enable-wddx \
  --with-imap \
  --with-freetype-dir \
  --with-xmlrpc \
  --enable-dbase \
  --with-mime-magic \
  --with-mhash \
  --with-gettext \
  --with-imap-ssl \
  --with-pear \
  --with-kerberos \
  --with-openssl \
  --with-snmp \
  --with-config-file-path=/opt/etc/phpX \
  --enable-fastcgi \
  --enable-force-cgi-redirect \
  --enable-fpm
  • Собираем командами
# sh MyConfig.cgi.sh
# make
# make install
  • Создаем в /opt/scripts скрипт fcgi.sh со следующим содержимым:
#!/bin/bash
# ABSOLUTE path to the PHP binary
PHPFCGI="/opt/php-x.x.x-fcgi/bin/php-cgi"
# tcp-port to bind on
FCGIPORT="8888"
# IP to bind on
FCGIADDR="127.0.0.1"
# number of PHP children to spawn
PHP_FCGI_CHILDREN=5
# number of request before php-process will be restarted
PHP_FCGI_MAX_REQUESTS=1000
# allowed environment variables sperated by spaces
ALLOWED_ENV="PATH USER"
# if this script is run as root switch to the following user
USERID=www-data
################## no config below this line
if test x$PHP_FCGI_CHILDREN = x; then
  PHP_FCGI_CHILDREN=5
fi
ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_CHILDREN"
ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_MAX_REQUESTS"
ALLOWED_ENV="$ALLOWED_ENV FCGI_WEB_SERVER_ADDRS"
if test x$UID = x0; then
  EX="/bin/su -m -c \"$PHPFCGI -q -b $FCGIADDR:$FCGIPORT\" $USERID"
else
  EX="$PHPFCGI -b $FCGIADDR:$FCGIPORT"
fi
echo $EX
# copy the allowed environment variables
E=
for i in $ALLOWED_ENV; do
  E="$E $i=${!i}"
done
# clean environment and set up a new one
nohup env - $E sh -c "$EX" &> /dev/null &
  • За что отвечают параметры, думается мне, можно понять и по комментариям, так что добавляем скрипт в автозагрузку методом OS, для которой проводится установка.
  • Шаблон виртуального хоста в nginx будет выглядеть таким образом:
server {
    listen       1.2.3.4:80;
    server_name  domain.com www.domain.com;
    access_log  /dev/null;
    # max POST size in bytes
    client_max_body_size 1000000000;
    location / {
        root   /home/clients/ftp_login/domains/domain.com/html;
        index  index.html index.htm index.php;
    }
    location ~ \.php$ {
       # Commented block - for accelerated POST - nginx should be 0.5.9+
       # fastcgi_pass_request_body off;
       # client_body_in_file_only clean;
       # fastcgi_param  REQUEST_BODY_FILE  $request_body_file;
       fastcgi_pass   127.0.0.1:8888;
       fastcgi_index  index.php;
       fastcgi_param  SCRIPT_FILENAME  /home/clients/ftp_login/domains/domain.com/html$fastcgi_script_name;
       fastcgi_param  QUERY_STRING     $query_string;
       fastcgi_param  REQUEST_METHOD   $request_method;
       fastcgi_param  CONTENT_TYPE     $content_type;
       fastcgi_param  CONTENT_LENGTH   $content_length;
       fastcgi_param  REDIRECT_STATUS  200;
    }
    # hotlink protection
    location ~* ^.+\.(gif|jpg|mpg|mp3|mpeg|avi)$ {
       valid_referers none blocked domain.com www.domain.com;
       if ($invalid_referer) {
          return   403;
       }
    }
}
  • Запускаем скрипт и nginx.
2007/11/28 09:47

Борьба с DDOS посредством использования утилиты ipset на выделенных серверах с Debian

  • Тянем последний patch-o-matic-ng в /usr/src, распаковываем, заходим в директорию и стартуем ./runme set.
    При этом подразумевается что исходники текущего ядра находятся в /usr/src/linux, а iptables - в /usr/src/iptables.
    После заходим в /usr/src/linux и делаем make oldconfig, где указываем поддержку фич ipset модулями.

Собираем и устанавливаем ядро:

# make-kpkg --bzImage kernel_image
# dpkg -i /usr/src/linux-image-x.x.x-blablabla.deb
  • Устанавливаем ipset из репозитория:
# apt-get install ipset
  • Добавляем загрузку модуля ipset в /etc/modules и либо загружаем модуль modprobe ipset, либо перезагружаемся в новое ядро.
  • Создаем хеш ip-адресов для использования в правилах iptables. Стоит учесть, что максимальное количество ip в списке - 65536 штук:
# ipset -N blacklist iphash
  • Создаем перловый скрипт /root/antiddos/num-filter.pl для отбора ip-адресов, с которых идет большое количество одинаковых запросов:
#!/usr/bin/perl
while ($line = <STDIN>) {
  if ($line =~ /^\s+(\d+) (\d+)\.(\d+)\.(\d+)\.(\d+)/) {
    print $2, ".", $3, ".", $4, ".", $5, "\n" if ($1 > $ARGV[0]);
  }
}
  • Создаем скрипт /root/antiddos/blacklist.sh для cron:
#!/bin/bash
# variables, change them to get script work
BADREQUEST="GET / HTTP/1.1";
LOGPATH="/home/clients/login_ftp0/domains/domain.com/logs/access_log";
MINREQUESTS="50";
SCRIPTHOME="/root/antiddos";
# don't change anything bellow
grep "${BADREQUEST}" $LOGPATH | awk -F ' ' '{ print $ 1 }' | sort | uniq -c | ${SCRIPTHOME}/num-filter.pl $MINREQUESTS >> ${SCRIPTHOME}/in_blacklist.add.pre
sort -u < ${SCRIPTHOME}/in_blacklist.add.pre > ${SCRIPTHOME}/in_blacklist.add
cat ${SCRIPTHOME}/in_blacklist.add > ${SCRIPTHOME}/in_blacklist
for i in `cat ${SCRIPTHOME}/in_blacklist`;
do
  /usr/sbin/ipset -q -A blacklist $i;
done
  • Добавляем правила для iptables:
  /sbin/iptables -F
  /sbin/iptables -X DDOS_HTTP_FILTER
  /sbin/iptables -N DDOS_HTTP_FILTER
  /sbin/iptables -A DDOS_HTTP_FILTER -d $IP -p tcp --syn --dport 80 -m set --set blacklist src -j DROP
  /sbin/iptables -A DDOS_HTTP_FILTER -d $IP -p tcp --syn --dport 80 -m hashlimit --hashlimit 10/min --hashlimit-burst 30 --hashlimit-mode srcip --hashlimit-name DDOS --hashlimit-htable-size 32768 --hashlimit-htable-max 32768 --hashlimit-htable-gcinterval 1000 --hashlimit-htable-expire 100000 -j ACCEPT
  /sbin/iptables -A DDOS_HTTP_FILTER -d $IP -p tcp --dport 80 --syn -j DROP
  /sbin/iptables -A DDOS_HTTP_FILTER -d $IP -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 -j DROP
  /sbin/iptables -A DDOS_HTTP_FILTER -j ACCEPT
  /sbin/iptables -A INPUT -p tcp --dport http -j DDOS_HTTP_FILTER
  • Добавляем запуск скрипта /root/antiddos/blacklist.sh в крон с интервалом в 10 минут.

Фильтрация с GeoIP

# apt-get install xtables-addons-source
#
ПРИМЕР ФАЕРВОЛА С ИСПОЛЬЗОВАНИЕМ GEOIP
#!/bin/bash

iptables=/usr/local/sbin/iptables
ipset=/usr/sbin/ipset
WHITE="195.88.52.82/32"

ddos_enable() {
    # whitelist
    $iptables -N WHITELIST
    for i in $WHITE;
    do
        $iptables -A WHITELIST -s $i -j ACCEPT;
    done
    $iptables -A WHITELIST -j DROP

    $iptables -N DDOS_HTTP_FILTER
    $iptables -A DDOS_HTTP_FILTER -m hashlimit --hashlimit 15/min --hashlimit-burst 30 --hashlimit-mode srcip --hashlimit-name HTTPDDOS --hashlimit-htable-size 32768 --hashlimit-htable-max 32768 --hashlimit-htable-gcinterval 1000 --hashlimit-htable-expire 100000 -j ACCEPT
    $iptables -A DDOS_HTTP_FILTER -m connlimit --connlimit-above 15 -j DROP
    $iptables -A DDOS_HTTP_FILTER -j ACCEPT

    $iptables -N SORT_FILTER
    $iptables -A SORT_FILTER -p tcp --dport 80 --syn -j DDOS_HTTP_FILTER
    $iptables -A SORT_FILTER -p tcp -m multiport --dports 25,53 -j ACCEPT
    $iptables -A SORT_FILTER -p udp --dport 53 -j ACCEPT
    $iptables -A SORT_FILTER -j WHITELIST

    $iptables -N GEOIP_FILTER
    $iptables -A GEOIP_FILTER -m geoip --src-cc AM,AZ,BY -j SORT_FILTER
    $iptables -A GEOIP_FILTER -m geoip --src-cc EE,GE,KZ -j SORT_FILTER
    $iptables -A GEOIP_FILTER -m geoip --src-cc LV,MD,NL,RU -j SORT_FILTER
    $iptables -A GEOIP_FILTER -m geoip --src-cc UA,UZ,US -j SORT_FILTER
    $iptables -A GEOIP_FILTER -j DROP

    $iptables -I INPUT 1 -i lo -j ACCEPT
    $iptables -I INPUT 2 -m set --set blacklist src -j DROP
    $iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

    $iptables -A INPUT -j GEOIP_FILTER
}

start_iptables() {
    # whitelist
    $iptables -N WHITELIST
    for i in $WHITE;
    do
        $iptables -A WHITELIST -s $i -j ACCEPT;
    done
    $iptables -A WHITELIST -j DROP

    # default rules
    $iptables -I INPUT 1 -i lo -j ACCEPT
    $iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    $iptables -A INPUT -p tcp -m multiport --dports 25,53,80 -j ACCEPT
    $iptables -A INPUT -p udp --dport 53 -j ACCEPT
    $iptables -A INPUT -j WHITELIST
}

clear_iptables() {
    $iptables -F
    $iptables -X
}

start_ipset() {
    $ipset -q -N blacklist iphash
}

clear_ipset() {
    $ipset -q -F blacklist
    $ipset -q -X blacklist
}

case "$1" in
    normal)
        clear_iptables
        start_iptables
        echo "normal mode activated"
    ;;

    stop)
        clear_iptables
        clear_ipset
        echo "iptabes cleared"
    ;;

    hard)
        clear_iptables
        start_ipset
        ddos_enable
        echo "hard mode activated"

    ;;
    *)
        echo "Usage $0 {normal|hard|stop}"
        exit 1
    ;;
esac

Скрипт для удаления адресов из блеклиста (FreeBSD)

/opt/scripts/unban_ip.sh
#!/usr/bin/env bash
 
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:~/bin
 
SCRIPTHOME="/root/antiddos"
 
function valid_ip()
{
    local  ip=$1
    local  stat=1
 
    [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]] && {
    OIFS=$IFS
    IFS='.'
    ip=($ip)
    IFS=$OIFS
    [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
        && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
    stat=$?
    return $stat
}
}
 
###############
 
[[ -d $SCRIPTHOME ]] || exit 1
 
if ! VALID_IP=$(valid_ip "$1")
then
    echo "Usage: $0 <IP ADDR>" >&2
    exit 1
fi
 
sed_cmd="/$1/d;/^[[:space:]]*$/d;s/[[:space:]]*$//"
 
if LISTS=$(grep -lIrx "$1" "$SCRIPTHOME" | grep -v "\.sh")
then
    for i in $LISTS
    do
        echo "Removing $1 from $i"
        sed -i '' "$sed_cmd" ${i}
    done
    nginx -t && nginx -s reload
fi
start.txt · Last modified: 2016/09/22 01:27 by kyxap