Transparent squid proxy with if_bridge

James Seward jamesoff at gmail.com
Tue Jul 31 11:13:54 UTC 2007


Hello all,

I'm trying to set up a machine using if_bridge to do transparent
proxying via squid.

I've been following a selection of walkthroughs online including
http://www.benzedrine.cx/transquid.html

I have a machine with three network cards, two of which form the
bridge and the third is for management.

Using a rdr rule in pf.conf, I am rewriting packets from my
workstation (currently the only client while I test) to
localhost:8080. I have also tried redirecting to the IP of the
management card. In both cases squid was configured to listen either
on localhost:8080 or management_ip:8080. The "transparent" option
appears on the http_port configuration line. Squid is currently set to
allow anyone access.

If squid is listening on the management_ip, I can point my browser at
that and squid services my request normally. If I bind squid to
localhost, I can nc(1) to it and it services my request.

If I let the rdr rule redirect my packets to squid, nothing happens
and the client times out. pfctl -sa shows that pf has done the
redirection and displays something like:
127.0.0.1:8080 <- external_ip:80 <- client_ip:34582 CLOSED:SYN_SENT
so it seems the SYN never arrives at squid. tcpdumping lo0 shows no
traffic at all.

I have tried this with and without IPs for the bridged cards (without
would suit me better) but I'm not sure if that's the problem at this
stage.

--8<-- pf.conf ----
ext_if="fxp0"
int_if="xl0"

# send web-type stuff to the cache
rdr on $int_if inet proto tcp \
        from 192.168.200.112 to any port www \
        -> 127.0.0.1 port 8080

pass in all
pass out all
-----

--8<--- squid.conf
# egrep -v "^#" /usr/local/etc/squid/squid.conf | egrep -v '^$'
http_port 127.0.0.1:8080 transparent
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
cache_mem 32 MB
cache_dir ufs /usr/local/squid/cache 4096 16 256
access_log /usr/local/squid/logs/access.log squid
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern .               0       20%     4320
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
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 allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access     allow   all
http_reply_access allow all
icp_access allow all
cache_mgr XXXXX
mail_program mail
visible_hostname XXXXX
logfile_rotate 10
append_domain .XXXXX
always_direct allow all
coredump_dir /usr/local/squid/cache
------

--%<--- ifconfig
fxp0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
        options=8<VLAN_MTU>
        inet 192.168.200.17 netmask 0xffffff00 broadcast 192.168.200.255
        ether 00:a0:c9:ea:92:91
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
xl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
        options=9<RXCSUM,VLAN_MTU>
        inet 192.168.200.16 netmask 0xffffff00 broadcast 192.168.200.255
        ether 00:50:04:39:c2:f2
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
rl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        options=8<VLAN_MTU>
        inet 192.168.200.113 netmask 0xffffff00 broadcast 192.168.200.255
        ether 00:40:f4:4d:84:31
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x6
        inet6 ::1 prefixlen 128
        inet 127.0.0.1 netmask 0xff000000
bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        ether 5a:6b:3a:b8:6a:c1
        id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
        maxage 20 holdcnt 6 proto stp maxaddr 100 timeout 1200
        root id 00:00:00:00:00:00 priority 0 ifcost 0 port 0
        member: fxp0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
        member: xl0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
------
(xl0 and fxp0 currently have ips, but it doesn't work when they don't either)

Sample state:
STATES:
self tcp 127.0.0.1:8080 <- 207.46.193.254:80 <- 192.168.200.112:50526
     CLOSED:SYN_SENT


Every walkthrough makes it sound very simple and easy; I feel like I
must be missing something obvious :)

Thanks in advance,
James


More information about the freebsd-pf mailing list