Кэширующий прозрачный прокси сервер SQUID на Debian squeeze / Песочница / Хабрахабр ...

:

Задача: Кэширующий прозрачный прокси сервер

Для начала нам понадобиться:

  1. Чистая система с Debian Squeeze
  2. Непосредственно сервер компьютер с двумя сетевыми картами eth0 и eth1.

Для чистоты эксперимента будем считать что eth0 смотрит к провайдеру и получает от него настройки по DHCP, а eth1 смотрит в нашу локальную сеть и имеет классический адресс вида 192.168.100.1.

Тогда:

1) Настроим нашу сеть вот так:

$ cat /etc/network/interfaces

#Localhost Network
auto lo
iface lo inet loopback

#WAN Network
auto eth0
iface eth0 inet dhcp

#LAN Netowrk
auto eth1
iface eth1 inet static
address 192.168.100.1
netmask 255.255.255.0

2) Установим и натсроим DHCP сервер вот так:

# apt-get -y install isc-dhcp-server

Отмечу, что сразу после установки он у нас не запустится, поэтому сразу приводим /etc/dhcp/dhcpd.conf к разумному виду

# cat /etc/dhcp/dhcpd.conf
dns-update-style none;
option domain-name "localdomain";
option domain-name-servers 192.168.100.1;
default-lease-time 600;
max-lease-time 7200;
log-facility local7;

subnet 192.168.100.0 netmask 255.255.255.0 {
range dynamic-bootp 192.168.100.10 192.168.100.99;
option broadcast-address 192.168.100.255;
option routers 192.168.100.1;
}

Из конфига видно что клиенты будут получать адреса от *.10 до *.99.

3) Для нормальной работы нам обязательно потребуется сервер имен.

# apt-get -y install bind9

4) Теперь пришло время поднять и настроить Squid как кэширующий прозрачный прокси сервер

# apt-get -y install squid3

Стоит заметить, что можно работать со стандартным конфигом, но это будет не так как нам требуется и уж совсем не Debian way.
Поэтому приводим конфиг к такому виду:

$ cat /etc/squid3/squid.conf

acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
acl my_network src 192.168.100.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
acl CONNECT method CONNECT

http_access allow my_network
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access deny all

http_port 3128 transparent

hierarchy_stoplist cgi-bin ?
coredump_dir /var/spool/squid3
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320

shutdown_lifetime 5.00 second
cache_dir ufs /var/cache/squid 2048 16 256
maximum_object_size 10024.00 bytes

Как видно из конфига, мы создали правило my_network и разрешили ему смотреть интернеты.
Параметр http_port 3128 transparent означает что наш сервер будет прозрачным.
Также мы переобозначили кэш, задав под него директорию /var/cache/squid размером в 2 Гб.

Создадим ее:

# mkdir -p /var/cache/squid

Назначим права:

chmod 755 -R /var/cache/squid

И спокойно перезапускаем наш Squid.

/etc/init.d/squid3 restart

После перезапуска должен пересоздаться кэш.

5) Очень важно правильно настроить iptables.

На этом шаге я предлагаю Вам создать скрипт настройки, так как он пригодится как универсальное средство.

# vim ./setiptables.sh

#!/bin/bash
LAN=$1
WAN=$2
IP=$3
GW=$4
iptables -t nat -A PREROUTING -i $LAN -p tcp --dport 80 -j DNAT --to $IP:3128
iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -A FORWARD -i $WAN -o $LAN -s $GW/24 -p tcp -m multiport --dport 443,21,22 -j ACCEPT
echo 'net.ipv4.ip_forward = 1' > /etc/sysctl.conf
sysctl -w net.ipv4.ip_forward=1

Мы обозначили переменные (для удобства), 3 правила для таблицы NAT и 1 для FORWARD.
Порты 443,21,22 пускаем в обход прокси сервера.
Помимо настроек iptables, в этом скрипте, мы включаем форвардинг пакетов.

Запускаем так:

# sh ./setiptables.sh eth0 eth1 192.168.100.1 192.168.100.0

6) Настроим автозагрузку натсроек iptables.

Сохраням настройки iptables.

# mkdir -p /usr/local/iptables && iptables-save > /usr/local/iptables/session.ipt

Добавляем команду авотзапуска в /etc/rc.local (мне нравится Perl но тут кому как).

# perl -i -pe 'print "iptables-restore < /usr/local/iptables/session.ipt\n" if $. == 2' /etc/rc.local

Также не забываем про форвардинг пакетов

# perl -i -pe 'print "sysctl -w net.ipv4.ip_forward=1\n" if $. == 3' /etc/rc.local

В целом настройка прозрачного прокси сервера закончена, но чтобы логи были читаемы, нам наобходимо отключить поддержку ipv6 (из за того что ipv6 у нас не настроен на адаптере будет много warnings).

7) Отключаем IPv6

Предлагаю опять же сделать скрипт чтобы не запутаться.

# vim ./ipv6disable.sh

#!/bin/bash
perl -i -pe 'print "alias net-pf-10 ipv6 off\n" if $. == 17' /etc/modprobe.d/aliases.conf
perl -i -pe 'print "alias net-pf-10 off\n" if $. == 18' /etc/modprobe.d/aliases.conf
perl -i -pe 'print "alias ipv6 off\n" if $. == 19' /etc/modprobe.d/aliases.conf
echo 1 | tee /proc/sys/net/ipv6/conf/all/disable_ipv6
echo "blacklist ipv6" | tee -a /etc/modprobe.d/blacklist.conf
STR=$(cat /boot/grub/grub.cfg | sed -n '67p')
STR=${STR}" ipv6.disable=1"
sed '67d' /boot/grub/grub.cfg > /boot/grub/grub.cfg.backup
cp /boot/grub/grub.cfg.backup /boot/grub/grub.cfg
sed -i 67i\ "$STR" /boot/grub/grub.cfg

В общих чертах что в этом скриптике происходит:
Сперва отключаем пожжержку ipv6 в модулях ядра.
Далее указываем маркер в /proc на не использование ipv6.
И в 67 строке /boot/grub/grub.cfg дописываем параметр ipv6.disable=1.

Такая канитель с tee и sed нужна для того чтобы сохранить настройки /boot/grub/grub.cfg, так как там устройства обозначаются не по /dev/sd* и по UUID.

Хотя все всегда можно дописать ручками.

И на последок, для тех кто ручками писать не хочет, я выложил скрипт:
www.uralcode.ru
Не корысти ради, а дабы облегчить нелегкую жизнь админов.

Скрипт все время допиливается. В ближайшее время будет добавлена поддержка havp (проверка трафика антивирусом на лету до вхождения в squid) с кастомными темплейтами. Соответственно постараюсь максимально изложить мат. часть в необходимой для понимания мере.