Прокси с привязкой пользователя и адреса

Материал из Lblss.ru
Перейти к: навигация, поиск

Содержание

Задача

В этом примере, сервер имеет адреса 11.22.33.10...11.22.33.14. Юзеры user00...user04 должны "выходить в инет" каждый со своего адреса. Требуется авторизация пользователей. Используется OS FreeBSD 6.x

ПО

Устанавливается squid версии 2.7, опции годятся по дефолту. Впрочем, лишнее можно отключить, а нужное включить.

Конфиги

squid.conf

########################################################
# Настройка авторизации юзеров
auth_param basic program /usr/local/libexec/squid/basic_ncsa_auth /usr/local/etc/squid/passwd
auth_param basic children 2
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive off
 
########################################################
# Порт, который будет слушать squid
http_port 3128
# Не палить клиента
forwarded_for off
 
########################################################
# Стандартные настройки
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443 563 5190 2083
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
acl CONNECT method CONNECT
 
http_access allow manager localhost
http_access deny manager
 
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
 
#################################################
# Соответствие юзеров и айпишников
acl user00acl proxy_auth user00
acl user01acl proxy_auth user01
acl user02acl proxy_auth user02
acl user03acl proxy_auth user03
acl user04acl proxy_auth user04
tcp_outgoing_address 11.22.33.11 user01acl
tcp_outgoing_address 11.22.33.12 user02acl
tcp_outgoing_address 11.22.33.13 user03acl
tcp_outgoing_address 11.22.33.14 user04acl
# дефолтовый адрес, user00acl и все кто не перечислены выше идут сюда
tcp_outgoing_address 11.22.33.10
 
#################################################
# Разрешающие правила
acl allusers proxy_auth REQUIRED
http_access allow allusers
 
#################################################
# EOF

Здесь:

  • /usr/local/libexec/squid/basic_ncsa_auth - программа авторизации пользователей. В предыдущих версиях было /usr/local/libexec/squid/ncsa_auth
  • /usr/local/etc/squid/passwd - файл с парами логин-пароль

Для создания паролей используется команда htpasswd (или htpasswd2 - что есть под руками).

Когда много юзеров

На скорую руку набросал скриптик. Ничего особенного, да и сложность паролей не слишком высока.

#!/bin/bash
# 
# Рисует комплектик файлов для конфигов squid
# и сетевого интерфейса
# На входе файл со списком айпи-адресов
# http://wiki.lblss.ru/%D0%9F%D1%80%D0%BE%D0%BA%D1%81%D0%B8_%D1%81_%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%BE%D0%B9_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F_%D0%B8_%D0%B0%D0%B4%D1%80%D0%B5%D1%81%D0%B0
 
# Префикс имени юзера
userpref="user"
# Начальное значение суффикса имени юзера
usernum=2
 
# Имя файла с паролями для авторизации
passwd="passwd"
# Имя файла для конфига squid
conf="squid.conf.ins"
# Имя файла со списком юзеров и паролей
user_pass="user_pass.txt"
 
# Имя файла для вставки в /etc/network/interfaces (Linux)
interfaces_linux="interfaces.linux.ins"
# Имя файла для вставки в /etc/rc.conf (FreeBSD)
interfaces_freebsd="interfaces.freebsd.ins"
 
# Имя файла со списком айпишников
iplist="infoboxip"
# Шлюз
gateway="22.222.222.1"
# Маска сети
netmask="255.255.255.248"
# Имя сетевого адаптера (интерфейса)
netiface="eth0"
# Начальный номер алиаса адаптера
numalias=4
 
##############################################
 
rm -f ${conf} ${user_pass} ${passwd} ${interfaces_linux} ${interfaces_freebsd}
sleep 1
touch ${conf}
touch ${user_pass}
touch ${passwd}
touch ${interfaces_linux}
touch ${interfaces_freebsd}
 
firstloop="1"
 
cat ${iplist} | while read ip
do
# Формирование реквизитов пользователей
    user=${userpref}${usernum}
    pass=`echo "${cuser}${ip}\`date\`" | md5sum | head -c 12`
    echo ${ip}:${user}:${pass} >>${user_pass}
    htpasswd2 -b ${passwd} ${user} ${pass}
    echo "acl ${user}acl proxy_auth ${user}" >>${conf}
    echo "tcp_outgoing_address ${ip} ${user}acl" >>${conf}
    ((usernum++))
# Формирование вставки в конфиг /etc/network/interfaces
    echo "auto ${netiface}:${numalias}" >>${interfaces_linux}
    echo "iface ${netiface}:${numalias} inet static" >>${interfaces_linux}
    echo "        address ${ip}" >>${interfaces_linux}
    echo "        netmask ${netmask}" >>${interfaces_linux}
    if test "1" -eq ${firstloop}
    then
        echo "#        gateway ${gateway}" >>${interfaces_linux}
        firstloop="0"
    fi
    echo >>${interfaces_linux}
# Формирование вставки в конфиг /etc/rc.conf
    echo "ifconfig_${netiface}_alias${numalias}=\"inet ${ip} netmask ${netmask}\"" >>${interfaces_freebsd}
    ((numalias++))
done
Персональные инструменты