Pull to refresh

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

Reading time 4 min
Views 27K
Поднимаем прокси сервер 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:
<listen_ip> - IP-адрес прокси 
<listen_port> - Порт прокси
<acl_name> - Имя для правила
<outgoing_ip> - IP-адрес для правила
  http_port <listen_ip>:<listen_port>
  http_port <listen_ip>:<listen_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 <acl_name> myport <listen_port>
  tcp_outgoing_address <outgoing_ip> <acl_name>
  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     <table_name2>
256     <table_name1>

2. Добавляем правила для наших таблиц:
ip route add 192.168.1.0/24 dev eth0  proto kernel  scope link  src <local_ip> table table_name1
ip route add default gw <gateway_ip1> table table_name1
ip route add 192.168.1.0/24 dev eth0  proto kernel  scope link  src <local_ip> table table_name2
ip route add default gw <gateway_ip2> 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
Tags:
Hubs:
+7
Comments 9
Comments Comments 9

Articles