Развертывание multi-протокольного и отказоустойчивого Proxy сервиса

Введение.

Предположим, необходимо развернуть отказоустойчивый proxy сервис со следующей функциональностью:

- доступ к web-ресурсам
- native доступ ftp-ресурсам с возможностью записи
- доступ к почте на Google Apps for Business или Yandex Mail для домена или к любому другому подобному сервису используя протоколы: IMAP,SMTP

Решение - Linux Centos + Cororsync + pacemaker + squid + delegate.

Организационная схема

Для инсталляции необходимы три сервера (физических или виртуальных). Два сервера будут узами proxy и один quorum. Следующий пример описывает ситуацию когда сервера подключены как к локальной сети так и к Интернет. Если используется DMZ тогда достаточно одного сетевого подключения.

500

Squid будет выполнять роль http,https, ftp over http - proxy (port 8080)
Delegate будет выполнять роль IMAP,SMTP and native FTP proxy. Delegate может в том числе работать и как http proxy, но имеет меньшую производительность по сравнению со squid.

Развертывание

1. Инстоляция OS Centos 6.3 и конфигурация интерфейсов.
2. Добавление необходимых репозиториев на каждый сервер
2.1. EPEL

wget http://mirror.yandex.ru/epel/6/x86_64/epel-release-6-8.noarch.rpm  (необходимо проверить актуальную версию)
rpm -i epel-release-6-8.noarch.rpm

2.2 squid-repo

Версия Squid 3.1 поставляется вместе с Centos 6.3. Если необходимо http/1.1 answers тогда устанавливаем версию squid 3.2 На официальном сайте есть линк с репозиторием

cat /etc/yum.repos.d/squid.repo
[squid]
name=Extra Packages squid proxy for Centos 6
baseurl=http://repo.ngtech.co.il/rpm/centos/6/x86_64/
enabled=1
gpgcheck=0

3. Update ОС и установка пакетов на каждый сервер.

yum update
reboot (if needed)
yum install htop systat blktrace scp ntp bind bind-utils pacemaker corosync make gcc \
gcc-c++ openssl-devel openssh-clients squid

4. Конфигурация локального NTPD на каждом сервере.

/etc/ntp.conf
driftfile /var/lib/ntp/drift
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict -6 ::1
server your_1.ntp.server

Запуск сервиса и установка старта при загрузке

chkconfig ntpd on
service ntpd start

5. Конфигурация локального кэширующего DNS сервера на каждом узле proxy

cat /etc/named.conf
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
options {
      listen-on port 53 { 127.0.0.1; };
      listen-on-v6 port 53 { ::1; };
      directory       "/var/named";
      dump-file       "/var/named/data/cache_dump.db";
      statistics-file "/var/named/data/named_stats.txt";
      memstatistics-file "/var/named/data/named_mem_stats.txt";
      recursion yes;
      /* Path to ISC DLV key */
      bindkeys-file "/etc/named.iscdlv.key";
      managed-keys-directory "/var/named/dynamic";
      max-ncache-ttl  3600;
      max-cache-ttl 28800;
      allow-query { any; };
      allow-recursion { any; };
      forwarders { **your_dns_server1**; **your_dns_server2**; };
};
logging {
      channel default_debug {
              file "data/named.run";
              severity dynamic;
      };
};
zone "." IN {
      type hint;
      file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

Перенаправление запросов на локальный DNS сервер

cat /etc/resolv.conf
nameserver 127.0.0.1

6. Инсталяция Delegate на proxy-node1 an proxy-node2

6.1 Скачивание и разархивация последней стабильно версии http://www.delegate.org/delegate/download/

6.2 Компиляция make

6.3 Копирование бинарника delegated из /usr/src/delegatex.x.x/src/delegate в /usr/sbin directory для каждого из трех протоколов

 
cp delegated /usr/sbin/delegated-imap
cp delegated /usr/sbin/delegated-smtp
cp delegated /usr/sbin/delegated-ftp

6.4 Создание скриптов

FTP

cat /etc/init.d/delegate-ftp
#!/bin/sh
# Startup script for anacron
#
# chkconfig: 34 60 40
# description: Run Delegate daemons
. /etc/init.d/functions
prog="delegated-ftp"
startoptions="-r -P0.0.0.0:21 SERVER=ftp ADMIN=adm@your_domain.dom \
CACHE=no REMITTABLE=ftp,ftps PERMIT=*:*:192.168.* MAXIMA=delegated:100,standby:80 \
TIMEOUT=shutout:300,restart:1d,acc:100,con:100,dns:4,dnsinv:1 \
RESOLV=sys,file  SRCIF=217.9.80.9:*:*  LOGFILE=ftp[date+.%d]"
stopoptions="-P0.0.0.0:21 -Fkill"
lockfile=/var/lock/subsys/$prog
start() {
  echo -n $"Starting $prog: "
  #
  daemon $prog $startoptions
  RETVAL=$?
  echo
  [ $RETVAL -eq 0 ] && touch $lockfile
  return $RETVAL
}
stop() {
  echo -n $"Stopping $prog: "
  #
  daemon $prog $stopoptions
  RETVAL=$?
  echo
  [ $RETVAL -eq 0 ] && rm -f $lockfile
  return $RETVAL
}
case "$1" in
      start)
          start
          ;;
      stop)
          stop
          ;;
      status)
          status $prog
          ;;
      restart)
          stop
          start
          ;;
      *)
          echo $"Usage: $0 {start|stop|restart|status}"
          exit 1
esac
exit 0
chmod 755 /etc/init.d/delegate-ftp

IMAP

Для YANDEX

cat /usr/sbin/delegate-imapo
#!/bin/sh
/usr/sbin/delegated-imap -r -P0.0.0.0:143 SERVER=imap ADMIN=adm@your_domain.dom  SRCIF=217.9.80.9:*:* CACHE=no \
REMITTABLE=imap,imaps PERMIT=*:*:192.168.* STLS=fsv MOUNT="//*%S/%S imaps://imap.yandex.ru/*%(1)@%(0)" LOGFILE="imap[date+.%d]"

Для GOOGLE

cat /usr/sbin/delegate-imapo
#!/bin/sh
/usr/sbin/delegated-imap -r -P0.0.0.0:143 SERVER=imap ADMIN=adm@your_domain.dom  SRCIF=217.9.80.9:*:* CACHE=no \
REMITTABLE=imap,imaps PERMIT=*:*:192.168.* STLS=fsv MOUNT="//*%S/%S imaps://imap.gmail.com/*%(1)@%(0)" LOGFILE="imap[date+.%d]"
chmod 755 /usr/sbin/delegated-imapo

Тюнинг

Если вы столкнетесь с проблемами производительности просто поправте MAXIMA параметры. 
Пример MAXIMA=listen:50,delegated:300
cat /etc/init.d/delegate-imap
#!/bin/sh
# Startup script for anacron
#
# chkconfig: 34 60 40
# description: Run Delegate daemons
. /etc/init.d/functions
prog="delegated-imap"
progo="delegated-imapo"
stopoptions="-P0.0.0.0:143 -Fkill"
lockfile=/var/lock/subsys/$prog
start() {
  echo -n $"Starting $prog: "
  #
  daemon $progo
  RETVAL=$?
  echo
  [ $RETVAL -eq 0 ] && touch $lockfile
  return $RETVAL
}
stop() {
  echo -n $"Stopping $prog: "
  #
  daemon $prog $stopoptions
  RETVAL=$?
  echo
  [ $RETVAL -eq 0 ] && rm -f $lockfile
  return $RETVAL
}
case "$1" in
      start)
          start
          ;;
      stop)
          stop
          ;;
      status)
          status $prog
          ;;
      restart)
          stop
          start
          ;;
      *)
          echo $"Usage: $0 {start|stop|restart|status}"
          exit 1
esac
exit 0
chmod 755 /etc/init.d/delegate-imap

SMTP

Для YANDEX

cat /usr/sbin/delegate-smtpo
#!/bin/sh
/usr/sbin/delegated-smtp -r -P0.0.0.0:25 SERVER=smtps://smtp.yandex.ru/  CACHE=no REMITTABLE=* CACHE=no PERMIT=*:*:192.168.* \
LOGFILE="smtp[date+.%d]" STLS=fsv SRCIF=217.9.80.9:*:*

Для GOOGLE

cat /usr/sbin/delegate-smtpo
#!/bin/sh
/usr/sbin/delegated-smtp -r -P0.0.0.0:25 SERVER=smtps://smtp.gmail.com/  CACHE=no REMITTABLE=* CACHE=no PERMIT=*:*:192.168.* \
LOGFILE="smtp[date+.%d]" STLS=fsv SRCIF=217.9.80.9:*:*
chmod 755 /usr/sbin/delegated-smtpo

Тюнинг

Если вы столкнетесь с проблемами производительности просто поправте MAXIMA параметры. 
Пример MAXIMA=listen:50,delegated:300
cat /etc/init.d/delegate-smtp
#!/bin/sh
# Startup script for anacron
#
# chkconfig: 34 60 40
# description: Run Delegate daemons
. /etc/init.d/functions
prog="delegated-smtp"
progo="delegated-smtpo"
stopoptions="-P0.0.0.0:25 -Fkill"
lockfile=/var/lock/subsys/$prog
start() {
  echo -n $"Starting $prog: "
  #
  daemon $progo
  RETVAL=$?
  echo
  [ $RETVAL -eq 0 ] && touch $lockfile
  return $RETVAL
}
stop() {
  echo -n $"Stopping $prog: "
  #
  daemon $prog $stopoptions
  RETVAL=$?
  echo
  [ $RETVAL -eq 0 ] && rm -f $lockfile
  return $RETVAL
}
case "$1" in
      start)
          start
          ;;
      stop)
          stop
          ;;
      status)
          status $prog
          ;;
      restart)
          stop
          start
          ;;
      *)
          echo $"Usage: $0 {start|stop|restart|status}"
          exit 1
esac
exit 0

chmod 755 /etc/init.d/delegate-smtp

6.5. Запуск delegated на proxy серверах.

Delegated очень стабильное приложение. (Работаю с ним более 7 лет. Ни разу не падал)

chkconfig delegate-ftp on
chkconfig delegate-smtp on 
chkconfig delegate-imap on
service delegate-ftp start
service delegate-smtp start
service delegate-imap start

Для ротации логов раз в неделю презапускайте по крону (не чаще раза в сутки или меняйте LOGFILE=“protocol[date+.%d]”)

7. Конфигурирование squid на каждом сервере

Детальная конфигурация не является целью данной статьи. Для детальной конфигурации обратитесь к следующему линку.

Для данного примера:

cat /etc/squid/squid.conf
acl localhost src 127.0.0.1/32 ::1
#acl localnet src 10.0.0.0/8     # RFC1918 possible internal network
#acl localnet src 172.16.0.0/12  # RFC1918 possible internal network
acl localnet src 192.168.0.0/24  # RFC1918 possible internal network
#acl localnet src fc00::/7       # RFC 4193 local private network range
#acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines
acl CONNECT method CONNECT
shutdown_lifetime 3 second
http_access allow manager localhost
http_access deny manager
http_access allow localnet
http_access allow localhost
# And finally deny all other access to this proxy
http_access deny all
http_port 8080
tcp_outgoing_address 217.9.80.9
hierarchy_stoplist cgi-bin ?
cache_mem 2048 MB
maximum_object_size_in_memory 2048 KB
# Leave coredumps in the first cache dir
coredump_dir /var/spool/squid
# Add any of your own refresh_pattern entries above these.
refresh_pattern .               0       20%     240

Выключение запуска при загрузке системы

chkconfig squid off

8. Конфигурирование Corosync на каждом сервере

cat /etc/corosync/corosync.conf
compatibility: whitetank
totem {
      version: 2
      secauth: on
      threads: 0
      interface {
              ringnumber: 0
              bindnetaddr: 192.168.0.N # where N is IP address of front end network
              mcastaddr: 226.94.1.1
              mcastport: 5405
              ttl: 1
      }
}
logging {
      fileline: off
      to_stderr: no
      to_logfile: yes
      to_syslog: yes
      logfile: /var/log/cluster/corosync.log
      debug: off
      timestamp: on
      logger_subsys {
              subsys: AMF
              debug: off
      }
}
amf {
      mode: disabled
}
cat /etc/corosync/service.d/pcmk
service {
      # Load the Pacemaker Cluster Resource Manager
      name: pacemaker
      ver:  1
}
END

Необходимо создать authkey на одном из серверов и скопировать на другие.

corosync-keygen

Перезагрузка сервисов

service corosync restart
service pacemaker restart

Проверка

crm status

Last updated: Fri Jan 11 09:31:55 2013
Last change: Tue Dec 11 14:33:11 2012 via crm_resource on proxy-node1 
Stack: openais
Current DC: proxy-node1 - partition with quorum
Version: 1.1.7-6.el6-148fccfd5985c5590cc601123c6c16e966b85d14
3 Nodes configured, 3 expected votes
============
Online: [ proxy-node1  proxy-node2 proxy-quorum  ]

9. Конфигурирование pacemaker

На любом из узлов

crm
crm(live)#
crm(live)#configure
crm(live)configure#crm configure property no-quorum-policy=stop 
crm(live)configure#crm configure property stonith-enabled=false
crm(live)configure#primitive LShareIP ocf:heartbeat:IPaddr2 params ip="192.168.0.9" cidr_netmask="23" op monitor interval="30s" on_fail="standby"
crm(live)configure#primitive GShareIP ocf:heartbeat:IPaddr2 params ip="217.9.80.9" cidr_netmask="24" op monitor interval="30s" on_fail="standby"
crm(live)configure#primitive squid lsb:squid op monitor interval="120s" on_fail="standby" \
op start interval="0" timeout="120s" \
op stop  interval="0" timeout="120s"
crm(live)configure#commit

На узле quorum

crm
crm(live)#node
crm(live)node#standby

Запуск при загрузке системы

chkconfig corosync on
chkconfig pacemaker on

10. Конфигурирование iptables

cat /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i eth0 -p icmp -j ACCEPT
-A INPUT -i eth0 -j DROP
COMMIT

eth0 - внешний интерфейс.

service iptables restart
chkconfig iptables on

PS

Огромное спасибо Yutaka Sato за создание приложения proxy (delegate).

Centos/Redhat 6.4

Сегодня обновил систему до centos 6.4. Команда Crm в новом pacemaker-cli исчезла.
Если хотите использовать команду crm с centos/redhat 6.4 необходимо установить crmsh: yum install crmsh
Я использую следующий репозиторий:

[network_ha-clustering]
name=High Availability/Clustering server technologies (RedHat_RHEL-6)
type=rpm-md
baseurl=http://download.opensuse.org/repositories/network:/ha-clustering/RedHat_RHEL-6/
gpgcheck=1
gpgkey=http://download.opensuse.org/repositories/network:/ha-clustering/RedHat_RHEL-6/repodata/repomd.xml.key
enabled=1

Или используйте pcs (yum install pcs)

Об авторе

Profile автора

ru/jobs/proxy_multi.txt · Last modified: 2015/03/12 17:12 by admin
Recent changes RSS feed Debian Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki