[Из песочницы] Мультипрокси на базе 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