como forçar o Apache a usar o http_proxy no Localhost para o tráfego de saída sem o iptables?

1

Eu tenho um servidor web com vários aplicativos de vários usuários. Como não tenho certeza do que os aplicativos estão fazendo e de qual tráfego http / https de saída eles produzem, quero ter mais controle sobre isso. Então, meu pensamento é usar um Squid interno que esteja apenas ouvindo 127.0.0.1:3128. No começo eu só queria dar uma olhada no log de acesso, o segundo passo seria um black / whitelist para URLs e domínios relacionados à segurança. Essas listas devem filtrar o tráfego de saída do apache e de todos os processos filhos (por exemplo: um dos aplicativos está executando uma curva como uma chamada de sistema).

Eu já adicionei http_proxy a / etc / sysconfig / proxy, a / etc / environment e a .bashrc do usuário do sistema apache. Tudo está funcionando bem quando estou usando o shell, o apache não usa o proxy. Eu já reiniciei o apche após as alterações, mas sem sucesso.

A propósito, eu tenho o OpenSuse 11 rodando no servidor web.

A solução: (graças a ALex_hha, desculpe, eu acho que eu estava lendo sua resposta muito rápido) Eu entrei no seguinte iptables - regras:

iptables -t nat -I OUTPUT -p tcp --dport 80 -m owner --uid-owner apache -j DNAT --to-destination 127.0.0.1:3128

e defina o Squid para o modo transparente:

http_port 127.0.0.1:3128 transparent

e agora está funcionando muito bem.

    
por Burt Wonderstone 14.08.2013 / 12:46

1 resposta

1

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"

    
por 14.08.2013 / 13:11