openbsd pf lula proxy transparente usando uma ponte

1

Eu quero usar o OpenBSD 5.7 como uma ponte de filtragem na frente do meu roteador e, como parte disso, executar um proxy transparente (squid 3.5.1) para gerenciar o acesso à web. Eu configurei a máquina openbsd como uma ponte, e isso funciona bem. No entanto, não consigo fazer com que pf desvie o tráfego da web para o squid.

É assim que minha rede parece

[Internet]
      |
      |
[OpenBSD]
      |
      |
  [       (Router)     ]
     |                 |
     |                 |
 [Wired Workstations]   [Wi-Fi]

O Squid funciona corretamente se eu conectar a máquina do OpenBSD à minha rede e configurar manualmente uma estação de trabalho para usá-la como proxy. Eu tenho o seguinte na minha configuração do squid para permitir a interceptação transparente

http_port 127.0.0.1:3129 tproxy

Esta é a configuração do meu pf:

# internet facing
ext_if = "em1"

# internal facing
int_if = "em0"

#scrub provides a measure of protection against certain kinds of attacks based on incorrect handling of packet fragments
match in all scrub (no-df max-mss 1440)

# Prevent spoofing
antispoof log for $ext_if label "antispoof"

# Block anything coming form source we have no back routes for
block in log from no-route to any label "no back route"

# Proxy http
pass in quick on $int_if inet proto tcp to port www divert-to 127.0.0.1 port 3129
pass out quick from 127.0.0.1 divert-reply

pass in on $int_if
pass out on $int_if

pass in on $ext_if
pass out on $ext_if

Alguém sabe por que minha regra "desviar para" não funciona? Eu olhei nos logs

pass in quick on em0 inet proto tcp from any to any port = 80 flags S/SA divert-to 127.0.0.1 port 3129
  [ Evaluations: 36248     Packets: 544       Bytes: 355122      States: 29    ]
  [ Inserted: uid 0 pid 15666 State Creations: 29    ]

desdobre o inet rápido de 127.0.0.1 para qualquer sinalizador de desvio / resposta S / SA       [Avaliações: 72399 Pacotes: 0 Bytes: 0 Estados: 0]       [Inserido: uid 0 pid 15666 State Creations: 0]

Posso ver que a regra está "funcionando", mas nada aparece nos logs do squid e ainda posso acessar sites. Isso é basicamente as regras recomendadas pela lula como. Eu tentei usar essa regra em vez disso

pass in log quick on $int_if inet proto tcp from any to any port www rdr-to 127.0.0.1 port 3129

Quando eu uso isso, vejo que o redirecionamento de regra ocorre, no entanto, nada aparece nos logs do squid. Também solicitações de tempo limite de sites.

pass in log quick on em0 inet proto tcp from any to any port = 80 flags     S/SA rdr-to 127.0.0.1 port 3129
  [ Evaluations: 25213     Packets: 8         Bytes: 496         States: 1     ]

Esta é a saída do ifconfig

ifconfig

lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 32768
    priority: 0
    groups: lo
    inet6 fe80::1%lo0 prefixlen 64 scopeid 0x4
    inet6 ::1 prefixlen 128
    inet 127.0.0.1 netmask 0xff000000
em0: flags=8b43<UP,BROADCAST,RUNNING,PROMISC,ALLMULTI,SIMPLEX,MULTICAST> mtu 1500
    lladdr 00:e8:4c:68:1a:f1
    priority: 0
    groups: egress
    media: Ethernet autoselect (1000baseT full-duplex,rxpause,txpause)
    status: active
em1: flags=8b43<UP,BROADCAST,RUNNING,PROMISC,ALLMULTI,SIMPLEX,MULTICAST> mtu 1500
    lladdr 00:e8:4c:68:1a:f2
    priority: 0
    media: Ethernet autoselect (100baseTX full-duplex,rxpause,txpause)
    status: active
enc0: flags=0<>
    priority: 0
    groups: enc
    status: active
bridge0: flags=41<UP,RUNNING>
    groups: bridge
    priority 32768 hellotime 2 fwddelay 15 maxage 20 holdcnt 6 proto rstp
    em0 flags=7<LEARNING,DISCOVER,BLOCKNONIP>
            port 1 ifpriority 0 ifcost 0
    em1 flags=7<LEARNING,DISCOVER,BLOCKNONIP>
            port 2 ifpriority 0 ifcost 0
pflog0: flags=141<UP,RUNNING,PROMISC> mtu 33144
    priority: 0
    groups: pflog

Como posso fazer isso funcionar? O que há de errado com minhas regras pf?

Atualizar

Isso está ficando um pouco estranho

Se eu usar

pass in quick log on $int_if inet proto tcp to port 80 divert-to 127.0.0.1 port 3129
pass out quick log from 127.0.0.1 divert-reply

Eu obtenho o seguinte no log:

rule 3/(match) pass in on em0: 233.297.39.227.32880 > 153.94.152.119.87: S 2656450467:2656450467(0) win 65535 <mss 1460,nop,wscale 5,nop,nop,timestamp 605332037 0,[|tcp]> (DF)

Se eu mudar para

pass in quick log on $int_if inet proto tcp to port 80 rdr-to 127.0.0.1 port 3129
pass out quick log from 127.0.0.1 divert-reply

Eu recebo o seguinte no log, no entanto, nada aparece nos logs do squid e, sem surpresa, os pedidos para os sites terminam

rule 3/(match) pass in on em0: 233.297.39.227.39091 > 127.0.0.1.3129: S 409217949:409217949(0) win 65535 <mss 1460,nop,wscale 5,nop,nop,timestamp 605394683 0,[|tcp]> (DF)
    
por Jim 10.05.2015 / 05:25

1 resposta

0

Se você tem o OpenBSD 4.1 ou 4.3 , você precisa fazer:

rdr pass inet proto tcp from 192.168.231.0/24 to any port 80 -> 192.168.231.1 port 3129

block in
pass in quick on $int_if
pass in quick on $wi_if
pass out keep state

E se você tiver 4.4 ou superior no OpenBSD Você precisa fazer:

set skip on $int_if
set skip on $wi_if
IPv6:

pass in quick inet6 proto tcp from 2001:DB8::/32 to port www divert-to ::1 port 3129
pass out quick inet6 from 2001:DB8::/32 divert-reply
IPv4:
pass in quick on inet proto tcp from 192.0.2.0/24 to port www divert-to 127.0.0.1 port 3129
pass out quick inet from 192.0.2.0/24 divert-reply

ATUALIZAÇÃO:

Claro, você precisa de algumas mudanças de acordo com suas interfaces.

    
por 10.05.2015 / 05:36