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?