The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"FreeBSD, squid & TPROXY"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Настройка Squid и других прокси серверов (Прозрачный proxy)
Изначальное сообщение [ Отслеживать ]

"FreeBSD, squid & TPROXY"  +/
Сообщение от Mackfh (ok) on 17-Май-15, 20:05 
Доброго времени суток, читатель!
Обращаюсь к тебе с проблемой в надежде обрести немного помощи. Суть такова:
Есть FreeBSD 10.1 с тремя интерфейсами, два из которых объединены в мост без адреса. Интерфейсы также без адресов. Третий - с адресом, для О&М нужд. Стоит сквид 3.5.4 в режиме TPROXY. Не получается направить на него HTTP-траффик. Правила ipfw использую такие:

ipfw add 1100 fwd 127.0.0.1,8080 log ip from any to any 80 in recv bge0
ipfw add 1101 fwd 127.0.0.1 log ip from any 80 to any in recv bge1

В итоге счетчки растут:

01100   56  10370 fwd 127.0.0.1,8080 log logamount 50 ip from any to any dst-port 80 in recv bge0
01101   44  33438 fwd 127.0.0.1 log logamount 50 ip from any 80 to any in recv bge1

Логи пигшутся:

May 17 19:46:02 squid kernel: ipfw: 1100 Forward to 127.0.0.1:8080 TCP 192.168.1.10:13944 192.168.1.20:80 in via bge0
May 17 19:46:02 squid kernel: ipfw: 1101 Forward to 127.0.0.1 TCP 192.168.1.20:80 192.168.1.10:13944 in via bge1

А на сквиде - пусто. Если застопить сквид, то ничего не меняется, следовательно все идет мимо. В этом вся проблема.

В качестве предыстории расскажу, что сначала пробовал запустить intercept с использованием pf - все заработало, когда присвоил адрес мосту (интерфейсы без адресов), но, естественно, подменяло адрес источника, чего мне не надо. Поэтому перешел к режиму tproxy.

Итак, конфиг сквида:

acl localnet src 192.168.0.0/16        # RFC1918 possible internal network

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 deny !Safe_ports
http_access deny CONNECT !SSL_ports

acl manager url_regex -i ^cache_object:// /squid-internal-mgr/
http_access allow localhost manager
http_access deny manager

http_access allow localnet
http_access allow localhost
http_access deny all

http_port 3128
http_port 127.0.0.1:8080 tproxy

refresh_pattern ^ftp:         &n... 1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
#refresh_pattern .               0       20%     43200 override-lastmod reload-into-ims
refresh_pattern .               0       20%     4320

debug_options ALL,1 0,9 5,9  11,9 17,9 73,9 76,9 89,9 22,3 3,3 28,9

logformat squid %{%Y.%m.%d %H:%M:%S %z}tl %6tr %>a %Ss/%03>Hs %<st %rm %ru %un %Sh/%<A %mt
access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log


В кеш логе на старте:

2015/05/17 20:03:49.015 kid1| Accepting TPROXY intercepted HTTP Socket connections at local=127.0.0.1:8080 remote=[::] FD 17 flags=25

squid -v:

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' '--without-gnutls' '--enable-auth' '--enable-build-info' '--enable-loadable-modules' '--enable-removal-policies=lru heap' '--disable-epoll' '--disable-linux-netfilter' '--disable-linux-tproxy' '--disable-translation' '--disable-arch-native' '--disable-eui' '--disable-cache-digests' '--disable-delay-pools' '--disable-ecap' '--disable-esi' '--disable-follow-x-forwarded-for' '--enable-htcp' '--disable-icap-client' '--disable-icmp' '--enable-ident-lookups' '--disable-ipv6' '--enable-kqueue' '--with-large-files' '--disable-http-violations' '--without-nettle' '--enable-snmp' '--disable-ssl' '--disable-ssl-crtd' '--disable-stacktraces' '--disable-ipf-transparent' '--enable-ipfw-transparent' '--disable-pf-transparent' '--with-nat-devpf' '--disable-forw-via-db' '--disable-wccp' '--disable-wccpv2' '--with-heimdal-krb5=/usr' 'CFLAGS=-I/usr/include -O2 -pipe  -fstack-protector -fno-strict-aliasing' 'LDFLAGS=-L/usr/lib  -pthread -fstack-protector' 'LIBS=-lkrb5 -lgssapi -lgssapi_krb5 ' '--enable-auth-basic=DB SMB_LM MSNT-multi-domain NCSA PAM POP3 RADIUS fake getpwnam' '--enable-auth-digest=file' '--enable-external-acl-helpers=file_userip time_quota unix_group' '--enable-auth-negotiate=kerberos wrapper' '--enable-auth-ntlm=fake smb_lm' '--enable-storeio=ufs aufs diskd' '--enable-disk-io=AIO Blocking IpcIo Mmapped DiskThreads DiskDaemon' '--enable-log-daemon-helpers=file' '--enable-url-rewrite-helpers=fake' '--enable-storeid-rewrite-helpers=file' '--prefix=/usr/local' '--mandir=/usr/local/man' '--infodir=/usr/local/info/' '--build=amd64-portbld-freebsd10.1' 'build_alias=amd64-portbld-freebsd10.1' 'CC=cc' 'CPPFLAGS=' 'CXX=c++' 'CXXFLAGS=-O2 -pipe -fstack-protector -fno-strict-aliasing ' 'CPP=cpp' '--enable-ltdl-convenience'

В /etc/rc.conf лежит следующее:

hostname="squid"
sshd_enable="YES"
# Set dumpdev to "AUTO" to enable crash dumps, "NO" to disable
dumpdev="AUTO"
zfs_enable="YES"

background_fsck="NO"

defaultrouter="10.16.0.1"
ifconfig_bge3="inet 10.16.2.165/22"

cloned_interfaces="bridge0"
ifconfig_bridge0="addm bge0 addm bge1 up"
ifconfig_bge0="up"
ifconfig_bge1="up"

firewall_enable="YES"
firewall_type="open"
firewall_logging="YES"

squid_enable="YES"
squid_user="root"


В процессе тестов правила ipfw добавляю вручную. Получается так:

00100     0       0 allow ip from any to any via lo0
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 deny ip from any to ::1
00500     0       0 deny ip from ::1 to any
00600     0       0 allow ipv6-icmp from :: to ff02::/16
00700     0       0 allow ipv6-icmp from fe80::/10 to fe80::/10
00800     0       0 allow ipv6-icmp from fe80::/10 to ff02::/16
00900     0       0 allow ipv6-icmp from any to any ip6 icmp6types 1
01000     0       0 allow ipv6-icmp from any to any ip6 icmp6types 2,135,136
01100    82    8498 fwd 127.0.0.1,8080 log logamount 50 ip from any to any dst-port 80 in recv bge0
01101    56   30724 fwd 127.0.0.1 log logamount 50 ip from any 80 to any in recv bge1
65000 17790 1820248 allow ip from any to any
65535     0       0 deny ip from any to any

Ну и sysctl -a | grep forward:

kern.smp.forward_signal_enabled: 1
net.inet.ip.forwarding: 1
net.inet.ip.fastforwarding: 0
net.inet6.ip6.forwarding: 0

kldstat:

Id Refs Address            Size     Name
1   16 0xffffffff80200000 17627c8  kernel
2    1 0xffffffff81963000 2f94a0   zfs.ko
3    2 0xffffffff81c5d000 6040     opensolaris.ko
4    1 0xffffffff81e11000 939c     if_bridge.ko
5    1 0xffffffff81e1b000 53f8     bridgestp.ko
6    1 0xffffffff81e21000 11460    ipfw.ko

Гуглил очень долго, ориентировался в первую очередь на: http://www.opennet.dev/openforum/vsluhforumID12/7113.html
Подскажите, пожалуйста, что я делаю не так? Использование ipfw мне не принципиально, остальное важно.

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "FreeBSD, squid & TPROXY"  +1 +/
Сообщение от Alexander Sheiko on 18-Май-15, 13:17 

> Стоит сквид 3.5.4 в режиме TPROXY. Не получается направить
> на него HTTP-траффик.

Попробуйте в обоих правилах завернуть не на карту, а на бридж.

Вот пример с рабочей машины, но с адресами на интерфейсах и машине в режиме шлюза:

02200  1633882   148647998 fwd 127.0.0.1,3129 tcp from any to not table(50) dst-port 80 in via em1.28[012]
02300  2405033  2953350745 fwd 127.0.0.1 tcp from not table(50) 80 to not me in via em0

В table(50) перечислены локальные ресурсы. em0 смотрит в мир, em1.28[012] - три VLAN для трёх локальный интерфесов.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "FreeBSD, squid & TPROXY"  +/
Сообщение от Mackfh (ok) on 20-Май-15, 14:59 
>[оверквотинг удален]
>> на него HTTP-траффик.
> Попробуйте в обоих правилах завернуть не на карту, а на бридж.
> Вот пример с рабочей машины, но с адресами на интерфейсах и машине
> в режиме шлюза:
> 02200  1633882   148647998 fwd 127.0.0.1,3129 tcp from any to
> not table(50) dst-port 80 in via em1.28[012]
> 02300  2405033  2953350745 fwd 127.0.0.1 tcp from not table(50) 80
> to not me in via em0
> В table(50) перечислены локальные ресурсы. em0 смотрит в мир, em1.28[012] - три
> VLAN для трёх локальный интерфесов.

Спасибо за совет, но, к сожалению, тоже не вышло. Пробовал даже явно указывать тестовый комп, но все то же самое - счетчики растут, на сквид ничего не приходит:

01100   19   1239 fwd 127.0.0.1,8080 log logamount 50 ip from 192.168.1.10 to any dst-port 80 via bridge0
01101   71 105027 fwd 127.0.0.1 log logamount 50 ip from any 80 to 192.168.1.10 via bridge0


Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "FreeBSD, squid & TPROXY"  +/
Сообщение от Alexander Sheiko on 20-Май-15, 15:38 
> Спасибо за совет, но, к сожалению, тоже не вышло. Пробовал даже явно
> указывать тестовый комп, но все то же самое - счетчики растут,
> на сквид ничего не приходит

Не совсем понятно. Интернет у клиентов работает или нет? Т.е. - пакеты проходят дальше или режутся при завороте на прокси.

А gateway в системе включён?

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "FreeBSD, squid & TPROXY"  +/
Сообщение от Mackfh (ok) on 21-Май-15, 08:52 
>> Спасибо за совет, но, к сожалению, тоже не вышло. Пробовал даже явно
>> указывать тестовый комп, но все то же самое - счетчики растут,
>> на сквид ничего не приходит
> Не совсем понятно. Интернет у клиентов работает или нет? Т.е. - пакеты
> проходят дальше или режутся при завороте на прокси.
> А gateway в системе включён?

В итоге интернет работает, даже не режется. Если выключаю сквид, ничего не меняется.

Дефолтный гейтвей на 3 интерфейсе:
Internet:
Destination        Gateway            Flags      Netif Expire
default            10.16.0.1          UGS        bge3

Пробовал его выключать, подменял гейтвей - ничего не меняется.

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "FreeBSD, squid & TPROXY"  +/
Сообщение от Alexander Sheiko on 21-Май-15, 15:18 
> В итоге интернет работает, даже не режется. Если выключаю сквид, ничего не
> меняется.

Понятно. Первое, что стоит сделать - поискать классическую настройку прокси на бридже во FreeBSD в обычном (не tproxy) режиме. Там разница лишь в спуффинге адресов (что делает Squid) и разрешении ОС спуфить адреса из под обычного пользователя (что делают патчи ядра). Больше разницы нет.

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "FreeBSD, squid & TPROXY"  +/
Сообщение от Mackfh (ok) on 21-Май-15, 23:44 
>> В итоге интернет работает, даже не режется. Если выключаю сквид, ничего не
>> меняется.
> Понятно. Первое, что стоит сделать - поискать классическую настройку прокси на бридже
> во FreeBSD в обычном (не tproxy) режиме. Там разница лишь в
> спуффинге адресов (что делает Squid) и разрешении ОС спуфить адреса из
> под обычного пользователя (что делают патчи ядра). Больше разницы нет.

Я так и сделал. Выше писал, что запустил squid в intercept с помощью pf - все получилось.

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

7. "FreeBSD, squid & TPROXY"  +/
Сообщение от Alexander Sheiko on 22-Май-15, 03:18 
> Я так и сделал. Выше писал, что запустил squid в intercept с
> помощью pf - все получилось.

Попробуйте вот так:

http://rejik.ru/bb_rus/viewtopic.php?f=1&t=903#p4657

Кто-то рекомендовал этот вариант как раз для одного интерфеса. Дополнительно указан номер порта и направление in / out.

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

8. "FreeBSD, squid & TPROXY"  +/
Сообщение от Mackfh (ok) on 22-Май-15, 09:59 
>> Я так и сделал. Выше писал, что запустил squid в intercept с
>> помощью pf - все получилось.
> Попробуйте вот так:
> http://rejik.ru/bb_rus/viewtopic.php?f=1&t=903#p4657
> Кто-то рекомендовал этот вариант как раз для одного интерфеса. Дополнительно указан номер
> порта и направление in / out.

Спасибо! Но там у него TPROXY уже работает изначально. А правила

# Default rule to transparent proxy
${fwcmd} add 020 fwd 127.0.0.1,3128 tcp from any to not me 80 in via ${if}
# Catch the packets that come back using the clients IPs
${fwcmd} add 030 fwd 127.0.0.1,3128 tcp from not me 80 to any in via ${if}

аналогичны моим

01100   19   1239 fwd 127.0.0.1,8080 log logamount 50 ip from 192.168.1.10 to any dst-port 80 via bridge0
01101   71 105027 fwd 127.0.0.1 log logamount 50 ip from any 80 to 192.168.1.10 via bridge0

Хотя я попробую их привести к такому же виду на всякий случай.

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

9. "FreeBSD, squid & TPROXY"  +/
Сообщение от Alexander Sheiko on 22-Май-15, 13:24 
> А правила
> аналогичны моим

У Вас направление не указано. Его всегда стоит указывать, чтобы всё было однозначно.

Ответить | Правка | ^ к родителю #8 | Наверх | Cообщить модератору

10. "FreeBSD, squid & TPROXY"  +/
Сообщение от Mackfh (ok) on 26-Май-15, 13:45 
>> А правила
>> аналогичны моим
> У Вас направление не указано. Его всегда стоит указывать, чтобы всё было
> однозначно.

Хм. Не сработало:

01100     0       0 fwd 127.0.0.1,8080 log logamount 50 tcp from 192.168.1.10 to any dst-port 80 in via bridge0
01101     0       0 fwd 127.0.0.1 log logamount 50 tcp from any 80 to 192.168.1.10 in via bridge0

Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

11. "FreeBSD, squid & TPROXY"  +/
Сообщение от Mackfh (ok) on 26-Май-15, 17:22 
> Доброго времени суток, читатель!
> Обращаюсь к тебе с проблемой в надежде обрести немного помощи. Суть такова:
> Есть FreeBSD 10.1 с тремя интерфейсами, два из которых объединены в мост
> без адреса. Интерфейсы также без адресов. Третий - с адресом, для
> О&М нужд. Стоит сквид 3.5.4 в режиме TPROXY. Не получается направить
> на него HTTP-траффик.
> Гуглил очень долго, ориентировался в первую очередь на: http://www.opennet.dev/openforum/vsluhforumID12/7113.html
> Подскажите, пожалуйста, что я делаю не так? Использование ipfw мне не принципиально,
> остальное важно.

Попробовал другой подход. Использовал Нетграф:

#!/bin/sh
kldload -v ng_ether
kldload -v ng_bpf
kldload -v ng_eiface
ngctl mkpeer bge0: bpf lower bge0-lower
ngctl name bge0:lower br-bpf
ngctl connect bge0: br-bpf: upper bge0-upper
ngctl connect bge1: br-bpf: lower bge1-lower
ngctl connect bge1: br-bpf: upper bge1-upper
ngctl mkpeer br-bpf: eiface squid ether

         PATTERN="tcp dst port 80"
         INHOOK="bge0-lower"
         MATCHHOOK="squid"
         NOTMATCHHOOK="bge1-lower"

         BPFPROG=$( tcpdump -s 8192 -ddd ${PATTERN} | grep -v WARNING | \
                    ( read len ; \
                      echo -n "bpf_prog_len=$len" ; \
                      echo -n " bpf_prog=[" ; \
                      while read code jt jf k ; do \
                          echo -n " { code=$code jt=$jt jf=$jf k=$k }" ; \
                      done ; \
                      echo " ]" ) )

         ngctl -d msg br-bpf: setprogram { thisHook=\"${INHOOK}\" \
           ifMatch=\"${MATCHHOOK}\" \
           ifNotMatch=\"${NOTMATCHHOOK}\" \
           ${BPFPROG} }

         PATTERN="tcp src port 80"
         INHOOK="bge1-lower"
         MATCHHOOK="squid"
         NOTMATCHHOOK="bge0-lower"

         BPFPROG=$( tcpdump -s 8192 -ddd ${PATTERN} | \
                    ( read len ; \
                      echo -n "bpf_prog_len=$len" ; \
                      echo -n " bpf_prog=[" ; \
                      while read code jt jf k ; do \
                          echo -n " { code=$code jt=$jt jf=$jf k=$k }" ; \
                      done ; \
                      echo " ]" ) )

         ngctl msg br-bpf: setprogram { thisHook=\"${INHOOK}\" \
           ifMatch=\"${MATCHHOOK}\" \
           ifNotMatch=\"${NOTMATCHHOOK}\" \
           ${BPFPROG} }

ngctl msg bge0: setpromisc 1
ngctl msg bge1: setpromisc 1
ngctl msg bge0: setautosrc 0
ngctl msg bge1: setautosrc 0

Сквид перенастроил на 80 порт.

2015/05/26 16:19:04.349 kid1| Accepting TPROXY intercepted HTTP Socket connections at local=0.0.0.0:80 remote=[::] FD 17 flags=25

В итоге:
tcpdump -i ngeth0 -vvv -s0 tcp dst port 80
tcpdump: listening on ngeth0, link-type EN10MB (Ethernet), capture size 65535 bytes
17:17:09.767118 IP (tos 0x0, ttl 128, id 921, offset 0, flags [DF], proto TCP (6), length 52)
    192.168.1.10.25055 > 192.168.1.20.http: Flags [S], cksum 0x8521 (correct), seq 2363512694, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0
17:17:12.231562 IP (tos 0x0, ttl 128, id 924, offset 0, flags [DF], proto TCP (6), length 52)
    192.168.1.10.25055 > 192.168.1.20.http: Flags [S], cksum 0x8521 (correct), seq 2363512694, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0

А в кеш.логе пусто. Ситуация повторяется. Что-то не так с самим сквидом?

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

12. "FreeBSD, squid & TPROXY"  +/
Сообщение от Alexander Sheiko on 27-Май-15, 01:04 
> А в кеш.логе пусто. Ситуация повторяется. Что-то не так с самим сквидом?

Зайдите на сквид телнетом и сделайте HTTP запрос, ответ нормальный? Заворот в этот момент уберите.

Ядро фряхи патчили?

См. http://adsh.org.ua/blog/article/52/

Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру