LinuxForum.Fans
Тема

Как пустить squid через другой squid

Автор: Tiarasu 12 сообщений 3068 просмотров
18.09.2014 09:44 #392974

День добрый. Ситуация следующая.
Есть отдельно стоящий компьютер, ip 10.10.0.3/24, gateway 10.10.0.2. Больше на нем ничего не настроено, ни dns, ни proxy, только эти параметры.
Этим интерфейсом он смотрит на сервер с установленным Squid. У Squid две сетевые карты - одна ip 10.10.0.2/24, вторая 192.168.1.222/22, смотрит в локальную сеть с интернетом и вторым Squid в ней.
Вот squid.conf

text

dns_nameservers 192.168.0.122 192.168.0.10
dns_v4_first on
shutdown_lifetime 10 seconds
coredump_dir /usr/local/squid
visible_hostname serv.altest.net
tcp_outgoing_address 192.168.1.222
cache_peer 192.168.0.162 parent 3128 0 proxy-only no-query default
never_direct allow all
#ICAP SECTION
icap_enable on
icap_service_failure_limit 500
icap_service_revival_delay 30
icap_service Zgate_ICAP_Proxy reqmod_precache bypass=0 icap://192.168.0.231:1344/reqmod
icap_service Zgate_ICAP_Logger respmod_precache routing=1 icap://192.168.0.231:1344/respmod
icap_send_client_ip on
icap_send_client_username on
adaptation_service_set class_proxy Zgate_ICAP_Proxy
adaptation_service_set class_logger Zgate_ICAP_Logger
adaptation_access class_proxy allow all
adaptation_access class_logger allow all
#HTTPS SECTION
http_port 3128 ssl-bump cert=/usr/local/etc/squid/root.cer key=/usr/local/etc/squid/root.key generate-host-certificates=on
ssl_bump client-first all
always_direct allow all
sslproxy_cert_error allow all

#CACHE SETTINGS acl QUERY urlpath_regex cgi-bin \\? no_cache deny !QUERY cache_dir ufs /usr/local/squid/cache 3000 16 256 maximum_object_size 320 MB quick_abort_min 5 MB

#ACCESS CONTROL LISTS!

acl localnet src 192.168.0.0/22 acl localnet src 10.10.0.0/24 acl CONNECT method CONNECT acl BlockSite dstdomain .woman.ru acl BlockSite dstdomain .odnoklassniki.ru http_access allow manager localhost http_access deny to_localhost http_access deny all BlockSite http_access allow localnet http_reply_access allow all debug_options 93,5 refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 refresh_pattern . 0 20% 4320

Если я не ошибаюсь, опции cache_peer и never_direct должны перенаправлять на второй squid (192.168.0.162). Для проверки на втором Squid заблокировал сайт rbc.ru. К сожалению, клиентский хост на rbc пускает, следовательно, он идет не через второй Squid, а напрямую.
На втором Squid'e ничего не менял, кроме ip и хоста. Если прописывать второй Squid в браузере в качестве прокси - интернет раздает, rbc блокирует.

FreeBSD 10.0, Squid 3.3.11.

Что я делаю не так?

18.09.2014 09:59 · отредактировано #392975

Елси честно я вообще ничего не понял ))))
Есть отдельно стоящий компьютер, ip 10.10.0.3/24, gateway 10.10.0.2. (его шлюз это комп с 2 сетевыми (192.168.1.222 10.10.0.2) так? )
Вам надо копм с ip 0.10.0.3/24 на прокси завернуть (192.168.1.222 т.е. на его шлюз)?
%) %) %) %) %)

Если я вас правильно понял, то http://habrahabr.ru/post/28063/

18.09.2014 10:35 #392983
"GoUpInSmoke" написал:
Есть отдельно стоящий компьютер, ip 10.10.0.3/24, gateway 10.10.0.2. (его шлюз это комп с 2 сетевыми (192.168.1.222 10.10.0.2) так? )

Так!
И мне надо, чтобы Squid на шлюзе 192.168.1.222 ходил в инет через другой Squid на другом компе, с адресом 192.168.0.162.
В предложенной Вами статье, насколько я понял, это выполняется добавлением в squid.conf строк: cache_peer и never_direct allow all . Эти строки, немного изменив, я добавил в свой squid.conf.
К сожалению, ничего не изменилось. Дочерний squid все так же выпускает в интернет, а на родительском access.log чистый, там вообще ничего нет. Соответственно, дочерний выпускает напрямую.
Смутила настройка IPTABLES в статье.

text

iptables -N proxy
iptables -A proxy -j REJECT
iptables -I proxy -s 192.168.1.2 -j ACCEPT
iptables -I INPUT -p tcp --dport 8080 -j proxy

У меня IPFW, я там вроде ничего не настраивал.

18.09.2014 11:02 #392988

На сколько я знаю у Squid есть опция в которой указывается родительский прокси. Поищите её в squid.conf. И вот http://linuxforum.ru/viewtopic.php?id=14609

18.09.2014 11:10 #392990

Есть эта опция. И тему я эту тоже читал.

"Yuriy2005" написал:
cache_peer 192.168.10.5 parent 3128 0 proxy-only
cache_peer_domain 192.168.10.5 parent.domain
cache_peer_access 192.168.10.5 allow all
При такой конфиге все работает, т.е. ВСЕ попадают на родительский проски и все идет замечательно, но мне требуется ограничить доступ и когда я делаю вот так

И совершенно точно так же добавил себе в squid.conf эти строки.

text

cache_peer 192.168.0.162 parent 3128 0 no-query default no-digest no-netdb-exchange
cache_peer_domain 192.168.0.162 Squid01
cache_peer_access 192.168.0.162 allow all
never_direct allow all

Но все равно, access.log на родительской прокси пуст, интернет работает как то без него.
Не могу понять, почему так?

18.09.2014 11:38 #392997

права на лог файл?

18.09.2014 11:44 #392998
"GoUpInSmoke" написал:
права на лог файл?

По умолчанию.
-rw-r----- 1 squid squid 1 Sep 18 09:38 access.log
Кроме того, на родительской прокси я для эксперимента заблокировал rbc.ru. Если я указываю на какой-либо машинке в сети адрес родительского прокси в свойствах браузера - он его блокирует. Когда иду через дочерний прокси - пускает, следовательно - дочерний прокси не идет через родительский. Ну или я чего-то не понимаю.

18.09.2014 11:46 · отредактировано #393002

прокси прозоачный на второй машине? в iptables и squid.conf указано что он прозрачный?

18.09.2014 11:57 · отредактировано #393004
"GoUpInSmoke" написал:
в iptables и squid.conf указано что он прозрачный?

На родительской или дочерней?
У меня FreeBSD, поэтому вместо iptables пользуюсь ipfw. Но как в ipfw указать, что прокси прозрачный - я не в курсе.
Кроме того, чтобы сделать прозрачный прокси, надо в squid.conf в разделе http_port добавить intercept. Только когда я так делаю, браузер говорит "доступ запрещен".
acces.log дочернего вот:

text

1411026960.368      3 192.168.1.222 TCP_MISS/403 5226 GET http://www.google.ru/url? - HIER_NONE/- text/html
1411026960.372     12 192.168.0.231 TCP_MISS/403 5298 GET http://www.google.ru/url? - HIER_DIRECT/192.168.1.222 text/html
1411026960.463      3 192.168.1.222 TCP_MISS/403 4467 GET http://www.squid-cache.org/Artwork/SN.png - HIER_NONE/- text/html
1411026960.468     12 192.168.0.231 TCP_MISS/403 4539 GET http://www.squid-cache.org/Artwork/SN.png - HIER_DIRECT/192.168.1.222 text/html
1411026961.210      0 192.168.0.231 NONE/409 3846 CONNECT mail.google.com:443 - HIER_NONE/- text/html
1411026962.270      0 10.10.0.3 NONE/409 3825 CONNECT jim43.mail.ru:443 - HIER_NONE/- text/html
1411026971.922      0 10.10.0.3 NONE/409 3831 CONNECT mail.google.com:443 - HIER_NONE/- text/html

Access.log родительского по прежнему чист.

На всякий случай, в squid.conf родительского прокси есть строки:

text

acl localnet src 192.168.0.0/22
acl localnet src 10.10.0.0/24

Которые, по идее, разрешают подключение из моих сетей.

Полез в cache.log, который оказался полон сообщений типа "SECURITY ALERT: Host header forgery detected on local=192.168.1.222:3128 remote=192.168.0.231:54302 FD 20 flags=33 (intercepted port does not match 443)"

18.09.2014 16:32 · отредактировано #393035

Весь день игрался с форвардингом. После пробы целой кучи различных конфигураций заработало следующее:
Внес изменения в squid.conf:

text

http_port 127.0.0.1:3129
http_port 127.0.0.1:3128 intercept ssl-bump cert=/usr/local/etc/squid/root.cer key=/usr/local/etc/squid/root.key generate-host-certificates=on

Во первых, для прозрачного проксирования нужен еще один порт, как оказалось. Во вторых, теперь он слушает 3128 не на всех интерфейсах, а на 127.0.0.1, на который будем форвардить через IPFW.
Ну и добавил правила в таблицу форвардинга:

text

00100   566  582266 allow ip from any to any via lo0
00109    43    6610 allow tcp from me to any out via igb0 uid squid keep-state
00110   257  125561 allow tcp from me to any out via igb1 uid squid keep-state
00120    12    3055 fwd 127.0.0.1,3128 tcp from 10.10.0.3 to any via igb1
00200     0       0 deny ip from any to 127.0.0.0/8
00300     0       0 deny ip from 127.0.0.0/8 to any
00400     0       0 fwd 192.168.1.222,3128 tcp from any to any dst-port 80 in recv igb0
00500 79597 8868664 allow ip from any to any

И таки да, пошел форвардинг. Squid ловит пакеты в прозрачном режиме.
К сожалению, система выдает результат "Connection refused". В логах нечто необъяснимое:

text

2014/09/18 16:37:35.757 kid1| SECURITY ALERT: Host header forgery detected on local=10.10.0.2:3128 remote=10.10.0.3:2351 FD 27 flags=33 (intercepted port does not match 443)
2014/09/18 16:37:35.757 kid1| SECURITY ALERT: By user agent: Mozilla/5.0 (Windows NT 5.1; rv:32.0) Gecko/20100101 Firefox/32.0
2014/09/18 16:37:35.757 kid1| SECURITY ALERT: on URL: snippets.mozilla.com:443
2014/09/18 16:37:35.757 kid1| abandoning local=10.10.0.2:3128 remote=10.10.0.3:2351 FD 27 flags=33

Пытаюсь понять, почему.

19.09.2014 15:51 #393117

Война со Squid'ом продолжается.
Переделал конфиг в сторону прозрачности:

text

dns_nameservers 192.168.0.122 192.168.0.10
 
dns_v4_first on
 
shutdown_lifetime 10 seconds
 
coredump_dir /usr/local/squid
 
 
log_mime_hdrs off
 
visible_hostname serv.altest.net
 
icap_enable on
icap_service_failure_limit 500
icap_service_revival_delay 30
icap_service Zgate_ICAP_Proxy reqmod_precache bypass=0 icap://192.168.0.231:1344/reqmod
icap_service Zgate_ICAP_Logger respmod_precache routing=1 icap://192.168.0.231:1344/respmod
icap_send_client_ip on
icap_send_client_username on
adaptation_service_set class_proxy Zgate_ICAP_Proxy
adaptation_service_set class_logger Zgate_ICAP_Logger
adaptation_access class_proxy allow all
adaptation_access class_logger allow all
 
 
http_port 127.0.0.1:3128 intercept ssl-bump cert=/usr/local/etc/squid/root.cer key=/usr/local/etc/squid/root.key generate-host-certificates=on
http_port 127.0.0.1:3129 intercept
ssl_bump client-first all
sslproxy_cert_error allow all
sslproxy_flags DONT_VERIFY_PEER
 
acl QUERY urlpath_regex cgi-bin \\?
no_cache deny !QUERY
cache_dir ufs /usr/local/etc/squid/cache 3000 16 256
maximum_object_size 320 MB
quick_abort_min 5 MB
 
 
acl localnet src 192.168.0.0/22
 
acl localnet src 10.10.0.0/24
 
acl CONNECT method CONNECT
 
acl BlockSite dstdomain .woman.ru
 
acl BlockSite dstdomain .odnoklassniki.ru
 
http_access allow manager localhost
 
http_access deny to_localhost
 
http_access deny all BlockSite
 
http_access allow localnet
 
http_reply_access allow all
 
cache_peer 192.168.0.162 parent 3128 0 no-query default no-digest no-netdb-exchange
never_direct allow all
 
 
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320

Добавил правила на IPFW, чтобы входящий трафик кидался на порты Squid

text

root@serv1:/usr/ports/www/squid33 # ipfw show
00100    17     680 allow ip from any to any via lo0
00110 12915 8932200 allow tcp from me to any out via igb0 uid squid keep-state
00120  1679  118329 allow tcp from me to any out via igb1 uid squid keep-state
00126   128   17316 fwd 127.0.0.1,3129 tcp from 10.10.0.3 to any dst-port 80-83,8080-8088 via igb1
00127  1484   61879 fwd 127.0.0.1,3128 tcp from 10.10.0.3 to any dst-port 443 via igb1
00130    43    3479 fwd 127.0.0.1,3128 tcp from 192.168.0.231 to any dst-port 443 via igb0
00131   395   47516 fwd 127.0.0.1,3129 tcp from 192.168.0.231 to any dst-port 80,8080-8088 via igb0
00200     0       0 deny ip from any to 127.0.0.0/8
00300     0       0 deny ip from 127.0.0.0/8 to any
00500 51380 5482565 allow ip from any to any
00600     0       0 allow ipv6-icmp from :: to ff02::/16
00700     0       0 allow ipv6-icmp from any to any ip6 icmp6types 2,135,136
65000     0       0 allow ip from any to any
65535     0       0 allow ip from any to any

http-трафик проксируется, все работает. При попытке подключиться по https вылезает "Прокси-сервер отказывается принимать соединения", в cache.log сидит вот такая ошибка:

text

2014/09/19 15:46:45.131 kid1| SECURITY ALERT: Host header forgery detected on local=192.168.1.222:443 remote=192.168.0.231:56506 FD 29 flags=33 (local IP does not match any domain IP)
2014/09/19 15:46:45.131 kid1| SECURITY ALERT: By user agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0
2014/09/19 15:46:45.131 kid1| SECURITY ALERT: on URL: online.sberbank.ru:443
2014/09/19 15:46:45.131 kid1| abandoning local=192.168.1.222:443 remote=192.168.0.231:56506 FD 29 flags=33

Нашел статью по этой проблеме, но так и не понял, как лечить http://wiki.squid-cache.org/KnowledgeBase/HostHeaderForgery
Подскажите, может кто сталкивался?

25.09.2014 10:59 #393763

В общем, добился полностью прозрачного Squid'a, с генерацией самоподписанных SSL, которые вполне себе жуют большинство сайтов, работающих по HTTPS.
Примерно разобрался, как выпустить Squid через parrent proxy.
Вот кусок Squid.conf, отвечающий за parrent proxy:

text

cache_peer 192.168.0.162 parent 8080 0 ssl no-query default no-digest no-netdb-exchange originserver
cache_peer_access 192.168.0.162 allow all
never_direct allow all

К сожалению, пока не осилил, как подружить два Squid'a через SSl.
В cache.log дочернего Squid'a вылезает ошибка:

text

2014/09/25 06:25:00 kid1| fwdNegotiateSSL: Error negotiating SSL connection on FD 13: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol (1/-1/0)
2014/09/25 06:25:00 kid1| TCP connection to 192.168.0.162/8080 failed

Аналогичная ошибка вылезает и в браузере:

text

(92) Protocol error (TLS code: SQUID_ERR_SSL_HANDSHAKE)
Handshake with SSL server failed: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol

В связи в этим вопрос - какие сертификаты надо подсовывать родительскому Squid'у, если надо именно это?
Или настроить ему точно такую же SSL-генерацию как и дочернему?

На всякий случай, вот куски конфигов, описывающие генерацию SSL:
Дочерний squid:

text

#HTTPS SECTION
https_port 127.0.0.1:3128 intercept ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/usr/local/etc/squid/ssl/squid.pem key=/usr/local/etc/squid/ssl/root.key
http_port 127.0.0.1:3129 intercept
http_port 3130
ssl_bump server-first all
sslproxy_cert_error allow all
sslproxy_flags DONT_VERIFY_PEER
sslcrtd_program /usr/local/libexec/squid/ssl_crtd -s /usr/local/etc/squid/ssl/ssl_db -M 4MB

Родительский squid:

text

#HTTPS SECTION
http_port 8080 ssl-bump cert=/usr/local/etc/squid/root.cer key=/usr/local/etc/squid/root.key generate-host-certificates=on
ssl_bump client-first all
sslproxy_cert_error allow all
 

Из одинакового у них только ключевой сертификат root.key

Сорри, раньше с сертификацией особо сталкиваться не приходилось.

Войдите или зарегистрируйтесь, чтобы ответить.