Инструменты пользователя

Инструменты сайта


www:squid-transparent

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

www:squid-transparent [2009/09/01 19:13] (текущий)
Строка 1: Строка 1:
 +====== Введение ======
  
 +Наиболее частым приемом раздачи интернета клиентам является использование специализированного ПО, т.н. прокси серверов. В мире unix пожалуй самый распространенным прокси сервером является - [[http://​www.squid-cache.org/​|squid]].
 +
 +Для его использования клиент должен указать в настройках своего интренет проводника адрес и порт прокси сервера. К сожалению,​ иногда такая возможность отсутствует или ее выполнение затрудненно. Выходом из данной ситуации является использование прокси сервера в т.н. transparent ("​прозрачном"​) режиме.
 +
 +Собственно само название появилось из-за того, что для клиента работа с интеренетом выглядит "​прозрачно",​ т.е. ему нет необходимости прописывать адрес и порт прокси сервера. Единственное что ему нужно это адрес шлюза по умолчанию и адрес днс сервера. Пожалуй,​ идеальным выходом будет раздача данных параметров с помощью dhcp сервера,​ но это уже на ваше усмотрение.
 +
 +К сожалению,​ у этого способа также существуют и недостатки,​ к которым можно отнести следующее:​
 +
 +    * невозможность использовать аутентификацию;​
 +    * невозможность проксировать протокол https. Это связанно с особенностью самого протокола;​
 +    * невозможность проксировать протокол ftp. В "​обычном"​ режиме squid позволяет проксировать ftp протокол. Но данную проблему можно решить с помощью программы frox (A transparent FTP proxy);
 +
 +Но несмотря на эти недостатки вы попрежнему можете:​
 +
 +    * ограничивать скорость закачек с помощью delay pools;
 +    * использовать редиректор ([[http://​www.squidguard.org/​|squidGuard]],​ [[http://​www.rejik.ru/​|rejik]]) для ограничения закачек музыки,​ видео, игр и т.п.;
 +
 +Итак, у нас имеется следующая система:​
 +<​code>​
 +# cat /​etc/​redhat-release
 +CentOS release 5 (Final)
 +
 +# uname -r
 +2.6.18-53.1.4.el5
 +</​code>​
 +На данной системе установлено 3 сетевых адаптера:​
 +
 +    * eth0 (192.168.0.1) - смотрит в локальную сеть;
 +    * eth1 (192.168.1.1) - смотрит в wi-fi сеть;
 +    * eth2 (212.42.65.50) - смотрит в мир;
 +
 +Наша задача состоит в следующем:​ ограничить wi-fi клиентов от клиентов локальной сети. Разрешить им доступ только в инет через прозрачный прокси север. Клиенты из локальной сети будут выходить в интернет через тот же прокси сервер,​ но который будет работать не в прозрачном режиме,​ а обычном.
 +
 +===== Установка и настройка dhcp =====
 +Устанавливаем и настраиваем dhcp сервер. С помощью его мы будем выдавать адреса,​ а также другую необходимую информацию (адрес dns сервера,​ шлюза по умолчанию) wi-fi клиентам.
 +<​code>​
 +# yum install dhcp
 +</​code>​
 +Редактируем файл /​etc/​dhcpd.conf под свои нужды. Ниже приведены минимальные настройки для работы dhcp сервера.
 +<​code>​
 +#
 +# /​etc/​dhcpd.conf
 +#
 +
 +ddns-update-style none;
 +ignore client-updates;​
 +
 +subnet 192.168.1.0 netmask 255.255.255.0 {
 +
 +        option routers ​                 192.168.1.1;​
 +        option subnet-mask ​             255.255.255.0;​
 +        option domain-name-servers ​     192.168.1.1;​
 +
 +        default-lease-time 3600;
 +        max-lease-time 25200;
 +
 +        range 192.168.1.100 192.168.1.200;​
 +}
 +</​code>​
 +После этого настраиваем запуск dhcp при старте системы и запускаем сам сервер.
 +<​code>​
 +# chkconfig --level 35 dhcpd on
 +# service dhcpd start
 +Starting dhcpd: ​                                           [  OK  ]
 +</​code>​
 +Для чистоты совести смотрим лог файл.
 +<​code>​
 +# cat /​var/​log/​messages | grep dhcpd
 +Dec 15 09:05:45 centos5 dhcpd: Internet Systems Consortium DHCP Server V3.0.5-RedHat
 +Dec 15 09:05:45 centos5 dhcpd: Copyright 2004-2006 Internet Systems Consortium.
 +Dec 15 09:05:45 centos5 dhcpd: All rights reserved.
 +Dec 15 09:05:45 centos5 dhcpd: For info, please visit http://​www.isc.org/​sw/​dhcp/​
 +Dec 15 09:05:45 centos5 dhcpd: Wrote 1 leases to leases file.
 +Dec 15 09:05:45 centos5 dhcpd:
 +Dec 15 09:05:45 centos5 dhcpd: No subnet declaration for eth2 (212.42.65.50).
 +Dec 15 09:05:45 centos5 dhcpd: ** Ignoring requests on eth2.  If this is not what
 +Dec 15 09:05:45 centos5 dhcpd: ​   you want, please write a subnet declaration
 +Dec 15 09:05:45 centos5 dhcpd: ​   in your dhcpd.conf file for the network segment
 +Dec 15 09:05:45 centos5 dhcpd: ​   to which interface eth2 is attached. **
 +Dec 15 09:05:45 centos5 dhcpd:
 +Dec 15 09:05:45 centos5 dhcpd: Listening on LPF/​eth1/​00:​0c:​29:​06:​7d:​da/​192.168.1/​24
 +Dec 15 09:05:45 centos5 dhcpd: Sending on   ​LPF/​eth1/​00:​0c:​29:​06:​7d:​da/​192.168.1/​24
 +Dec 15 09:05:45 centos5 dhcpd:
 +Dec 15 09:05:45 centos5 dhcpd: No subnet declaration for eth0 (192.168.0.1).
 +Dec 15 09:05:45 centos5 dhcpd: ** Ignoring requests on eth0.  If this is not what
 +Dec 15 09:05:45 centos5 dhcpd: ​   you want, please write a subnet declaration
 +Dec 15 09:05:45 centos5 dhcpd: ​   in your dhcpd.conf file for the network segment
 +Dec 15 09:05:45 centos5 dhcpd: ​   to which interface eth0 is attached. **
 +Dec 15 09:05:45 centos5 dhcpd:
 +Dec 15 09:05:45 centos5 dhcpd: Sending on   ​Socket/​fallback/​fallback-net
 +Dec 15 09:05:45 centos5 dhcpd: dhcpd startup succeeded
 +</​code>​
 +Как видно из сообщений,​ dhcp сервер успешно стартовал и привязался к интерфейсу eth1.
 +
 +===== Установка и настройка squid =====
 +Устанавливаем squid.
 +<​code>​
 +# yum install squid
 +</​code>​
 +Редактируем файл /​etc/​squid/​squid.conf под свои нужды. Ниже приведены минимальные настройки для работы squid сервера.
 +<​code>​
 +#
 +#   /​etc/​squid/​squid.conf
 +#
 +
 +# NETWORK OPTIONS
 +# -----------------------------------------------------------------------------
 +# Указываем squid на каком порту и интерфейсе он будет работать. Именно эти
 +# параметры необходимо будет указывать в настройках интернет проводника.
 +http_port 192.168.0.1:​3128
 +http_port 192.168.1.1:​3128 transparent
 +
 +# TAG: auth_param
 +# Здесь мы указываем squid, как следует производить аутентификацию.
 +# Единственный параметр,​ который необходимо указать ncsa_auth -
 +# это имя файла, в котором хранятся имена пользователей и пароли.
 +# Данным файлом можно управлять (добавлять новых пользователей,​
 +# удалять текущих,​ изменять пароли и т.д.) с помощью утилиты
 +# htpasswd, которая входит в состав пакета apache.
 +auth_param basic program /​usr/​lib/​squid/​ncsa_auth /​etc/​squid/​internet_users
 +auth_param basic children 5
 +auth_param basic realm Squid proxy-caching web server
 +auth_param basic credentialsttl 2 hours
 +auth_param basic casesensitive off
 +
 +# ACCESS CONTROLS
 +# -----------------------------------------------------------------------------
 +# ACL - Access Control List. Списки доступа к нашему прокси серверу.
 +# Здесь мы указываем,​ кто имеет право, а кто нет, использовать наш прокси.
 +# Разрешаем использовать наш прокси только прошедшим авторизацию.
 +
 +acl wifi src 192.168.1.0/​24
 +acl lan proxy_auth REQUIRED
 +
 +http_access allow wifi
 +http_access allow lan
 +http_access deny all
 +</​code>​
 +После этого настраиваем запуск squid при старте системы и запускаем сам прокси сервер.
 +<​code>​
 +# chkconfig --level 35 squid on
 +# service squid start
 +Starting squid: ​                                           [  OK  ]
 +</​code>​
 +
 +<​code>​
 +# cat cache.log
 +2007/12/15 09:12:36| Starting Squid Cache version 2.6.STABLE6 for i686-redhat-linux-gnu...
 +2007/12/15 09:12:36| Process ID 4752
 +2007/12/15 09:12:36| With 1024 file descriptors available
 +2007/12/15 09:12:36| Using epoll for the IO loop
 +2007/12/15 09:12:36| DNS Socket created at 0.0.0.0, port 1028, FD 8
 +2007/12/15 09:12:36| Adding nameserver 127.0.0.1 from /​etc/​resolv.conf
 +2007/12/15 09:12:36| User-Agent logging is disabled.
 +2007/12/15 09:12:36| Referer logging is disabled.
 +2007/12/15 09:12:36| Unlinkd pipe opened on FD 13
 +2007/12/15 09:12:36| Swap maxSize 102400 KB, estimated 7876 objects
 +2007/12/15 09:12:36| Target number of buckets: 393
 +2007/12/15 09:12:36| Using 8192 Store buckets
 +2007/12/15 09:12:36| Max Mem  size: 8192 KB
 +2007/12/15 09:12:36| Max Swap size: 102400 KB
 +2007/12/15 09:12:36| Local cache digest enabled; rebuild/​rewrite every 3600/3600 sec
 +2007/12/15 09:12:36| Rebuilding storage in /​var/​spool/​squid (CLEAN)
 +2007/12/15 09:12:36| Using Least Load store dir selection
 +2007/12/15 09:12:36| Set Current Directory to /​var/​spool/​squid
 +2007/12/15 09:12:36| Loaded Icons.
 +2007/12/15 09:12:37| Accepting transparently proxied HTTP connections at 192.168.1.1,​ port 3128, FD 15.
 +2007/12/15 09:12:37| Accepting proxy HTTP connections at 192.168.0.1,​ port 3128, FD 16.
 +2007/12/15 09:12:37| Accepting ICP messages at 0.0.0.0, port 3130, FD 17.
 +2007/12/15 09:12:37| WCCP Disabled.
 +2007/12/15 09:12:37| Ready to serve requests.
 +2007/12/15 09:12:37| Done reading /​var/​spool/​squid swaplog (39 entries)
 +2007/12/15 09:12:37| Finished rebuilding storage from disk.
 +2007/12/15 09:​12:​37| ​       39 Entries scanned
 +2007/12/15 09:​12:​37| ​        0 Invalid entries.
 +2007/12/15 09:​12:​37| ​        0 With invalid flags.
 +2007/12/15 09:​12:​37| ​       39 Objects loaded.
 +2007/12/15 09:​12:​37| ​        0 Objects expired.
 +2007/12/15 09:​12:​37| ​        0 Objects cancelled.
 +2007/12/15 09:​12:​37| ​        0 Duplicate URLs purged.
 +2007/12/15 09:​12:​37| ​        0 Swapfile clashes avoided.
 +2007/12/15 09:​12:​37| ​  Took 0.5 seconds (  73.4 objects/​sec).
 +2007/12/15 09:12:37| Beginning Validation Procedure
 +2007/12/15 09:​12:​37| ​  ​Completed Validation Procedure
 +2007/12/15 09:​12:​37| ​  ​Validated 39 Entries
 +2007/12/15 09:​12:​37| ​  ​store_swap_size = 248k
 +2007/12/15 09:12:37| storeLateRelease:​ released 0 objects
 +</​code>​
 +
 +===== Настройка брандмауера =====
 +Создаем минимальный набор правил в нашем фаерволе. Этот пример создан лишь для того, чтобы показать принцип работы iptables. Для более углубленного понимания работы iptables рекомендую прочитать статью Оскара Андерсона в переводе Андрея Кисилева - [[http://​www.opennet.ru/​docs/​|Iptables Tutorial 1.1.19]], которая считается классикой.
 +<code bash>
 +#
 +# /​usr/​local/​firewall.sh
 +#
 +
 +#!/bin/sh
 +IPTABLES="/​sbin/​iptables"​
 +
 +# Отчищаем все правила в таблицах filter, nat и mangle
 +
 +$IPTABLES -t filter -F
 +$IPTABLES -t nat -F
 +$IPTABLES -t mangle -F
 +
 +# Удаляем все пользовательские цепочки в таблицах filter, nat и mangle
 +
 +$IPTABLES -t filter -X
 +$IPTABLES -t nat -X
 +$IPTABLES -t mangle -X
 +
 +# Задаем политики по умолчанию
 +
 +$IPTABLES -t filter -P INPUT DROP
 +$IPTABLES -t filter -P FORWARD DROP
 +$IPTABLES -t filter -P OUTPUT DROP
 +
 +# Создаем пользовательские цепочки. Как строить firewall каждый решает сам.
 +# Но лично мне удобно настраивать фаервол,​ когда все разбито по цепочкам
 +# и как бы разложено по своим полочкам. Тогда я точно знаю, что и где надо
 +# искать или исправлять. Думаю, названия цепочек говорят сами за себя.
 +
 +$IPTABLES -N eth0-eth2
 +$IPTABLES -N eth2-eth0
 +$IPTABLES -N eth1-eth2
 +$IPTABLES -N eth2-eth1
 +$IPTABLES -N eth2-out
 +$IPTABLES -N eth1-out
 +$IPTABLES -N eth0-out
 +$IPTABLES -N eth2-in
 +$IPTABLES -N eth1-in
 +$IPTABLES -N eth0-in
 +$IPTABLES -N icmp_packets
 +
 +# Направляем все входящие пакеты в соответствующие цепочки.
 +
 +$IPTABLES -A INPUT -d 192.168.0.1 -j eth0-in
 +$IPTABLES -A INPUT -d 192.168.1.1 -j eth1-in
 +$IPTABLES -A INPUT -d 212.42.65.50 -j eth2-in
 +
 +# Направляем все исходящие пакеты в соответствующие цепочки.
 +
 +$IPTABLES -A OUTPUT -s 192.168.0.1 -j eth0-out
 +$IPTABLES -A OUTPUT -s 192.168.1.1 -j eth1-out
 +$IPTABLES -A OUTPUT -s 212.42.65.50 -j eth2-out
 +
 +# Разрешаем весь трафик с петлевого интерфейса.
 +
 +$IPTABLES -A INPUT -i lo -j ACCEPT
 +$IPTABLES -A OUTPUT -o lo -j ACCEPT
 +
 +# Разрешаем следующие типы icmp пакетов.
 +
 +$IPTABLES -A icmp_packets -p icmp --icmp-type 0 -j ACCEPT
 +$IPTABLES -A icmp_packets -p icmp --icmp-type 3 -j ACCEPT
 +$IPTABLES -A icmp_packets -p icmp --icmp-type 8 -j ACCEPT
 +$IPTABLES -A icmp_packets -p icmp --icmp-type 11 -j ACCEPT
 +
 +# Для удобства фильтрации,​ направляем все транзитные пакеты,​
 +# в соответствующие цепочки.
 +# eth0-eth1 локальная сеть -> мир
 +# eth1-eth0 мир -> локальная сеть
 +# eth1-eth2 wi-fi сеть -> мир
 +# eth2-eth1 мир -> wi-fi сеть
 +
 +$IPTABLES -A FORWARD -i eth1 -o eth2 -j eth1-eth2
 +$IPTABLES -A FORWARD -i eth2 -o eth1 -j eth2-eth1
 +$IPTABLES -A FORWARD -i eth0 -o eth2 -j eth0-eth2
 +$IPTABLES -A FORWARD -i eth2 -o eth0 -j eth2-eth0
 +
 +# eth0-eth2. В данную цепочку попадают все транзитные пакеты,​
 +# направленные из локальной сети в мир.
 +
 +$IPTABLES -A eth0-eth2 -p icmp -j icmp_packets
 +$IPTABLES -A eth0-eth2 -m state --state RELATED,​ESTABLISHED -j ACCEPT
 +$IPTABLES -A eth0-eth2 -j DROP
 +
 +# eth2-eth0. В данную цепочку попадают все транзитные пакеты,​
 +# направленные из мира в локальную сеть.
 +
 +$IPTABLES -A eth2-eth0 -m state --state RELATED,​ESTABLISHED -j ACCEPT
 +$IPTABLES -A eth2-eth0 -j DROP
 +
 +# eth1-eth2. В данную цепочку попадают все транзитные пакеты,​
 +# направленные из wi-fi сети в мир.
 +
 +$IPTABLES -A eth1-eth2 -p icmp -j icmp_packets
 +$IPTABLES -A eth1-eth2 -p tcp --dport 443 -j ACCEPT
 +$IPTABLES -A eth1-eth2 -m state --state RELATED,​ESTABLISHED -j ACCEPT
 +$IPTABLES -A eth1-eth2 -j DROP
 +
 +# eth2-eth1. В данную цепочку попадают все транзитные пакеты,​
 +# направленные из мира в wi-fi сеть.
 +
 +$IPTABLES -A eth2-eth1 -m state --state RELATED,​ESTABLISHED -j ACCEPT
 +$IPTABLES -A eth2-eth1 -j DROP
 +
 +# eth0-in. В данной цепочке открываем порты тех служб, которые
 +# должны быть доступны на сервере из локальной сети.
 +
 +$IPTABLES -A eth0-in -p icmp -j icmp_packets
 +$IPTABLES -A eth0-in -p tcp --dport 22 -j ACCEPT
 +$IPTABLES -A eth0-in -p udp --dport 53 -j ACCEPT
 +$IPTABLES -A eth0-in -p tcp --dport 3128 -j ACCEPT
 +$IPTABLES -A eth0-in -j DROP
 +
 +# eth1-in. В данной цепочке открываем порты тех служб, которые
 +# должны быть доступны на сервере из wi-fi сети.
 +
 +$IPTABLES -A eth1-in -p icmp -j icmp_packets
 +$IPTABLES -A eth1-in -p udp --dport 53 -j ACCEPT
 +$IPTABLES -A eth1-in -p udp --dport 67 --sport 68 -j ACCEPT
 +$IPTABLES -A eth1-in -p tcp --dport 3128 -j ACCEPT
 +$IPTABLES -A eth1-in -j DROP
 +
 +# eth2-in. В данной цепочке открываем порты тех служб, которые
 +# должны быть доступны на сервере из мира. Например www, smtp, ftp
 +
 +$IPTABLES -A eth2-in -p icmp -j icmp_packets
 +$IPTABLES -A eth2-in -m state --state RELATED,​ESTABLISHED -j ACCEPT
 +$IPTABLES -A eth2-in -j DROP
 +
 +# eth0-out.
 +
 +$IPTABLES -A eth0-out -p icmp -j icmp_packets
 +$IPTABLES -A eth0-out -m state --state RELATED,​ESTABLISHED -j ACCEPT
 +$IPTABLES -A eth0-out -j DROP
 +
 +# eth1-out.
 +
 +$IPTABLES -A eth1-out -p icmp -j icmp_packets
 +$IPTABLES -A eth1-out -m state --state RELATED,​ESTABLISHED -j ACCEPT
 +$IPTABLES -A eth1-out -j DROP
 +
 +# eth2-out.
 +
 +$IPTABLES -A eth2-out -p icmp -j icmp_packets
 +$IPTABLES -A eth2-out -p udp --dport 53 -j ACCEPT
 +$IPTABLES -A eth2-out -p tcp -m multiport --dport 80,443,8080 -j ACCEPT
 +$IPTABLES -A eth2-out -m state --state RELATED,​ESTABLISHED -j ACCEPT
 +$IPTABLES -A eth2-out -j DROP
 +
 +# Производим сетевую трансляцию адресов (NAT)
 +
 +$IPTABLES -t nat -A POSTROUTING -s 192.168.0.0/​24 -o eth2 -j SNAT --to-source 212.42.65.50
 +$IPTABLES -t nat -A POSTROUTING -s 192.168.1.0/​24 -o eth2 -j SNAT --to-source 212.42.65.50
 +
 +# "​Заварачиваем"​ весь http трафик на squid.
 +
 +$IPTABLES -t nat -A PREROUTING -s 192.168.1.0/​24 -i eth1 -p tcp -m multiport --dport 80,8080 -j REDIRECT --to-ports 3128
 +</​code>​
 +eth0 - смотрит в локальную сеть, eth1 - смотрит в мир. Данным скриптом (firewall.sh) удобно пользоваться на стадии отладки правил.
 +<​code>​
 +# chmod +x /​usr/​local/​firewall.sh
 +# /​usr/​local/​firewall.sh
 +</​code>​
 +
 +Данный фаерволл построен по принципу - "​запрещено все, кроме разрешенного"​. Написание фаерволов по такому принципу дает более глубокое понимание того, что происходит в процессе работы того или иного сервиса,​ какие порты и протоколы он использует и т.д.
 +
 +После того, как у вас все настроено,​ лучше воспользоваться штатными средствами управления iptables. Для этого воспользуемся скриптом для сохранения текущих правил в файл. В разных дистрибутивах набор правил может сохраняться по отличному от /​etc/​sysconfig/​iptables пути. Данный путь является стандартным для Red Hat дистрибутивов и его клонов,​ например CentOS.
 +<​code>​
 +# service iptables save
 +Saving firewall rules to /​etc/​sysconfig/​iptables: ​         [  OK  ]
 +
 +# chkconfig --level 35 iptables on
 +# service iptables restart
 +Flushing firewall rules: ​                                  ​[ ​ OK  ]
 +Setting chains to policy ACCEPT: mangle filter nat         ​[ ​ OK  ]
 +Unloading iptables modules: ​                               [  OK  ]
 +Applying iptables firewall rules: ​                         [  OK  ]
 +</​code>​
 +
 +===== Тестирование =====
 +На этом собственно настройку данной системы можно считать завершенной. Для проверки корректности работы необходимо с помощью любого ноутбука подключиться по wi-fi к нашей точке доступа и в любом интернет проводнике открыть любимый сайт, например www.google.com.
www/squid-transparent.txt · Последние изменения: 2009/09/01 19:13 (внешнее изменение)