[Из песочницы] Мультипрокси на базе Debian и SQUID с прозрачной доменной аутентификацией

Поднимаем прокси сервер Squid, слушающий несколько портов. На каждый порт свой канал связи или внешний IP. Мануалов и статеек в интернетах полно, но общей сконсолидированной увы нет, решил поделиться.

Начнем.

Используется Debian 7.8, Samba 4, Squid 3, Kerberos 5.

Базовая настройка


1. Устанавливаем ОС, настраиваем сетевые интерфейсы:

nano /etc/network/interfaces && /etc/init.d/networking restart


2. Обновляем пакеты с помощью двух команд:

# apt-get update && apt-get upgrade


3. Поскольку вводим машину в домен, устанавливаем необходимые для этого пакеты:

# aptitude install krb5-user samba winbind libpam-krb5 libpam-winbind libnss-winbind


4. Меняем настройки DNS в файле /etc/resolv.conf:

domain EXAMPLE.RU
search EXAMPLE.RU
nameserver 192.168.1.6


5. Задаем имя машины в /etc/hostname:
Кроме того необходимо отредактировать файл /etc/hosts так, чтобы в нём была запись с полным доменным именем компьютера и обязательно коротким именем хоста, ссылающаяся на один из внутренних IP.

6. Сразу проверяем доступность контроллера домена:
# ping domaincontroller
# ping domaincontroller.EXAMPLE.RU

7. Далее необходимо настроить синхронизацию времени с контроллером домена. Если разница будет более 5 минут мы не сможем получить тикет от Kerberos. Для разовой синхронизации можно использовать команду:

# net time set domaincontroller


Так же, если в сети присутствует сервер точного времени, можно настроить синхронизацию с него:

# ntpdate 192.168.1.3

Настройка авторизации через Kerberos


1. В первую очередь правим файл /etc/krb5.conf. Нашем случае он выглядит так:

  default_realm = EXAMPLE.RU
      kdc_timesync = 1
      ccache_type = 4
      forwardable = true
      proxiable = true
      v4_instance_resolve = false
      v4_name_convert = {
      host = {
               rcmd = host
               ftp = ftp
             }
              plain = {
                        something = something-else
                      }
             }
      fcc-mit-ticketflags = true
   [realms]
      EXAMPLE.RU = {
               kdc = domaincontroller
               admin_server = domaincontroller
               default_domain = EXAMPLE.RU
              }
   [domain_realm]
       .example.ru = EXAMPLE.RU
       example.ru = EXAMPLE.RU
   [login]
       krb4_convert = false
       krb4_get_tickets = false


2. Проверяем, что мы можем авторизоваться в домене:

# kinit test_user@EXAMPLE.RU


Если все прошло без ошибок, значит все верно и доменконтроллер выдает нам тикет Kerberos. Проверить тикеты можно командой # klist

2.a. Распространенные ошибки Kinit:

kinit (v5): Clock skew too great while getting initial credentials


Это значит, что у нашей машины не синхронизировано время с контроллером домена.

kinit (v5): Preauthentication failed while getting initial credentials


Введен неверный пароль.

kinit (v5): KDC reply did not match expectations while getting initial credentials


Скорее всего, стоит проверить файл krb5.conf и убедиться, что realm и домен в команде kinit были указаны в верхнем регистре.

kinit (v5): Client not found in Kerberos database while getting initial credentials


Пользователя в домене не существует.

Настройка Samba и ввод машины в домен


1. Для входа в домен нужно правильно настроить Samba. Настройки хранятся в /etc/samba/smb.conf:

  [global]
      dos charset = cp866
      unix charset = KOI8-R
      workgroup = EXAMPLE (прописными)
      realm = EXAMPLE.RU (прописными)
      server string = SQUID-PROXY
      security = ADS
      auth methods = winbind
      allow trusted domains = No
      password server = *
      log level = 1
      log file = /var/log/samba/samba.%m
      max log size = 50
      time server = Yes
      socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
      os level = 0
      preferred master = No
      local master = No
      domain master = No
      dns proxy = No
      ldap ssl = no
      winbind use default domain = Yes
      strict locking = No
      client NTLMv2 auth = Yes
      client lanman auth = No
      client plaintext auth = No
      winbind enum users = Yes
      winbind enum groups = Yes
      winbind refresh tickets = Yes
      encrypt passwords = yes


2. Проверяем конфигурацию:

# testparm
Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
Server role: ROLE_DOMAIN_MEMBER
Press enter to see a dump of your service definitions


3. Правим файл /etc/nsswitch.conf следующим образом:

  #cat /etc/nsswitch.conf
  passwd:         compat winbind
  group:          compat winbind
  shadow:         compat winbind
  
  hosts:          files dns
  networks:       files
  
  protocols:      db files
  services:       db files
  ethers:         db files
  rpc:            db files

  netgroup:       nis


4. Поcле редактирования /etc/samba/smb.conf, перезапускаем Samba и Winbind:

  # /etc/init.d/winbind stop && /etc/init.d/samba restart && /etc/init.d/winbind start


5. Вводим машину в домен:

  # net ads join -U test_user -D EXAMPLE .RU
  Enter test_user's password:
  Using short domain name -- EXAMPLE 
  Joined 'Multiproxy' to realm 'EXAMPLE '


6. Проверяем, видит ли Samba пользователей и группы домена

  # wbinfo -u
  # wbinfo -g

Установка и настройка SQUID 3


1. Устанавливаем пакет SQUID 3:

  # apt-get install squid3


2. Настраиваем SQUID с помощью файла /etc/squid3/squid.conf:

 - IP-адрес прокси 
 - Порт прокси
 - Имя для правила
 - IP-адрес для правила
  http_port :
  http_port :
  cache_access_log /var/log/squid3/access.log
  acl localhost src 127.0.0.1/32
  acl god_mode src 192.168.1.0/24
  acl SSL_ports port 443
  acl Safe_ports port 80          # http
  acl Safe_ports port 21          # ftp
  acl Safe_ports port 443         # https
  acl Safe_ports port 70          # gopher
  acl Safe_ports port 210         # wais
  acl Safe_ports port 1025-65535  # unregistered ports
  acl Safe_ports port 280         # http-mgmt
  acl Safe_ports port 488         # gss-http
  acl Safe_ports port 591         # filemaker
  acl Safe_ports port 777         # multiling http
  # NTLM
  auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
  auth_param ntlm children 5
  auth_param ntlm keep_alive off
  acl AuthorizedUsers proxy_auth REQUIRED
  acl  myport 
  tcp_outgoing_address  
  http_access allow localhost
  http_access deny !Safe_ports
  http_access allow all AuthorizedUsers
  http_access deny all
  icp_access deny all
  cache_mgr test_user@EXAMPLE.RU
  visible_hostname MultiProxy

Настройка маршрутизации


1. Создаем таблицу маршрутизации, добавляем новые таблицы в /etc/iproute2/rt_tables, номер берется из головы, но не дублирующийся:

257     
256     


2. Добавляем правила для наших таблиц:

ip route add 192.168.1.0/24 dev eth0  proto kernel  scope link  src  table table_name1
ip route add default gw  table table_name1
ip route add 192.168.1.0/24 dev eth0  proto kernel  scope link  src  table table_name2
ip route add default gw  table table_name2
ip rule add from xxx.xxx.xxx.xx1 table table_name1
ip rule add from xxx.xxx.xxx.xx2 table table_name2
ip route flush cache

© Habrahabr.ru