Показаны сообщения с ярлыком Apache. Показать все сообщения
Показаны сообщения с ярлыком Apache. Показать все сообщения

среда, 5 апреля 2017 г.

Установка Asterisk с FreePBX


Все команды выполнялись от прав пользователя root.



1. Устанавливаю необходимые пакеты:
apt-get install -y build-essential linux-headers-`uname -r` openssh-server apache2 mysql-server mysql-client bison flex php5 php5-curl php5-cli php5-mysql php-pear php-db php5-gd curl sox libncurses5-dev libssl-dev libmysqlclient-dev mpg123 libxml2-dev libnewt-dev sqlite3 libsqlite3-dev pkg-config automake libtool autoconf git subversion unixodbc-dev uuid uuid-dev libasound2-dev libogg-dev libvorbis-dev libcurl4-openssl-dev libical-dev libneon27-dev libsrtp0-dev libspandsp-dev libiksemel-dev libiksemel-utils libiksemel3 libmyodbc sudo

2. Скачиваю необходимые сырцы для установки Asterisk:
cd /usr/src
wget http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-current.tar.gz
wget http://downloads.asterisk.org/pub/telephony/libpri/libpri-current.tar.gz
wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-14-current.tar.gz

3. Распаковываю скачанное:
tar -zxvf libpri-current.tar.gz
tar -zxvf dahdi-linux-complete-current.tar.gz
tar -zxvf asterisk-14-current.tar.gz

4. Начинаю сборку и установку сырцов (собственно все как в инструкции самого Asteriska):
cd dahdi-linux-complete-2.11.1+2.11.1
make
make install
make config

cd ..
cd libpri-1.6.0
make
make install

5. До устанавливаю более новый протокол (по инструкции), наверно его можно не устанавливать, но вдруг захочется каких нибудь дополнительных настроек:
 cd ..
wget http://www.pjsip.org/release/2.4.5/pjproject-2.4.5.tar.bz2
tar -xjvf pjproject-2.4.5.tar.bz2
cd pjproject-2.4.5

5.1. Правлю готовый конфиг для его сборки:
nano pjlib/include/pj/config_site.h

Вставляю "простыню"
/*
 * Asterisk config_site.h
 */
#include


/*
 * Defining PJMEDIA_HAS_SRTP to 0 does NOT disable Asterisk's ability to use srtp.
 * It only disables the pjmedia srtp transport which Asterisk doesn't use.
 * The reason for the disable is that while Asterisk works fine with older libsrtp
 * versions, newer versions of pjproject won't compile with them.
 */
#define PJMEDIA_HAS_SRTP 0
#define PJ_HAS_IPV6 1
#define NDEBUG 1
#define PJ_MAX_HOSTNAME (256)
#define PJSIP_MAX_URL_SIZE (512)
#ifdef PJ_HAS_LINUX_EPOLL
#define PJ_IOQUEUE_MAX_HANDLES  (5000)
#else
#define PJ_IOQUEUE_MAX_HANDLES  (FD_SETSIZE)
#endif
#define PJ_IOQUEUE_HAS_SAFE_UNREG 1
#define PJ_IOQUEUE_MAX_EVENTS_IN_SINGLE_POLL (16)
#define PJ_SCANNER_USE_BITWISE  0
#define PJ_OS_HAS_CHECK_STACK   0
#define PJ_LOG_MAX_LEVEL        6
#define PJ_ENABLE_EXTRA_CHECK   1
#define PJSIP_MAX_TSX_COUNT     ((64*1024)-1)
#define PJSIP_MAX_DIALOG_COUNT  ((64*1024)-1)
#define PJSIP_UDP_SO_SNDBUF_SIZE    (512*1024)
#define PJSIP_UDP_SO_RCVBUF_SIZE    (512*1024)
#define PJ_DEBUG            0
#define PJSIP_SAFE_MODULE       0
#define PJ_HAS_STRICMP_ALNUM        0

/*
 * Do not ever enable PJ_HASH_USE_OWN_TOLOWER because the algorithm is
 * inconsistently used when calculating the hash value and doesn't
 * convert the same characters as pj_tolower()/tolower().  Thus you
 * can get different hash values if the string hashed has certain
 * characters in it.  (ASCII '@', '[', '\\', ']', '^', and '_')
 */
#undef PJ_HASH_USE_OWN_TOLOWER

/*
  It is imperative that PJSIP_UNESCAPE_IN_PLACE remain 0 or undefined.
  Enabling it will result in SEGFAULTS when URIs containing escape sequences are encountered.
*/
#undef PJSIP_UNESCAPE_IN_PLACE
#define PJSIP_MAX_PKT_LEN           6000
#undef PJ_TODO
#define PJ_TODO(x)
/* Defaults too low for WebRTC */
#define PJ_ICE_MAX_CAND 32
#define PJ_ICE_MAX_CHECKS (PJ_ICE_MAX_CAND * PJ_ICE_MAX_CAND)
/* Increase limits to allow more formats */
#define PJMEDIA_MAX_SDP_FMT   64
#define PJMEDIA_MAX_SDP_BANDW   4
#define PJMEDIA_MAX_SDP_ATTR   (PJMEDIA_MAX_SDP_FMT*2 + 4)
#define PJMEDIA_MAX_SDP_MEDIA   16


5.2. Начинаю сборку:
./configure --prefix=/usr --enable-shared --disable-sound --disable-resample --disable-video --disable-opencore-amr CFLAGS='-O2 -DNDEBUG'
make dep
make
make install
ldconfig

5.3. Проверяю:
ldconfig -p | grep pj

Должно получиться что-то типа:
        libpjsua2.so.2 (libc6,x86-64) => /usr/lib/libpjsua2.so.2
        libpjsua2.so (libc6,x86-64) => /usr/lib/libpjsua2.so
        libpjsua.so.2 (libc6,x86-64) => /usr/lib/libpjsua.so.2
        libpjsua.so (libc6,x86-64) => /usr/lib/libpjsua.so
        libpjsip.so.2 (libc6,x86-64) => /usr/lib/libpjsip.so.2
        libpjsip.so (libc6,x86-64) => /usr/lib/libpjsip.so
        libpjsip-ua.so.2 (libc6,x86-64) => /usr/lib/libpjsip-ua.so.2
        libpjsip-ua.so (libc6,x86-64) => /usr/lib/libpjsip-ua.so
        libpjsip-simple.so.2 (libc6,x86-64) => /usr/lib/libpjsip-simple.so.2
        libpjsip-simple.so (libc6,x86-64) => /usr/lib/libpjsip-simple.so

6. Устанавливаю:
cd ..
git clone https://github.com/akheron/jansson.git
cd /usr/src/jansson
autoreconf -i
./configure
make
make install

cd ..
cd asterisk-14.3.0
./configure
contrib/scripts/get_mp3_source.sh

6.1. Вызываю конфигуратор:
make menuselect

И выбираю следующее:
    Add-ons: format_mp3, res_config_mysql, app_mysql и cdr_mysql.
    Core Sound Packages: русские звуки RU-WAV.
    Music On Hold File Packages: звук WAV.
    Extras Sound Packages:  английский EN-WAV, русского нет.

6.2. Собираю с учетом выбранного:
make
make install
make config

7. Скачиваю и распаковываю FreePBX:
cd..
wget http://mirror.freepbx.org/modules/packages/freepbx/freepbx-13.0-latest.tgz
tar xvfz freepbx-13.0-latest.tgz
cd freepbx

pear install Console_Getopt

7.1. Создаю управляющего пользователя и задаю права:
useradd -m asterisk
chown asterisk. /var/run/asterisk
chown -R asterisk. /etc/asterisk
chown -R asterisk. /var/{lib,log,spool}/asterisk
chown -R asterisk. /usr/lib/asterisk

7.2. Убираю лишнее и немного конфигурирую Apache:
rm -rf /var/www/html
sed -i 's/\(^upload_max_filesize = \).*/\120M/' /etc/php5/apache2/php.ini
cp /etc/apache2/apache2.conf /etc/apache2/apache2.conf_orig
sed -i 's/^\(User\|Group\).*/\1 asterisk/' /etc/apache2/apache2.conf
sed -i 's/AllowOverride None/AllowOverride All/' /etc/apache2/apache2.conf
service apache2 restart

7.3. Настраиваю ODBC:
cat >> /etc/odbcinst.ini << EOF
[MySQL]
Description = ODBC for MySQL
Driver = /usr/lib/x86_64-linux-gnu/odbc/libmyodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libodbcmyS.so
FileUsage = 1

EOF

cat >> /etc/odbc.ini << EOF
[MySQL-asteriskcdrdb]
Description=MySQL connection to 'asteriskcdrdb' database
driver=MySQL
server=localhost
database=asteriskcdrdb
Port=3306
Socket=/var/run/mysqld/mysqld.sock
option=3

EOF

7.4. Устанавливаю FreePBX (остановив предварительно Asterisk):
cd freepbx
/etc/init.d/asterisk stop

./start_asterisk start
   STARTING ASTERISK
   Asterisk Started

./install -n --dbpass passMySQL




7.5. Толком не разобрался, но какой-то косяк по-умолчанию, пришлось пожертвовать безопасностью, иначе попасть в веб-интерфейс не получалось:
rm -rf /var/www/html/.htaccessy
/etc/init.d/apache2 restart

8. Вводим в браузере IP сервера Asterisk и попадаем на FreePBX.

воскресенье, 2 июня 2013 г.

Iptables или мои настройки NAT+Firewall

Все команды выполнялись от прав пользователя root.
1. Создаю скрипт в файле -
'nano /etc/init.d/rc.firewall' следующего содержания:

#! /bin/sh
### BEGIN INIT INFO
# Provides:          rc.firewall+
# Required-Start:  
# Required-Stop:
# Default-Start:     2
# Default-Stop:         0 6   
# Short-Description: Run /etc/init.d/rc.firewall if it exist
### END INIT INFO
######################################################################################
# Configured by Dethroner, 2009
######################################################################################
# Внешний интерфейс
 EXTIF=eth0
# Внутренний интерфейс
 INTIF=eth1
# Loop-устройство/localhost
 LPDIF=lo
 LPDIP=127.0.0.1
 LPDMSK=255.0.0.0
 LPDNET="$LPDIP/$LPDMSK"
# Переменные текстовых инструментов
 IPT='/sbin/iptables'
 IFC='/sbin/ifconfig'
 G='/bin/grep'
 SED='/bin/sed'
 UNPRIPORTS="1024:65535"
# Перечень ip адресов закрытых для FORWARD
 FILENAME_DENY="/etc/deny_inet_hosts"

start_fw()
{
    echo ""  
    echo "IpTables configured by Dethroner"
    # Deny вместо accept: предотвращает открытие "дыр"
    # в то время, как мы закрываем порты и все такое
     $IPT     -P INPUT       DROP
     $IPT     -P OUTPUT      DROP
     $IPT   -P FORWARD     DROP
    # Сброс всех существующих цепочек и стирание персональных цепочек
     CHAINS=`cat /proc/net/ip_tables_names 2>/dev/null`
     for i in $CHAINS
     do
      $IPT -t $i -F
      $IPT -t $i -X
     done
     echo 1 > /proc/sys/net/ipv4/tcp_syncookies
     echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
    # Проверка адреса источника
     for f in /proc/sys/net/ipv4/conf/*/rp_filter;
     do
      echo 1 > $f
     done
    # Запрет маршрутизации IP от источника и редиректов ICMP
     for f in /proc/sys/net/ipv4/conf/*/accept_source_route;
     do
      echo 0 > $f
     done
     for f in /proc/sys/net/ipv4/conf/*/accept_redirects;
     do
      echo 0 > $f
     done
    # Включить перенаправление пакетов через ядро.
    echo 1 > /proc/sys/net/ipv4/ip_forward

    # Установка переменных среды для внешнего интерфейса
     EXTIP="192.168.1.2"
     EXTBC="192.168.1.255"
     EXTMSK="255.255.255.0"
     EXTNET="$EXTIP/$EXTMSK"
      echo ""
     echo "EXTIP=$EXTIP EXTBC=$EXTBC EXTMSK=$EXTMSK EXTNET=$EXTNET"
  
    # Установка переменных среды для внутреннего интерфейса
     INTIP="192.168.0.1"
     INTBC="192.168.0.255"
     INTMSK="255.255.255.0"
     INTNET="192.168.0.0/24"
     echo ""
     echo "INTIP=$INTIP INTBC=$INTBC INTMSK=$INTMSK INTNET=$INTNET"
  
    # Сейчас мы собираемся создать несколько собственных цепочек, результатом работы
    # которых будет логгинг отброшенных пакетов. Это поможет нам избежать необходимости
    # вводить команду log перед каждым отбрасыванием пакета, что мы хотим запротоколировать.
    # Первыми идут лог отброшенных пакетов и собственно отброс, затем лог пакетов с отказами
    # и собственно отказы.
    # Отключаем сообщения о том, что цепочки уже существуют (чтобы перезапуск был без мусора)
     $IPT -N DROP   2> /dev/null
     #$IPT -A DROP   -j LOG --log-level DEBUG --log-prefix "DROP:"
     #$IPT -A DROP   -j DROP
     $IPT -N REJECT 2> /dev/null
     #$IPT -A REJECT -j LOG --log-level DEBUG --log-prefix "REJECT:"
     #$IPT -A REJECT -j REJECT
     #$IPT -A INPUT -j LOG --log-level DEBUG --log-prefix "INPUT:"
     #$IPT -A OUTPUT -j LOG --log-level DEBUG --log-prefix "OUTPUT:"
     #$IPT -A FORWARD -j LOG --log-level DEBUG --log-prefix "FORWARD:"
     #$IPT -A DROP -j LOG --log-level DEBUG --log-prefix "DROP:"
    
  
    # Весь траффик от устройства loopback принимается
    # если IP совпадает с любым из наших интерфейсов.
     $IPT -A INPUT    -i $LPDIF -s   $LPDIP  -j ACCEPT
     $IPT -A INPUT    -i $LPDIF -s   $EXTIP  -j ACCEPT
     $IPT -A INPUT    -i $LPDIF -s   $INTIP  -j ACCEPT
  
    # Широковещательные пакеты
     $IPT -A INPUT   -i $EXTIF -d   $EXTBC  -j ACCEPT
     $IPT -A INPUT   -i $INTIF -d   $INTBC  -j ACCEPT
     $IPT -A OUTPUT  -o $EXTIF -d   $EXTBC  -j ACCEPT
     $IPT -A OUTPUT  -o $INTIF -d   $INTBC  -j ACCEPT
     $IPT -A FORWARD -o $EXTIF -d   $EXTBC  -j ACCEPT
     $IPT -A FORWARD -o $INTIF -d   $INTBC  -j ACCEPT
  
    # Блокируем доступ к внутренней сети из WAN
    # Это также призвано не дать нечестивым крякерам использовать нашу сетку
    # в качестве отправной точки для атак на других людей
    # Перевод с языка iptables:
    # "если пришедшие на наружный интерфейс пакеты были отправлены не с выданного
    # nefarious адреса, выкинуть их как горячую картошку"
     $IPT -A INPUT  -i $EXTIF -d ! $EXTIP  -j DROP
  
    # А сейчас мы блокируем внутренние адреса, кроме двух, присвоенных нашим двум
    # внутренним интерфейсам.....только помните, что если вы воткнете свой лэптоп или
    # какой другой pc в напрямую в одну из этих сетевых карт, то нужно удостовериться,
    # что они имеют именно эти IP-адреса или добавить соответствующий адрес отдельно.
  
    # Первый интерфейс/первая внутренняя сеть
    # $IPT -A INPUT   -i $INTIF -s ! $INTNET -j DROP
    # $IPT -A OUTPUT  -o $INTIF -d ! $INTNET -j DROP
    # $IPT -A FORWARD -i $INTIF -s ! $INTNET -j DROP
    # $IPT -A FORWARD -o $INTIF -d ! $INTNET -j DROP
  
    # Дополнительная Egress-проверка
    # $IPT -A OUTPUT  -o $EXTIF -s ! $EXTNET -j DROP
  
    # Блокируем исходящиие пакеты ICMP (за исключением PING)
    # $IPT -A INPUT -p icmp --icmp-type ! 8 -j DROP
    # $IPT -A OUTPUT -p icmp --icmp-type ! 8 -j DROP
    # $IPT -A FORWARD -p icmp --icmp-type ! 8 -j DROP
     $IPT -A INPUT -p icmp -j ACCEPT
     $IPT -A OUTPUT -p icmp -j ACCEPT
     $IPT -A FORWARD -p icmp -j ACCEPT
      

         $IPT -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1300

    # печально известные порты:
    # 0 - tcpmux; у SGI есть уязвимость, через которую можно атаковать
    # 13 - daytime
    # 98 - Linuxconf
    # 111 - sunrpc (portmap)
    # SNMP: 161,2
    # Флотилия Squid: 3128, 8000, 8008, 8080 (пока закроем)
    # 1214 - Morpheus или KaZaA
    # 2049 - NFS
    # 3049 - очень заразный троян для Linux, часто путаемый с NFS
    # Часто атакуемые: 1999, 4329, 6346
    # Частые трояны 12345 65535
     COMBLOCK="0:1 13 98 111 161:162 1214 1999 2049 3049 4329 6346 8000 8008 12345 65535"
    # Порты TCP:
    # 98 - Linuxconf
    # 512-515 - rexec, rlogin, rsh, printer(lpd)
    #   [очень серьезеные уязвимости; продолжаются ежедневные атаки]
    # 1080 - прокси-серверы Socks
    # 6000 - X (ЗАМЕЧАНИЕ. X через SSH - безопасен, и работает на порту TCP 22)
    # Блокировка 6112 (CDE у Sun и HP)
     TCPBLOCK="$COMBLOCK 98 512:515 1080 6000:6009 6112"
    # Порты UDP:
    # 161:162 - SNMP
    # 520=RIP, 9000 - Sangoma
    # 517:518 - talk и ntalk (самые надоедливые)
     UDPBLOCK="$COMBLOCK 520 123 517:518 1427 9000"
    echo -n "FW: Blocking attacks to TCP port"
    for i in $TCPBLOCK;
    do
     echo -n "$i "
      $IPT -A INPUT   -p tcp --dport $i  -j DROP
      $IPT -A OUTPUT  -p tcp --dport $i  -j DROP
      $IPT -A FORWARD -p tcp --dport $i  -j DROP
    done
    echo ""
    echo -n "FW: Blocking attacks to UDP port "
    for i in $UDPBLOCK;
    do
     echo -n "$i "
      $IPT -A INPUT   -p udp --dport $i  -j DROP
      $IPT -A OUTPUT  -p udp --dport $i  -j DROP
      $IPT -A FORWARD -p udp --dport $i  -j DROP
    done
    echo ""
  
    # Открываем отлеживание соединений по ftp
     MODULES="ip_nat_ftp ip_conntrack_ftp"
     for i in $MODULES;
     do
      echo "Inserting module $i"
      modprobe $i
     done
      
    # Защищаем некоторые распространенные клиенты для чата.
    # Уберите из списка допустимых для пущей безопасности.
    # IRC='ircd'
     MSN=1863
     ICQ=5190
     SSH2=122
     TCP81=81
     #RDM=489
     NFS='sunrpc'
    # Нам нужно синхронизировать данные!!
     PORTAGE='rsync'
     OpenPGP_HTTP_Keyserver=11371
    # Все порты сервисов читаются из /etc/services
    # TCPSERV="domain ssh http https ftp ftp-data mail pop3 pop3s imap3 imaps imap2 time $PORTAGE $IRC $MSN $ICQ  $OpenPGP_HTTP_Keyserver" UDPSERV="domain time"
      TCPSERV="domain $SSH2 $TCP81 http https ftp ftp-data mail pop3 pop3s imap3 imaps imap2 time www webmin $PORTAGE $MSN $ICQ $OpenPGP_HTTP_Keyserver 4899" UDPSERV="domain time netbios-ns netbios-dgm netbios-ssn microsoft-ds"
    echo -n "FW: Allowing inside systems to use service:"
    for i in $TCPSERV;
    do
     echo -n "$i "
        $IPT -A INPUT  -i $INTIF -p tcp --dport $i --syn -m state --state NEW -j ACCEPT
      $IPT -A INPUT  -i $EXTIF -p tcp --dport $i --syn -m state --state NEW -j ACCEPT
      $IPT -A OUTPUT -o $INTIF -p tcp --dport $i --syn -m state --state NEW -j ACCEPT
      $IPT -A OUTPUT -o $EXTIF -p tcp --dport $i --syn -m state --state NEW -j ACCEPT
      $IPT -A FORWARD -i $INTIF -p tcp -s $INTNET --dport $i --syn -m state --state NEW -j ACCEPT
    done
    echo ""
    echo -n "FW: Allowing inside systems to use service:"
    for i in $UDPSERV;
    do
     echo -n "$i "
        $IPT -A INPUT  -i $INTIF -p udp --dport $i -m state --state NEW -j ACCEPT
      $IPT -A OUTPUT -o $INTIF -p udp --dport $i -m state --state NEW -j ACCEPT
      #$IPT -A OUTPUT -o $EXTIF -p udp --dport $i -m state --state NEW -j ACCEPT
      $IPT -A FORWARD -i $INTIF -p udp -s $INTNET --dport $i -m state --state NEW -j ACCEPT
    done

    # Запрещаем форвардинг для юзеров с отключенным инетом
    echo "Blocked IP forwarding"
  
    # первой внутренней сети
    for ip in $(cat $FILENAME_DENY); do
    $IPT -I FORWARD -s $ip -j DROP
    done

    # DNS rndc сервер на Lo разрешаем. (обход connection refused)
        $IPT -A OUTPUT -p tcp -m tcp -o $LPDIF --dport 953 --sport $UNPRIPORTS -j ACCEPT
  
    # разрешаем доступ DNS-серверу наружу
    $IPT -A OUTPUT -o $EXTIF -p tcp --dport domain -j ACCEPT
    $IPT -A OUTPUT -o $EXTIF -p udp --dport domain -j ACCEPT
      
    # NAT
    $IPT -t nat -A PREROUTING -j ACCEPT
    $IPT -t nat -A POSTROUTING -o $EXTIF -s $INTNET -j MASQUERADE
    $IPT -t nat -A POSTROUTING -j ACCEPT
    $IPT -t nat -A OUTPUT -j ACCEPT
    $IPT -A INPUT -p tcp --dport auth --syn -m state --state NEW -j ACCEPT
    $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    $IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    $IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
  
    # Заблокировать и запротоколировать все, что мы могли забыть.
    #$IPT -A INPUT -j DROP

    #Для тэстирования NetAMS раскомментировать
    #$IPT -P FORWARD DROP
    #$IPT -P FORWARD QUEUE
    #$IPT -A FORWARD -p all -j QUEUE
    $IPT -A INPUT -j DROP
    $IPT -A OUTPUT -j REJECT
    $IPT -A FORWARD -j DROP
  
    # Squid transparent
     $IPT -t nat -A PREROUTING -i $INTIF -s $INTNET -p tcp -d 0.0.0.0/0 --dport 80 -j REDIRECT --to-port 3128


}
flush_fw()
{
    $IPT -P INPUT ACCEPT
    $IPT -P FORWARD ACCEPT
    $IPT -P OUTPUT ACCEPT
    $IPT -t nat -P PREROUTING ACCEPT
    $IPT -t nat -P POSTROUTING ACCEPT
    $IPT -t nat -P OUTPUT ACCEPT
    $IPT -t mangle -P PREROUTING ACCEPT
    $IPT -t mangle -P OUTPUT ACCEPT
  
    $IPT -F
    $IPT -t nat -F
    $IPT -t mangle -F

    $IPT -X
    $IPT -t nat -X
    $IPT -t mangle -X
}

case "$1" in
start)    echo -n "Starting firewall: iptables"
    start_fw
    echo ""
        echo -n "Starting firewall Ok!"
    echo ""  
    ;;
stop)    echo -n "Stopping firewall: iptables"
    flush_fw
    echo ""
        echo -n "Stopping firewall Ok!"
    echo ""
        ;;
save)    echo -n "Saving firewall: iptables"
    iptables-save > /etc/rules-save
    echo ""  
    echo -n "Status save Ok!."
    echo ""
    ;;
restart) echo -n "Restarting firewall: iptables"
    flush_fw
    start_fw
    echo ""
    echo -n "Status restart Ok!"
    echo ""
        ;;
reload|force-reload) echo -n "Reloading configuration files for firewall: iptables"
        echo "."
        ;;
*)    echo "Usage: /etc/init.d/rc.firewall start|stop|restart|reload|force-reload|save"
        exit 1
        ;;
esac
exit 0


2.
Делаю скрипт исполняемым - 'chmod +x /etc/init.d/rc.firewall'
3. Добавляю в автозагрузку ссылку - 'ln -s /etc/init.d/rc.firewall /etc/rc2.d/S99rc.firewall'
4. Создаю файл в котором будет перечень адресов которым запрещен доступ в Internet (файл задействован в конфиге)  - 'nano /etc/deny_inet_host' следующего содержания:
192.168.0.250
192.168.0.251
192.168.0.252
192.168.0.253
192.168.0.254 


PS. В скрипте задействованы многие правила отдельно публикуемые в предыдущих статьях.

понедельник, 1 июня 2009 г.

Установка LAMP (Linux Apache+MySQL+PHP)

Все команды выполнялись от прав root'a.

Решил настроить LAMP под Debian'ом.

LAMP — акроним, обозначающий набор (комплекс) серверного программного обеспечения, широко используемый во Всемирной паутине. LAMP назван по первым буквам входящих в его состав компонентов:
* Linux — операционная система GNU/Linux;
* Apache – веб-сервер;
* MySQL — СУБД;
* PHP — язык программирования, используемый для создания веб-приложений.
Акроним LAMP может использоваться для обозначения:

1.Инфраструктуры веб-сервера
2.Парадигмы программирования
3.Пакета программ
Хотя изначально эти программные продукты не разрабатывались специально для работы друг с другом, такая связка стала весьма популярной, в первую очередь из-за своей низкой стоимости (все её составляющие являются открытыми и могут быть бесплатно загружены из Интернета). Набор LAMP входит в состав большинства дистрибутивов GNU/Linux и предоставляется многими хостинговыми компаниями. (Взято с http:/ /ru.wikipedia.org).

1. Устанавливаю apache и php - 'apt-get install apache2 php5 libapache2-mod-php5 php5-gd' если кто пожелает использовать php4, ставит командой - 'apt-get install apache2 php4 libapache2-mod-php4 php4-gd'.

Конфигурационные файлы Apache находятся по пути '/etc/apache2/apache2.conf', а папка веб-сайта по умолчанию - '/var/www'.

2. Проверяю корректность установленного php, для чего создаю файл test.php в папке /var/www - 'touch /var/www/test.php'. Затем радактирую созданный файл — 'nano /var/www/test.php' до следующего вида:

Просматриваю в браузере — 'http:\ \ip_setevoi_LAN\test.php' или http:\ \localhost\test.php', скрипт должен выдать подробную информацию о настройках php.

3. Настраиваю Apache,для чего редактирую файл — 'nano /etc/apache2/sites-enabled/000-default' В начале файла добавляю опции ServerAdmin и ServerName, а также нахожу опцию AllowOverride и измению её с значения None на All. Закомментировал RedirectMatch. Т.е. Получилось следующее:
NameVirtualHost *
ServerAdmin admin@server.ex
ServerName "www.server.ex"
DocumentRoot /var/www/
Options FollowSymLinks
AllowOverride None
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
# This directive allows us to have apache2's default start page
# in /apache2-default/, but still have / go to the right place
# RedirectMatch ^/$ /apache2-default/
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

Далее исправляю кодировку по-умолчанию с UTF-8 на Windows-1251 — 'nano /etc/apache2/conf.d':
AddDefaultCharset Windows-1251.

4. А вот теперь довожу конфигурацию Apache «напильником» до ума, «обрезая» настройки по самое не хочу — 'nano /etc/apache2/apache2.conf':
KeepAlive on
KeepAliveTimeout 5
StartServers 2
MinSpareServers 2
MaxSpareServers 5
MaxClients 20
MaxRequestsPerChild 10000

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

MaxClients

Директива MaxClients устанавливает максимальное количество параллельных запросов, которые будет поддерживать сервер. Apache не будет порождать больше процессов/потоков чем MaxClients. Значение MaxClient не долно быть слишком маленьким (иначе много клиентов останутся необслуженными), но и не стоит устанавливать слишком большое количество - лучше не обслужить часть клиентов чем исчерпать все ресурсы, залезть в своп и умереть под нагрузкой. Хорошим может быть значение MaxClients = количество памяти выделенное под веб-сервер / максимальный размер порожденного процесса или потока. Для статических файлов apache использует около 2-3 Мб на процесс, для динамики (php, cgi) - зависит от скрипта, но обычно около 16-32 Мб.Если сервер уже обслуживает MaxClients запросов, новые запросы попадут в очередь, размер которой устанавливается с помощью директивы ListenBacklog.

MinSpareServers, MaxSpareServers, и StartServers

Т.к. создание потока, и особенно процесса - дорогая операция, apache создает их заранее. Директивы MaxSpareServers и MinSpareServers устанавливают как много процессов/потоков должны ожидать в готовности принять запрос (максимум и минимум). Если значение MinSpareServers слишком маленькое и неожиданно приходит много запросов, apache вынужден будет создавать много новых процессов/потоков, что создаст дополнительную нагрузку в этой стрессовой ситуации. С другой стороны, если MaxSpareServers слишком велико, apache будет сильно нагружать систему этими процессами, даже если количество клиентов минимально.
Постарайтесь установить такие MinSpareServers и MaxSpareServers, чтобы apache не создавал более 4 процессов/потоков в секунду. Если он создаст более 4, в ErrorLog будет помещено сообщение об этом. Это - сигнал того что MinSpareServers слишком мало.

MaxRequestsPerChild

Директива MaxRequestsPerChild устанавливает сколько запросов может обработать один дочерний процесс/поток прежде чем он будет завершен. По умолчанию значение этой директивы установлено в 0, что означает что однажды созданный процесс/поток не будет завершен никогда (ну кроме случаев остановки сервера или краха этого процесса/потока). Рекомендую установить MaxRequestsPerChild равное какому-нибудь достаточно большому числу (несколько тысяч). Это не создаст излишней нагрузки, связаной с тем что apache будет вынужден создавать новые дочерние процессы, в то же время это поможет избавиться от проблем с утечкой памяти в дочерних процессах (что очень возможно например если вы используете нестабильную версию php).

KeepAlive и KeepAliveTimeout

KeepAlive позволяет делать несколько запросов в одном TCP-подключении. Это особенно полезно для html-страниц с большим количеством изображений. Если KeepAlive установлен в Off, то для самой страницы и для каждого изображения будет создано отдельное подключение (которое нужно будет обработать master-процессу), что плохо и для сервера и для клиента. Так что для подобных случаев рекомендуется устанавливать KeepAlive в On. Для других применений (например для download-сервера) KeepAlive может быть бесполезен и даже вреден, т.к. при включенном KeepAlive сервер закрывает соединение не сразу, а ждет KeepAliveTimeout секунд нового запроса. Для того чтобы процессы не висели слишком долго в бесполезном ожидании, устанавливайте KeepAliveTimeout достаточно малым, около 5-10 секунд обычно достаточно.

5. Перезапускаю Apache - '/etc/init.d/apache2 force-reload'

6. Устанавливаю MySQL - 'apt-get install mysql-server mysql-client php5-mysql' или 'apt-get install mysql-server mysql-client php4-mysql' для php4.

7. По умолчанию mysql создает пользователя root без пароля. Установил пароль для пользователя root.
server:/# mysql
mysql> USE mysql;
mysql> UPDATE user SET Password=PASSWORD('пароль') WHERE user='root';
mysql> FLUSH PRIVILEGES;

8. Устанавливаю phpMyAdmin - 'apt-get install phpmyadmin', который ставится в папку - '/etc/phpmyadmin'.

phpMyAdmin — веб-приложение с открытым кодом, написанное на языке PHP и представляющее собой веб-интерфейс для администрирования СУБД MySQL. phpMyAdmin позволяет через браузер осуществлять администрирование сервера MySQL, запускать команды SQL и просматривать содержимое таблиц и баз данных. Приложение пользуется большой популярностью у веб-разработчиков, так как позволяет управлять СУБД MySQL без непосредственного ввода SQL команд, предоставляя дружественный интерфейс. (Взято с http:/ /ru.wikipedia.org).

У меня в дистрибутиве Lenny phpMyAdmin сам подключился модулем к Apache. Возможно в дистрибутиве Etch придется подключить его руками, для чего надо редактировать файл 'nano /etc/apache2/apache2.conf', дописав в конце конфига:
Include /etc/phpmyadmin/apache.conf

9. Перезапускаю Apache - '/etc/init.d/apache2 restart'.
Доступ к настроенному phpMyAdmin можно осуществить набрав в браузере 'http:/ /localhost/phpmyadmin' с сервера.

PS. У меня на работе отсутствует статический IP для входа на сервер с Interneta, а пользователи выходят в интернет через Squid, т.е. Если кто-то из пользователей захочет войти в LAMP набрав IP сервера, его запрос будет отправлен по 80 портому в Squid который в свою очередь вернет ответ что хост не найден. Пришлось поправить настройки Apache, заставив его обрабатывать запросы по порту 8080, и создать виртуальный хост.

Отрадактировал файл 'nano /etc/apache2/httpd.conf' прописав в нем:
Listen 8080
т.е. указал чтоы Apache слушал порт 8080.

Я создал файл с настройками виртуального хоста 'touch /etc/apache2/sites-enabled/@statistica.conf' следующего содержания — 'nano /etc/apache2/sites-enabled/@statistica.conf':

DocumentRoot /var/www/
ServerName server.ex
AllowOverride All
Order allow,deny
allow from all
192.168.0.1 — адрес сетвой карты смотрящей в локальнуюсеть, и присваиваю ему имя — server.ex.

Далее включаю обработку виртуального хоста в Apache – 'nano /etc/apache2/apache2.conf' добавив:
Include /etc/apache2/sites-enabled/

Теперь чтобы из локальной сети попасть на созданный хост нужно набрать в браузере 'http:/ /192.168.0.1:8080' или 'http:/ /server.ex:8080'.

PSPS. Все манипуляции описанные в PS. производились в дистрибутиве Lenny.