Главная » 2009 Сентябрь 29 » Transparent Squid
11:12 Transparent Squid |
Введение Наиболее частым приемом раздачи интернета клиентам является использование специализированного ПО, т.н. прокси серверов. В мире unix пожалуй самый распространенным прокси сервером является - squid. Для его использования клиент должен указать в настройках своего интренет проводника адрес и порт прокси сервера. К сожалению, иногда такая возможность отсутствует или ее выполнение затрудненно. Выходом из данной ситуации является использование прокси сервера в т.н. transparent ("прозрачном") режиме. Собственно само название появилось из-за того, что для клиента работа с интеренетом выглядит "прозрачно", т.е. ему нет необходимости прописывать адрес и порт прокси сервера. Единственное что ему нужно это адрес шлюза по умолчанию и адрес днс сервера. Пожалуй, идеальным выходом будет раздача данных параметров с помощью dhcp сервера, но это уже на ваше усмотрение. К сожалению, у этого способа также существуют и недостатки, к которым можно отнести следующее: невозможность использовать аутентификацию; невозможность проксировать протокол https. Это связанно с особенностью самого протокола; невозможность проксировать протокол ftp. В "обычном" режиме squid позволяет проксировать ftp протокол. Но данную проблему можно решить с помощью программы frox (A transparent FTP proxy); Но несмотря на эти недостатки вы попрежнему можете: ограничивать скорость закачек с помощью delay pools; использовать редиректор (squidGuard, rejik) для ограничения закачек музыки, видео, игр и т.п.; Итак, у нас имеется следующая система: # cat /etc/redhat-release CentOS release 5 (Final) # uname -r 2.6.18-53.1.4.el5 На данной системе установлено 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 клиентам. # yum install dhcp Редактируем файл /etc/dhcpd.conf под свои нужды. Ниже приведены минимальные настройки для работы dhcp сервера. # # /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; } После этого настраиваем запуск dhcp при старте системы и запускаем сам сервер. # chkconfig --level 35 dhcpd on # service dhcpd start Starting dhcpd: [ OK ] Для чистоты совести смотрим лог файл. # 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 Как видно из сообщений, dhcp сервер успешно стартовал и привязался к интерфейсу eth1. Установка и настройка squid Устанавливаем squid. # yum install squid Редактируем файл /etc/squid/squid.conf под свои нужды. Ниже приведены минимальные настройки для работы squid сервера. # # /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 После этого настраиваем запуск squid при старте системы и запускаем сам прокси сервер. # chkconfig --level 35 squid on # service squid start Starting squid: [ OK ] # 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 Настройка брандмауера Создаем минимальный набор правил в нашем фаерволе. Этот пример создан лишь для того, чтобы показать принцип работы iptables. Для более углубленного понимания работы iptables рекомендую прочитать статью Оскара Андерсона в переводе Андрея Кисилева - Iptables Tutorial 1.1.19, которая считается классикой. # # /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 eth0 - смотрит в локальную сеть, eth1 - смотрит в мир. Данным скриптом (firewall.sh) удобно пользоваться на стадии отладки правил. # chmod +x /usr/local/firewall.sh # /usr/local/firewall.sh Данный фаерволл построен по принципу - "запрещено все, кроме разрешенного". Написание фаерволов по такому принципу дает более глубокое понимание того, что происходит в процессе работы того или иного сервиса, какие порты и протоколы он использует и т.д. После того, как у вас все настроено, лучше воспользоваться штатными средствами управления iptables. Для этого воспользуемся скриптом для сохранения текущих правил в файл. В разных дистрибутивах набор правил может сохраняться по отличному от /etc/sysconfig/iptables пути. Данный путь является стандартным для Red Hat дистрибутивов и его клонов, например CentOS. # 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 ] Тестирование На этом собственно настройку данной системы можно считать завершенной. Для проверки корректности работы необходимо с помощью любого ноутбука подключиться по wi-fi к нашей точке доступа и в любом интернет проводнике открыть любимый сайт, например www.google.com. |
|
Всего комментариев: 0 | |