Você pode redirecionar todo o tráfego HTTP de saída para o squid. O squid deve estar rodando no modo transparente
# iptables -t nat -I OUTPUT -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:3128
Mas não é possível identificar de qual usuário foi o tráfego. Mas você poderia tentar rodar o squid em algumas portas, cada uma para um usuário específico
http_port 127.0.0.1:3128 transparent
http_port 127.0.0.1:3129 transparent
http_port 127.0.0.1:3130 transparent
Em seguida, redirecione o tráfego de saída para uma porta específica
# iptables -t nat -I OUTPUT -p tcp --dport 80 -m owner --uid-owner apache -j DNAT --to-destination 127.0.0.1:3128
# iptables -t nat -I OUTPUT -p tcp --dport 80 -m owner --uid-owner joe -j DNAT --to-destination 127.0.0.1:3129
# iptables -t nat -I OUTPUT -p tcp --dport 80 -m owner --uid-owner jack -j DNAT --to-destination 127.0.0.1:3130
Use o lp no formato de registro do squid
logformat uniq_user %lp %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %>Hs %<st %Ss:%Sh
I'm getting a lot of 403 errors in the log file. I added the IP-address of the server to the cal but that didn't work. I think the request would end up in an endless loop anyways
você precisa ignorar todas as solicitações do próprio squid
# iptables -t nat -I OUTPUT -p tcp --dport 80 -m owner --uid-owner squid -j ACCEPT
Eu assumi que sua instância do squid está rodando sob o squid: squid, que é por padrão
Configuração de trabalho do squid
acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7 # RFC 4193 local private network range
acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines
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_access allow localnet
http_access allow localhost
http_access deny all
http_port localhost:3128 transparent
http_port localhost:3129 transparent
http_port localhost:3130 transparent
hierarchy_stoplist cgi-bin ?
coredump_dir /var/spool/squid
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
logformat uniq_user %lp %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %>Hs %<st %Ss:%Sh
access_log /var/log/squid/squid-users.log uniq_user
Versão do Squid e detalhes do sistema
# squid -v | head -1
Squid Cache: Version 3.1.10
# uname -r
2.6.32-358.14.1.el6.x86_64
# cat /etc/redhat-release
CentOS release 6.4 (Final)
Certifique-se de que a primeira regra na cadeia OUTPUT seja - "-p tcp --dport 80 -m proprietário --uid-owner squid -j ACCEPT"