Squid 3.3 Proxy Transparente IPv4 e IPv6 com TPROXY

1

Estou tentando alterar minha configuração transparente do Squid de usar NAT genérico que é limitado apenas ao IPv4 e alterná-lo para TPROXY, para suporte a IPv6. Estou tendo dificuldades para fazer com que os clientes transparentes funcionem sob a nova configuração, no entanto, todas as solicitações são atendidas com o squid, causando o seguinte erro em todas as solicitações:

"O URL solicitado não pôde ser recuperado"

Parece que há um problema de roteamento em algum lugar, mas não tenho certeza do que está errado.

Estou usando iptables e ip6tables em meu roteador DD-WRT e Squid Proxy junto com iproute2 para fazer as partes de roteamento em ambos os lados.

Por padrão, parece que o módulo ip6table_mangle não é carregado por padrão no DD-WRT, mas foi compilado na compilação em execução no meu roteador:

find /lib/modules -name "*.ko" | grep -i mangle
/lib/modules/3.10.89/ip6table_mangle.ko

Carregou o módulo e adicionou ao script de inicialização para inicializações futuras:

insmod ip6table_mangle

Informações de roteamento DD-WRT:

# Squid transparent proxy
PROXY_IPV4="192.168.x.x"
PROXY_IPV6="xxxx:xxxx:xxxx:xxxx::x"
CLIENTIFACE=br0
FWMARK=3

iptables -t mangle -A PREROUTING -i $CLIENTIFACE -p tcp --dport 80 -s $PROXY_IPV4 -j ACCEPT
ip6tables -t mangle -A PREROUTING -i $CLIENTIFACE -p tcp --dport 80 -s $PROXY_IPV6 -j ACCEPT

iptables -t mangle -A PREROUTING -i $CLIENTIFACE -p tcp --dport 80 -j MARK --set-mark $FWMARK
iptables -t mangle -A PREROUTING -m mark --mark $FWMARK -j ACCEPT
ip6tables -t mangle -A PREROUTING -i $CLIENTIFACE -p tcp --dport 80 -j MARK --set-mark $FWMARK
ip6tables -t mangle -A PREROUTING -m mark --mark $FWMARK -j ACCEPT

iptables -t filter -A FORWARD -i $CLIENTIFACE -o $CLIENTIFACE -p tcp --dport 80 -j ACCEPT
ip6tables -t filter -A FORWARD -i $CLIENTIFACE -o $CLIENTIFACE -p tcp --dport 80 -j ACCEPT

ip rule add fwmark $FWMARK table 2
ip -6 rule add fwmark $FWMARK table 2
ip route add default via $PROXY_IPV4 table 2
ip -6 route add default via $PROXY_IPV6 table 2

# End Squid intercept proxy config

Roteamento do Squid Proxy (no próprio servidor):

iptables -F -t mangle
iptables -X -t mangle
ip6tables -F -t mangle
ip6tables -X -t mangle
iptables -t mangle -N DIVERT
ip6tables -t mangle -N DIVERT

iptables -t mangle -A DIVERT -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
iptables -t mangle -A DIVERT -j ACCEPT
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 3129

ip6tables -t mangle -A DIVERT -j MARK --set-mark 1
ip6tables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
ip6tables -t mangle -A DIVERT -j ACCEPT
ip6tables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 3129

ip -f inet rule add fwmark 1 lookup 100
ip -f inet route add local default dev eno1 table 100

ip -f inet6 rule add fwmark 1 lookup 100
ip -f inet6 route add local default dev eno1 table 100

squid conf:

http_port 3129 tproxy

config sysctl:

net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.lo.rp_filter = 0
net.ipv4.conf.eno1.rp_filter = 0

eno1 é a principal interface ethernet Eu também tentei usar lo sem nenhum sucesso.

O tráfego está sendo passado para a caixa do Squid, então parece que o roteador está fazendo o seu trabalho. É quando o tráfego acaba na caixa de Squid, onde parece estar errado. Todos os pedidos estão sendo registrados, mas retornando 500 erros.

Até onde sei, minha configuração suporta TPROXY:

  • CentOS 7
  • Lula 3.3.8 (EPEL)
  • iptables / ip6tables 1.4.21
  • Linux Kernel 3.10
  • libcap 2.22

Eu usei essas fontes como orientação, mas não consigo configurar o trabalho.

Algum conselho sobre qual pode ser o problema ou depurar mais?

    
por James White 04.10.2015 / 17:21

1 resposta

1

Acontece que tudo foi configurado corretamente. Qual foi o problema real é minha diretiva cache_peer para Privoxy. O erro é na verdade o Squid dizendo que não pode entregar o tráfego para o Privoxy. Isso ocorre porque a configuração do tproxy é confusa.

Para evitar isso, você precisa adicionar no-tproxy à linha cache_peer

cache_peer hostname parent 8118 7 no-tproxy ...
    
por 10.10.2015 / 15:56