Pull to refresh

Кэширующий прозрачный прокси сервер 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) с кастомными темплейтами. Соответственно постараюсь максимально изложить мат. часть в необходимой для понимания мере.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.