Доброго времени суток, читатель!
Обращаюсь к тебе с проблемой в надежде обрести немного помощи. Суть такова:
Есть 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 CONNECThttp_access deny !Safe_ports
http_access deny CONNECT !SSL_portsacl manager url_regex -i ^cache_object:// /squid-internal-mgr/
http_access allow localhost manager
http_access deny managerhttp_access allow localnet
http_access allow localhost
http_access deny allhttp_port 3128
http_port 127.0.0.1:8080 tproxyrefresh_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% 4320debug_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: 0kldstat:
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.me/openforum/vsluhforumID12/7113.html
Подскажите, пожалуйста, что я делаю не так? Использование ipfw мне не принципиально, остальное важно.
> Стоит сквид 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 для трёх локальный интерфесов.
>[оверквотинг удален]
>> на него 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
> Спасибо за совет, но, к сожалению, тоже не вышло. Пробовал даже явно
> указывать тестовый комп, но все то же самое - счетчики растут,
> на сквид ничего не приходитНе совсем понятно. Интернет у клиентов работает или нет? Т.е. - пакеты проходят дальше или режутся при завороте на прокси.
А gateway в системе включён?
>> Спасибо за совет, но, к сожалению, тоже не вышло. Пробовал даже явно
>> указывать тестовый комп, но все то же самое - счетчики растут,
>> на сквид ничего не приходит
> Не совсем понятно. Интернет у клиентов работает или нет? Т.е. - пакеты
> проходят дальше или режутся при завороте на прокси.
> А gateway в системе включён?В итоге интернет работает, даже не режется. Если выключаю сквид, ничего не меняется.
Дефолтный гейтвей на 3 интерфейсе:
Internet:
Destination Gateway Flags Netif Expire
default 10.16.0.1 UGS bge3Пробовал его выключать, подменял гейтвей - ничего не меняется.
> В итоге интернет работает, даже не режется. Если выключаю сквид, ничего не
> меняется.Понятно. Первое, что стоит сделать - поискать классическую настройку прокси на бридже во FreeBSD в обычном (не tproxy) режиме. Там разница лишь в спуффинге адресов (что делает Squid) и разрешении ОС спуфить адреса из под обычного пользователя (что делают патчи ядра). Больше разницы нет.
>> В итоге интернет работает, даже не режется. Если выключаю сквид, ничего не
>> меняется.
> Понятно. Первое, что стоит сделать - поискать классическую настройку прокси на бридже
> во FreeBSD в обычном (не tproxy) режиме. Там разница лишь в
> спуффинге адресов (что делает Squid) и разрешении ОС спуфить адреса из
> под обычного пользователя (что делают патчи ядра). Больше разницы нет.Я так и сделал. Выше писал, что запустил squid в intercept с помощью pf - все получилось.
> Я так и сделал. Выше писал, что запустил squid в intercept с
> помощью pf - все получилось.Попробуйте вот так:
http://rejik.ru/bb_rus/viewtopic.php?f=1&t=903#p4657
Кто-то рекомендовал этот вариант как раз для одного интерфеса. Дополнительно указан номер порта и направление in / out.
>> Я так и сделал. Выше писал, что запустил 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Хотя я попробую их привести к такому же виду на всякий случай.
> А правила
> аналогичны моимУ Вас направление не указано. Его всегда стоит указывать, чтобы всё было однозначно.
>> А правила
>> аналогичны моим
> У Вас направление не указано. Его всегда стоит указывать, чтобы всё было
> однозначно.Хм. Не сработало:
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
> Доброго времени суток, читатель!
> Обращаюсь к тебе с проблемой в надежде обрести немного помощи. Суть такова:
> Есть FreeBSD 10.1 с тремя интерфейсами, два из которых объединены в мост
> без адреса. Интерфейсы также без адресов. Третий - с адресом, для
> О&М нужд. Стоит сквид 3.5.4 в режиме TPROXY. Не получается направить
> на него HTTP-траффик.
> Гуглил очень долго, ориентировался в первую очередь на: http://www.opennet.me/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 etherPATTERN="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А в кеш.логе пусто. Ситуация повторяется. Что-то не так с самим сквидом?
> А в кеш.логе пусто. Ситуация повторяется. Что-то не так с самим сквидом?Зайдите на сквид телнетом и сделайте HTTP запрос, ответ нормальный? Заворот в этот момент уберите.
Ядро фряхи патчили?