[Resolvido] Recriando um servidor proxy transparente pela n-ésima vez e não...

Iniciado por allison.b.mat, 23 de Janeiro de 2013, 03:10

tópico anterior - próximo tópico

allison.b.mat

Boa noite.

Estou com sérios problemas na implementação de um servidor Ubuntu que satisfaça as seguintes condições:

1. Transmita a conexão externa recebida (ok).
2. Atue como firewall usando regras no IpTables.
3. Atue como gerente de proxy transparente usando Squid 3.

Os problemas ocorrem nas duas últimas etapas, pois consigo, no máximo, um firewall funcionando, mas nunca o proxy transparente. E, além disso, nenhuma máquina da rede interna se conecta à rede externa (Internet). Por outro lado, se desativo o Squid, as máquinas da rede interna já se conectam à Internet.

Já procurei por diversas soluções no fórum e fora dele, mas não consigo, em hipótese alguma, fazer isto funcionar.

Posto os arquivos de configuração do IpTables e do Squid pela manhã, pois estão no meu ambiente de trabalho. Por outro lado, não sei até que ponto a postagem desses arquivos vai ajudar, mas vamos ver.

Se for possível, também, além da ajuda no assunto, recomendem um guia realmente introdutório, que me permita analisar o que acontece a cada parte da implementação. Andei lendo o Guia Foca, para tentar entender um pouco do IpTables, vários tópicos do fórum e de outras páginas, mas ainda entendo muito pouco do que estou fazendo.

Preciso da ajuda urgentemente, pois já tem mais de uma semana que estou saindo do serviço estourado por conta disso e não consigo identificar os problemas. E isto deveria estar pronto para sexta-feira passada.

Agradeço a compreensão e a ajuda.

zekkerj

CitarPor outro lado, não sei até que ponto a postagem desses arquivos vai ajudar, mas vamos ver.
Mas é a primeira coisa a fazer, antes disso não tem como entender o que está acontecendo.
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

allison.b.mat

Boa tarde.
Desculpem-me por quaisquer inconvenientes. Não pude encaminhar os arquivos pela manhã, pois estava resolvendo outros problemas.

Seguem os arquivos em questão.
Nota 1: "eth0" é a interface de rede externa (Internet); "eth1", a de rede interna; "10.100.1.x" são os IPs atribuídos na rede interna, sendo x=1 o servidor.
Nota 2: estou tentando usar o Squid 3.1.6. Caso seja necessário, tento instalar uma versão mais antiga.


Arquivo: /etc/init.d/firewall:
==============================================
## Limpar regras em funcionamento no iptables
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -t filter -F
iptables -X
iptables -Z

## Bandeiras de roteamento
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/ip_dynaddr

## Definindo política padrão (negar a entrada e permitir a saída)
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

## Interface loopback não se sujeita ao proxy!
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

## Limitando o tempo de conexão para evitar o "ping da morte" e ataques Denial of Service (DoS)
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -m limit --limit 1/s -j DROP

## Permissão para funcionamento de UDP, DNS e FTP passivo
iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

## Relaçòes básicas de confiança sobre a rede interna
iptables -A INPUT -i eth1 -s 10.100.1.0/24 -j ACCEPT
iptables -A INPUT -i eth1 -m state --state NEW -j ACCEPT

## Acesso irrestrito à rede interna
iptables -A INPUT -i eth1 -j ACCEPT
iptables -A OUTPUT -o eth1 -j ACCEPT

## Redirecionando o tráfego na porta HTTP para a porta de escuta do Squid
iptables -t nat -A PREROUTING -s 10.100.1.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128

## Definindo esta máquina como roteador para a rede interna
iptables -t nat -A POSTROUTING -s 10.100.1.0/24 -o eth0 -j MASQUERADE
iptables -A FORWARD -s 10.100.1.0/24 -j ACCEPT



Arquivo: /etc/squid3/squid.conf
==============================================
## Porta de Escuta HTTP
http_port 3128 transparent

visible_hostname hostname.dominio.com.br

## Diretivas de cache
cache_mem 1536 MB
cache_dir ufs /ssrv/cache 131072 64 256

hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY

## Diretivas de controle
acl all src all
acl redelocal src 10.100.1.0/255.255.255.0
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl manager proto cache_object

acl safeports port 21 #ftp
acl safeports port 80 #http
acl safeports port 443 #https

acl safeports port 70 #gopher
acl safeports port 210 #wais
acl safeports port 280 #http-mgmt
acl safeports port 488 #gss-http
acl safeports port 563 #snews
acl safeports port 591 #filemaker
acl safeports port 631 #cups
acl safeports port 777 #multiling http
acl safeports port 873 #rsync
acl safeports port 901 #swat
acl safeports port 1025-65535 #demais portas aceitáveis

acl sslports port 443 #https
acl sslports port 563 #snews
acl sslports port 873 #rsync

acl purge method PURGE
acl CONNECT method CONNECT

## Acesso/HTTP
http_access allow manager localhost
http_access deny manager

http_access allow purge localhost
http_access deny purge

http_access deny !safeports
http_access deny CONNECT !sslports

http_access allow localhost
http_access allow redelocal

zekkerj

Citação de: allison.b.mat online 23 de Janeiro de 2013, 14:35
Arquivo: /etc/init.d/firewall:
==============================================
## Limpar regras em funcionamento no iptables
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -t filter -F
iptables -X
iptables -Z

Até aqui tudo bem.

Citar## Bandeiras de roteamento
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/ip_dynaddr

Nunca tinha visto esta instrução. Vc sabe o que faz?

Citar## Definindo política padrão (negar a entrada e permitir a saída)
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

## Interface loopback não se sujeita ao proxy!
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

Tudo certo aqui.

Citar## Limitando o tempo de conexão para evitar o "ping da morte" e ataques Denial of Service (DoS)
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -m limit --limit 1/s -j DROP

Não é preciso limitar os "echo reply", pq se estão voltando pra vc, são resultado dos pings que vc mesmo gerou.

Citar## Permissão para funcionamento de UDP, DNS e FTP passivo
iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

Seria bom que vc permitisse também a passagem de pacotes de retorno vindos da internet, pra sua rede interna. Assim:

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

Citar## Relaçòes básicas de confiança sobre a rede interna
iptables -A INPUT -i eth1 -s 10.100.1.0/24 -j ACCEPT

iptables -A INPUT -i eth1 -m state --state NEW -j ACCEPT

Veja só, na regra anterior vc já aceitou os pacotes vindos da rede local, com o endereço de origem correto. Se vc liberar mais alguma coisa da rede local, a única coisa que vai ser liberada vão ser pacotes com endereço de origem errado...

Citar
## Acesso irrestrito à rede interna
iptables -A INPUT -i eth1 -j ACCEPT
iptables -A OUTPUT -o eth1 -j ACCEPT


Novamente, qualquer coisa que vc libere na cadeia INPUT vindo da interface de rede local, só podem ser pacotes com endereço de origem errado, pois os com endereço de origem correto já foram liberados lá em cima.
E a segunda linha é desnecessária, pois vc não está com política DROP na cadeia OUTPUT.

Citar
## Redirecionando o tráfego na porta HTTP para a porta de escuta do Squid
iptables -t nat -A PREROUTING -s 10.100.1.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128

## Definindo esta máquina como roteador para a rede interna
iptables -t nat -A POSTROUTING -s 10.100.1.0/24 -o eth0 -j MASQUERADE
iptables -A FORWARD -s 10.100.1.0/24 -j ACCEPT

O resto me parece tudo OK. Acredito que só a adição daquela linha que eu sugeri lá em cima já faça suas estações começarem a navegar.
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

allison.b.mat

Boa tarde.

Implementei algumas mudanças, dentre elas as que você sugeriu.

Aquela linha ".../ip_dynaddr" tem a ver com endereçamento dinâmico, mas não faz muita diferença. Removi-a também.

Agora, o problema em relação ao tráfego do squid continua. Se desabilitar o redirecionamento de porta para o squid, os clientes conseguem se conectar à Internet. Quando ela está ativada, o cliente não navega em hipótese alguma.

Além disso, o squid vem retornando o erro:

ERROR: no running copy.

zekkerj

Ele não está rodando. O arquivo "/var/log/squid/cache.log" vai mostrar o motivo, nas últimas linhas.
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

allison.b.mat

Bom. Mesmo tentando corrigir os erros, o squid ainda retorna o mesmo erro.
Diante disso, resolvi reinstalar e reconfigurar o squid, mas aos poucos, para perceber alguns outros problemas.

Estou tentando verificar se o squid realmente está escutando na porta 3128, mas ele parece não ligar muito para a única regra de bloqueio de endereços por nome. Tenho de definir requisição DNS no squid também? Não basta repassá-la pelo servidor DHCP não?

Encaminho a situação atual do "firewall" e do "squid.conf"

Arquivo: /etc/init.d/firewall
===================================================
## Limpar regras em funcionamento no iptables
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -t filter -F
iptables -X
iptables -Z

## Bandeiras de roteamento
echo 1 > /proc/sys/net/ipv4/ip_forward

## Definindo política padrão (negar a entrada e permitir a saída)
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

## Interface loopback não se sujeita ao proxy!
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

## Limitando o tempo de conexão para evitar o "ping da morte" e ataques Denial of Service (DoS)
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

## Permissão para funcionamento de UDP, DNS e FTP passivo
iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

## Permissão de transmissão interna
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

## Redirecionando o tráfego nas portas HTTP/HTTPS para a porta de escuta do Squid
iptables -A INPUT -p tcp --dport 3128 -j ACCEPT
iptables -t nat -A PREROUTING -s 10.100.1.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128

## Definindo esta máquina como roteador para a rede interna
iptables -t nat -A POSTROUTING -s 10.100.1.0/24 -o eth0 -j MASQUERADE
iptables -A FORWARD -s 10.100.1.0/24 -j ACCEPT



Arquivo: /etc/squid3/squid.conf
===================================================
## Minimum definitions
http_port 3128 intercept
visible_hostname ieaa.ufam.edu.br

## Access Control Lists
acl ALL src all
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 LOCALNETWORK src 10.100.1.0/24

acl URL_LOCKED url_regex -i "/etc/squid3/extconf/locked.url"

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

## Deny access to explicit forbidden pages or aliases
http_access deny URL_LOCKED

## Only allow cachemgr access from LOCALHOST
http_access allow MANAGER LOCALHOST
http_access deny MANAGER

## Deny requests to unsafe ports
http_access deny !SAFE_PORTS

## Deny connections to other than SSL access ports
http_access deny CONNECT !SSL_PORTS

## Protection to server applications which think LOCALHOST is accessed only from the local machine
http_access deny TO_LOCALHOST

## Allow access from internal networks
http_access allow LOCALNETWORK
http_access allow LOCALHOST

## Deny remaining requests
http_access deny ALL



Arquivo: /etc/squid3/extconf/locked.url
===================================================
pballison


zekkerj

Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

allison.b.mat

zekkerj, depois que eu fiz as mudanças postadas anteriormente, não tenho mais o arquivo "cache.log". O squid parou de retornar o erro e começou a rodar.

Porém, ganhei outro problema: os clientes não acessam página alguma; estão retornando o erro a seguir:


ERROR
The requested URL could not be retrieved

The following error was encountered while trying to retrieve the URL: /

Invalid URL

Some aspect of the requested URL is incorrect.


Porém, os clientes conseguem efetuar pings contra servidores DNS (Google, OpenDNS, Locaweb).

As mudanças que fiz interferiram em alguma coisa e eu não estou conseguindo identificar?

zekkerj

Citarnão tenho mais o arquivo "cache.log".

Hã???!!!! Esse arquivo é essencial. Vc o desativou??? ???
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

allison.b.mat

Bom.

Tirei as linhas dele na segunda configuração que mostrei. Mas incluí de novo para ver se o arquivo de log era gerado. O squid passou a não gerar mais o log, não sei por que razão.

Depois de tanto bater cabeça com a configuração do Squid e não achar problema nenhum - nem nas recomendações do programa nem nos vários guias e tutoriais sobre o assunto - , passei a procurar por outra solução para o erro

ERROR: no running copy


Procurando muito na rede (cara, já tem duas semanas que estou lidando com isso), encontrei o seguinte: "possivelmente, serviços necessários ao squid podem não ter sido iniciados antes dele; um exemplo é a resolução dos nomes de DNS" (não exatamente com essas palavras). Onde consegui achar dizia que provavelmente o serviço "dns-start" estava se iniciando depois do squid, daí a razão do problema.

Depois de algum tempo analisando o rito de inicialização do Ubuntu, vi que o script "dns-start" da pasta "/etc/init.d" realmente não é iniciado antes do squid, e sim enquanto o ambiente gráfico é gerado (para quem está configurando o servidor em um ambiente padrão e não no ambiente de servidor - meu caso). Então, iniciei os dois serviços na ordem e, enfim, os clientes passaram a navegar passando pelo squid normalmente.

Depois de duas semanas de raiva, é difícil acreditar que o problema não estava no "squid.conf". Para tentar garantir (realmente, ainda não acredito que isto está funcionando), anexei as linhas a seguir ao "/etc/init.d/rc.local":

/etc/init.d/dns-start
/etc/init.d/squid3 stop
/etc/init.d/squid3 start


Incluí a linha de interrupção por questões de segurança: vai que o processo está aberto sem que se saiba, mas não está rodando...

Ah, para quem está usando estas novas versões do squid, é bom avisar algumas mudanças: geralmente, usava-se o parâmetro

http_port PORTA transparent

para indicar escuta transparente; desde a versão 3.1.16 (estou usando a .19 e ainda posso estar errado quanto ao tempo; pode ter sido antes disso ainda), o parâmetro é

http_port PORTA intercept


A ACL "all", usualmente definida como

acl all src 0.0.0.0/0.0.0.0

já é autodefinida no squid; não é necessário declará-la.

Por fim, as máscaras de sub-rede não mais são indicadas pelas extensões IP (se é que posso chamá-las assim), mas de outro modo:

Faixa/0.0.0.0 equivale a Faixa/0
Faixa/255.0.0.0 equivale a Faixa/8
Faixa/255.255.0.0 equivale a Faixa/16
Faixa/255.255.255.0 equivale a Faixa/24
Faixa/255.255.255.255 equivale a Faixa/32


Agradeço o esforço e a disposição para ajudar e deixo a solução para quem estiver passando pelo mesmo problema.