Прозрачный прокси

Простые/общие вопросы по UNIX системам. Спросите здесь, если вы новичок

Модераторы: vadim64, terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Rolandvi
рядовой
Сообщения: 10
Зарегистрирован: 2015-05-06 9:43:58

Прозрачный прокси

Непрочитанное сообщение Rolandvi » 2015-05-06 13:25:36

Доброе время суток.
Установлен Squid (Squid Cache: Version 3.4.12).
FreeBSD vpn-gate 10.1-RELEASE-p9 FreeBSD 10.1-RELEASE-p9.

Проблема в следующем.
С существующим конфигом по идее должен заработать прозрачный прокси. Однако не всходит никак. Работает только с указанием у клиента порта 3128, а напрямую заворачивать клиента не хочет. Где копать?

Код: Выделить всё

#Адрес и порт для входящих подключений
#При прозрачном проксировании может использоваться для управления кэшем
http_port 3128 
#Локальный интерфейс, для трафика, перенаправленного брандмауэром
http_port 127.0.0.1:3129 intercept

#Время ожидания установки TCP соединения с сервером
#По умолчанию 1 минута, если сервер не отвечает, выполняется 3 попытки установить соединение, итого время до появления ошибки 3 минуты
#Сократим таймаут до 20 секунд
connect_timeout 20 second

#Не использовать IPv6, если доступен IPv4
#По умолчанию, приоритет отдается протоколу IPv6, что может привести к ошибкам соединения, если IPv6 недоступен 
dns_v4_first on

#При завершении работы ожидать закрытия клиентских подключений, так заявлено в документации
#Фактически, ждет независимо от наличия подключений
#По умолчанию - 30 секунд, сократим время ожидания до 1
shutdown_lifetime 1 seconds

#Отключить кеширование
#cache deny all

#Размер кэша в оперативной памяти
#По умолчанию 256Мб
#cache_mem 256 MB

#Максимальный размер объекта, сохраняемого в оперативной памяти
#Объекты больше заданного размера в памяти не сохраняются
#maximum_object_size_in_memory 512 KB

#Путь сохранения дампа аварийного завершения
coredump_dir /usr/local/squid

#Путь и формат лог-файла
access_log daemon:/usr/local/squid/log/access.log squid
#access_log stdio:/usr/local/squid/log/access.log squid

#Протоколировать параметры запросов
#По умолчанию в целях обеспечения приватности в логе не сохраняются параметры CGI-скриптов
#strip_query_terms off

#Протоколировать http-заголовки
log_mime_hdrs on

#Не отправлять заголовок X-Forwarded-For содержащий внутренний IP-адрес клиента
#forwarded_for transparent

#Не отправлять заголовок Via с именем и версией прокси-сервера
#via off

#Email администратора, для отправки уведомлений об отказе кэша
#На практике, ни одного уведомления не получал
#Адрес также отображается на страницах ошибок
cache_mgr 1@2.com

#Адрес сервера на страницах ошибок
visible_hostname vpn-gate

#
# Списки контроля доступа
#

#IP-адрес, с которого разрешено управление кэшем
acl CacheManagerIP src 172.22.23.3

#Обслуживаемая прокси-сервером сеть
#acl localnet src 10.0.0.0/8    # RFC1918 possible internal network
#acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
#acl localnet src fc00::/7       # RFC 4193 local private network range
#acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines
acl localnet src 172.22.23.0/24 # RFC1918 possible internal network

#addon
# Порт SSL для подключений по HTTPS-протоколу
acl SSL_ports port 443
# Список портов, к которым разрешен доступ через прокси-сервер по протоколу HTTP
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
#addon
#Метод CONNECT, используется для SSL-соединений
acl CONNECT method CONNECT

#Путь к списку IP-адресов пользователей, для которых не действуют запреты
acl AdminsIP src "/usr/local/etc/squid/AccessLists/AdminsIP.txt"

#Путь к списку запрещенных сайтов
acl RestrictedDomains dstdomain "/usr/local/etc/squid/AccessLists/RestrictedDomains.txt"

#Mime-типы для аудио и видео
acl MimeAudioVideo  rep_mime_type audio video

#Сайты с IP-адресами
acl UrlIP url_regex -i ^http://[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/.*

#
# Права доступа
#

#Разрешить локальное управление кэшем
http_access allow manager localhost
#Разрешить удаленное управление кэшем
#http_access allow manager CacheManagerIP
http_access deny manager

#Пароли для различных действий протокола управления кэшем
#Значение disable all отключает управление кэшем
#cachemgr_passwd disable all

#Запретить метод CONNECT
#Проксирование SSL-соединений в прозрачном режиме невозможно
#http_access deny CONNECT

#Запретить доступ к локальным ресурсам сервера через прокси
http_access deny to_localhost

#Не ограничивать доступ администраторам
http_access allow AdminsIP

#Блокировать запрещенные сайты
http_access deny RestrictedDomains

#Запретить доступ к сайтам по IP-адресу
#http_access deny UrlIP

#Разрешить доступ из локальной сети
http_access allow localnet

#Блокировать все, что не разрешено
http_access deny all

url_rewrite_program /usr/local/bin/squidGuard
url_rewrite_children 50

#
#Фильтрация по http-заголовкам в ответе сервера
#

#Не ограничивать доступ администраторам
#http_reply_access allow AdminsIP

#Блокировать загрузку аудио/видео контента
#Успех блокировки зависит от используемого протокола 
#и корректности MIME-типа, отправляемого сервером
#http_reply_access deny MimeAudioVideo

#Разрешить весь остальной контент
http_reply_access allow all

#Время устаревания кэшируемого контента в минутах, если явно не задано сервером
#Поля: шаблон соответствия URL, минимальное время в минутах, процент для расчета времени устаревания объекта, максимальное время в минутах
#Если повторный запрос приходит до наступления минимального времени, объект считается актуальным, запрос к серверу не выполняется
#Расчет времени жизни производится по формуле: (ВремяПолучения-ВремяСоздания)*Процент
#Чем старее объект, тем дольше он содержится в кэше, но не дольше заданного максимального времени
#http://etutorials.org/Server+Administration/Squid.+The+definitive+guide/Chapter+7.+Disk+Cache+Basics/7.7+refresh_pattern/
#
#Время жизни объектов для FTP-протокола
#refresh_pattern ^ftp:           1440    20%     10080
#Нулевое время жизни для динамического контента
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
#Время жизни по умолчанию
refresh_pattern .               0       20%     4320

#Кэш: формат, размещение, размер в мегабайтах, число папок первой и второй вложенности
#Указанный размер кэша не учитывает издержки файловой системы и должен быть примерно на 20% меньше доступного дискового пространства
#Директиву cache_dir, можно указать несколько раз, выделив под кэш дополнительные разделы
cache_dir ufs /usr/local/squid/cache 3000 16 256

#Не кэшировать файлы больше заданного размера
#По умолчанию 4Мб
maximum_object_size 320 MB

#Продолжить загрузку при отключении клиента, если осталось загрузить менее указанного объема данных
#Позволяет сохранить объект в кэше при отмене загрузки клиентом
#Значение 0 для quick_abort_min и quick_abort_max отменяют докачку
#Значение -1 включает полную закачку объекта, не зависимо от оставшегося объема, повышает нагрузку на канал
#По умолчанию 16 Кб
Конфиг ipfw такой:

Код: Выделить всё

#!/bin/sh 

FwCMD="/sbin/ipfw"      
LanOut="re0"            # bee 
LanOut2="re1"           # stream 
LanIn="re2"             # Int 
IpOut="62.105.X.X"   # IP bee 
IpOut2="192.168.X.X"     # IP stream 
IpIn="172.22.23.3"    # Int IP 
NetIn="172.22.23.0/24"  # IntNet 

${FwCMD} -f flush 
${FwCMD} -f pipe flush 
${FwCMD} -f queue flush 
${FwCMD} -f table 0 flush

${FwCMD} table 0 add 172.22.23.58 

${FwCMD} add check-state 

${FwCMD} add allow ip from any to any via lo0 
${FwCMD} add deny ip from any to 127.0.0.0/8 
${FwCMD} add deny ip from 127.0.0.0/8 to any 

#NAT_config 
${FwCMD} nat 1 config log if re1 same_ports reset unreg_only
#NAT1 
${FwCMD} add nat 1 ip from "table(0)" to any out via re1 
${FwCMD} add nat 1 ip from any to any in via re1 

${FwCMD} add allow tcp from me to any out via re1 keep-state uid squid
${FwCMD} add fwd 127.0.0.1,3129 tcp from 172.22.23.0/24 to any 80-83,8080-8088 out via re1 keep-state
Уже всю голову сломал.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

logout_90
мл. сержант
Сообщения: 72
Зарегистрирован: 2014-01-27 5:36:26

Прозрачный прокси

Непрочитанное сообщение logout_90 » 2015-05-06 14:27:22

Добрый день! вот тут не хватает слова "transparent"
Rolandvi писал(а): #При прозрачном проксировании может использоваться для управления кэшем
http_port 3128
И попробуйте поставить форвард до ната.

Отправлено спустя 2 минуты 41 секунду:
Аааа, заворачиваете на 127.0.0.1 и юзаете intercept. Ну с этой опцией не работал, а вот так получается гуд:

Код: Выделить всё

  #При прозрачном проксировании может использоваться для управления кэшем
http_port 3128
#Локальный интерфейс, для трафика, перенаправленного брандмауэром
http_port 3129 transparent

Rolandvi
рядовой
Сообщения: 10
Зарегистрирован: 2015-05-06 9:43:58

Прозрачный прокси

Непрочитанное сообщение Rolandvi » 2015-05-06 15:03:39

logout_90 писал(а):Добрый день! вот тут не хватает слова "transparent"
Rolandvi писал(а): #При прозрачном проксировании может использоваться для управления кэшем
http_port 3128
И попробуйте поставить форвард до ната.

Отправлено спустя 2 минуты 41 секунду:
Аааа, заворачиваете на 127.0.0.1 и юзаете intercept. Ну с этой опцией не работал, а вот так получается гуд:

Код: Выделить всё

  #При прозрачном проксировании может использоваться для управления кэшем
http_port 3128
#Локальный интерфейс, для трафика, перенаправленного брандмауэром
http_port 3129 transparent
Увы. Все попробовал. Не идет. Однако если смотреть ipfw show, то при перестановке форварда до ната картинка изменилась. Было так приблизительно:

Код: Выделить всё

00500  5082  3885973 allow tcp from me to any out via re1 uid squid keep-state
00600   0        0 fwd 127.0.0.1,3129 tcp from 172.22.23.0/24 to any dst-port 80-83,8080-8088 out via re1 keep-state
а стало так:

Код: Выделить всё

00500  5256  3926233 allow tcp from me to any out via re1 uid squid keep-state
00600   552   199020 fwd 127.0.0.1,3129 tcp from 172.22.23.0/24 to any dst-port 80-83,8080-8088 out via re1 keep-state
Отправлено спустя 13 минут 47 секунд:
Да. И еще. Настраивал по вот этому мануалу http://itadept.ru/freebsd-squid/. Та вот там указано что при

Код: Выделить всё

grep ipfw /var/run/dmesg.boot
должно быть что-то похожее

Код: Выделить всё

ipfw2 (+ipv6) initialized, divert loadable, nat loadable, rule-based forwarding enabled, default to deny, logging disabled
У меня же вот так:

Код: Выделить всё

ipfw2 (+ipv6) initialized, divert enabled, nat enabled, default to accept, logging disabled
Не знаю для FreeBSD 10 это нормально? В ней же вроде форвардинг по умолчании в ядро вшит.

logout_90
мл. сержант
Сообщения: 72
Зарегистрирован: 2014-01-27 5:36:26

Прозрачный прокси

Непрочитанное сообщение logout_90 » 2015-05-06 15:35:05

Угу. даже опции про форвард при сборке ядра указывать не надо. Думаю, что косяк в правилах фаервола. Кофиг сквида то по сути стандартный. Более точно отвечу часа через 4, как до виртуальной машины доберусь, чтобы ситуацию эту сэмулировать.
Кстати, тут заметил одну вещь: А где правило разрешающее хождение трафика на внутреннем интерфейсе?

Rolandvi
рядовой
Сообщения: 10
Зарегистрирован: 2015-05-06 9:43:58

Прозрачный прокси

Непрочитанное сообщение Rolandvi » 2015-05-06 15:58:50

Заранее спасибо. Ipfw поправил. Сейчас так:

Код: Выделить всё

#!/bin/sh 

FwCMD="/sbin/ipfw"      
LanOut="re0"            # bee 
LanOut2="re1"           # stream 
LanIn="re2"             # Int 
IpOut="62.105.X.X"   # IP bee 
IpOut2="192.168.X.X"     # IP stream 
IpIn="172.22.23.3"    # Int IP 
NetIn="172.22.23.0/24"  # IntNet 

${FwCMD} -f flush 
${FwCMD} -f pipe flush 
${FwCMD} -f queue flush 
${FwCMD} -f table 0 flush

${FwCMD} table 0 add 172.22.23.58 

${FwCMD} add check-state 

${FwCMD} add allow ip from any to any via lo0 
${FwCMD} add deny ip from any to 127.0.0.0/8 
${FwCMD} add deny ip from 127.0.0.0/8 to any 
${FwCMD} add allow all from any to any via re2
${FwCMD} add allow tcp from me to any out via re1 keep-state uid squid
${FwCMD} add fwd 127.0.0.1,3129 tcp from 172.22.23.0/24 to any 80-83,8080-8088 out via re1 keep-state

#NAT_config 
${FwCMD} nat 1 config log if re1 same_ports reset unreg_only
#NAT1 
${FwCMD} add nat 1 ip from "table(0)" to any out via re1 
${FwCMD} add nat 1 ip from any to any in via re1 

logout_90
мл. сержант
Сообщения: 72
Зарегистрирован: 2014-01-27 5:36:26

Прозрачный прокси

Непрочитанное сообщение logout_90 » 2015-05-06 20:14:28

Добрался до виртуальных машин. ))
Итак. Простейшие правила для ipfw:

Код: Выделить всё

#!/bin/sh

fw="/sbin/ipfw -q"
net_in="192.168.1.0/24"
if_in="em1"
if_out="em0"


$fw flush

$fw add allow all from any to any via lo0
$fw add allow all from any to any via $if_in
$fw add allow all from me to any via $if_out

$fw add fwd 192.168.1.1,3129 tcp from 192.168.1.5 to any 80,8080

#$fw add allow all from any to any


$fw nat 1 config log if $if_out reset same_ports

$fw add nat 1 all from any to any via $if_out
конфиг сквида от дефолтного отличается только здесь:

Код: Выделить всё

# Squid normally listens to port 3128
http_port 3128
http_port 3129 transparent

visible_hostname squid1
Если все равно не пашет, проверьте, может ли клиентская машина связаться с dns сервером и получить корректный ответ (nslookup для винды). Также, проверьте access.log, чего то же ipfw стал заворачивать судя по логам? ))

Rolandvi
рядовой
Сообщения: 10
Зарегистрирован: 2015-05-06 9:43:58

Прозрачный прокси

Непрочитанное сообщение Rolandvi » 2015-05-06 20:39:25

Спасибо. Утром проверю. Отпишусь.

Аватара пользователя
wien
сержант
Сообщения: 151
Зарегистрирован: 2014-06-26 18:38:44
Откуда: DafaultCity
Контактная информация:

Прозрачный прокси

Непрочитанное сообщение wien » 2015-05-08 8:49:24

Во-первых, убедись, что у тебя squid собран с поддержкой ipfw:
squid -v

Код: Выделить всё

Squid Cache: Version 3.2.13
configure options:  '--with-default-user=squid' '--bindir=/usr/local/sbin' '--sbindir=/usr/local/sbin' '--datadir=/usr/local/etc/squid' '--libexecdir=/usr/local/libexec/squid' '--localstatedir=/var' '--sysconfdir=/usr/local/etc/squid' '--with-logdir=/var/log/squid' '--with-pidfile=/var/run/squid/squid.pid' '--with-swapdir=/var/squid/cache/squid' '--enable-auth' '--enable-build-info' '--enable-loadable-modules' '--enable-removal-policies=lru heap' '--disable-epoll' '--disable-linux-netfilter' '--disable-linux-tproxy' '--disable-translation' '--enable-auth-basic=DB MSNT MSNT-multi-domain NCSA PAM POP3 RADIUS  fake getpwnam SASL NIS' '--enable-auth-digest=file' '--enable-external-acl-helpers=file_userip unix_group' '--enable-auth-negotiate=kerberos wrapper' '--enable-auth-ntlm=fake smb_lm' '--enable-storeio=diskd rock ufs aufs' '--enable-disk-io=AIO Blocking DiskDaemon IpcIo Mmapped DiskThreads' '--enable-log-daemon-helpers=file' '--enable-url-rewrite-helpers=fake' '--disable-ipv6' '--enable-delay-pools' '--enable-ssl' '--with-openssl=/usr' '--enable-htcp' '--enable-forw-via-db' '--disable-cache-digests' '--enable-wccp' '--enable-wccpv2' '--enable-eui' '--enable-ipfw-transparent' '--disable-pf-transparent' '--disable-ipf-transparent' '--disable-follow-x-forwarded-for' '--disable-ecap' '--disable-icap-client' '--disable-esi' '--enable-kqueue' '--with-large-files' '--prefix=/usr/local' '--mandir=/usr/local/man' '--infodir=/usr/local/info/' '--build=i386-portbld-freebsd9.2' 'build_alias=i386-portbld-freebsd9.2' 'CC=cc' 'CFLAGS=-O2 -pipe -I/usr/local/include -I/usr/include -fno-strict-aliasing' 'LDFLAGS= -L/usr/local/lib -pthread -Wl,-rpath,/usr/lib:/usr/local/lib -L/usr/lib' 'LIBS=' 'CPPFLAGS=-I/usr/local/include' 'CXX=c++' 'CXXFLAGS=-O2 -pipe -I/usr/local/include -I/usr/include -fno-strict-aliasing' 'CPP=cpp'
Обращаю внимание на наличие опции --enable-ipfw-transparent

Во-вторых, порт 3129 использовать совершенно необязательно, оно и так проксится прозрачно при должном конфиге сквида(выдержка из конфига своего боевого севрера):

Код: Выделить всё

# Squid normally listens to port 3128
http_port 10.0.0.1:3128  # меняешь ип на свой
http_port localhost:3128 transparent
и ipfw(снова с боевой машины):

Код: Выделить всё

# отправляем всех на squid (в данном случае - прокси прозрачный)
${FwCMD} add 230 fwd 127.0.0.1,3128 tcp from ${NetIn}/${NetMask} to any 80 via ${LanOut}

# пропускаем траффик через трансляцию сетевых адресов (NAT); reset - смена IP адреса
# после его обновления, deny_in - предписывает запрет пропускать через nat входящие пакеты для которых нет
# совпадения во внутренней таблице активных соединений, или же нет совпадения с другими правил демаскировки
${FwCMD} nat 1 config log if ${LanOut} reset same_ports
${FwCMD} add 240 nat 1 ip from ${NetIn}/${NetMask} to any out via ${LanOut}
${FwCMD} add 250 nat 1 ip from any to ${IpOut} in via ${LanOut}
Обращаю внимание, что правило форварда на прокси должно быть выше ната.

Rolandvi
рядовой
Сообщения: 10
Зарегистрирован: 2015-05-06 9:43:58

Прозрачный прокси

Непрочитанное сообщение Rolandvi » 2015-05-08 14:36:22

Спасибо всем. Все заработало со следующими конфигами.
Squid:

Код: Выделить всё

#Адрес и порт для входящих подключений
#При прозрачном проксировании может использоваться для управления кэшем
http_port 3128 
#Локальный интерфейс, для трафика, перенаправленного брандмауэром
http_port 127.0.0.1:3129 intercept
Дальше не продолжаю и так понятно, что ничего не менялось )))
И собственно говоря ipfw

Код: Выделить всё

#!/bin/sh 

FwCMD="/sbin/ipfw"      
LanOut="re0"            # bee 
LanOut2="re1"           # stream 
LanIn="re2"             # Int 
IpOut="62.105.X.X"   # IP bee 
IpOut2="192.168.X.X"     # IP stream 
IpIn="172.22.23.3"    # Int IP 
NetIn="172.22.23.0/24"  # IntNet 

${FwCMD} -f flush 
${FwCMD} -f pipe flush 
${FwCMD} -f queue flush 
${FwCMD} -f table 0 flush

${FwCMD} table 1 add 172.22.23.58
${FwCMD} table 2 add 172.22.23.22

${FwCMD} add check-state 

${FwCMD} add allow ip from any to any via lo0 
${FwCMD} add deny ip from any to 127.0.0.0/8 
${FwCMD} add deny ip from 127.0.0.0/8 to any 
${FwCMD} add allow all from any to any via re2
#${FwCMD} add allow all from me to any via re1
#${FwCMD} add allow ip from any to any

${FwCMD} add allow tcp from me to any out via re1 keep-state uid squid
${FwCMD} add fwd 127.0.0.1,3129 tcp from "table(2)" to any 80-83,8080-8088 out via re1


#NAT_config 
${FwCMD} nat 1 config log if re1 same_ports reset unreg_only
#NAT1 
${FwCMD} add nat 1 ip from "table(1)" to any out via re1 
${FwCMD} add nat 1 ip from any to any in via re1 
Юзеров вывел в отдельную таблицу. Их у меня не шибко много, поэтому всем остальным вообще кислород перекрыл. Дело было в том, что человеческий мозг имеет особенность тупить, конкретно в этом случае на серваке не был поднят DNS, хотя здесь тогда встает вопрос - почему при DNS 8.8.8.8 у клиентов непрозрачный squid работал, причем с приведенными работающими выше конфигами W7 проглатывала 8.8.8.8 и начинала ходить по прозрачному прокси, а вот XP с 8.8.8.8 ходил только по непрозрачному.