Problema com Iptables/Squid

Iniciado por luis.sch, 04 de Setembro de 2012, 11:35

tópico anterior - próximo tópico

luis.sch

Bom dia amigos

Estou configurando um firewall/proxy e estou enfrentando alguns problemas.
Se desativo o squid, e retiro o redirecionamento das portas para o squid do script do iptables, as estações navegam normalmente.
Porém, com o squid ativado e o redirecionamento das portas no iptables, as estações não navegam.
Será que alguem pode me dar uma luz?

Segue abaixo os scripts

iptables

Citar
#!/bin/sh

#### Definicoes de variaveis #######
#### Interface externa - Conexao com a internet ####
IFEXT="eth1"

#### Interface interna - Conexao com a rede local ####
IFLCL="eth0"

#### Definindo o caminho do iptables ####
IPT=`which iptables`

#### Rede interna ####
NTW="10.0.0.0/24"

#### IP Interno ####
IPINT="10.0.0.2"

#### IP Externo ####
IPEXT="xxx.xxx.xxx.xxx"

#### Mostrando a versao ####
$IPT -V
echo  ""

iptables_up(){

        #### Modulos de mascaramento ####

        modprobe iptable_nat
        modprobe ip_nat_ftp
        modprobe ip_conntrack
        modprobe ip_conntrack_ftp


        #### Ativa o roteamento de pacotes ####

        echo 1 > /proc/sys/net/ipv4/ip_forward
        echo 1 > /proc/sys/net/ipv4/tcp_syncookies
        echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
        echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses


        #### Limpando regras ####

        echo -n "Cleaning current rules... "
        $IPT -F
        $IPT -F -t nat
        $IPT -F -t mangle
        $IPT -X
        $IPT -X -t nat
        $IPT -X -t mangle
        $IPT -Z
        $IPT -Z -t nat
        $IPT -Z -t mangle
        echo "Ok"


        #### Politicas padrao ####

        echo -n "Setting default policies (DROP)... "
        $IPT -P INPUT DROP
        $IPT -P FORWARD DROP
        $IPT -P OUTPUT DROP
        echo "Ok"

        #### Proxy transparente ####
        echo -n "Setting transparent proxy... "
        $IPT -t nat -A PREROUTING -i $IFLCL -p tcp --dport 80 -j REDIRECT --to-port 8787
        $IPT -t nat -A PREROUTING -i $IFLCL -p udp --dport 80 -j REDIRECT --to-port 8787
        echo "Ok"

        #### NAT de saida ####

        echo -n "Setting source nat... "
        #### IP's sem limite ####
        #$IPT -A POSTROUTING -t nat -o $IFEXT -j SNAT --to $IPEXT
        $IPT -A POSTROUTING -t nat -o $IFEXT -s 10.0.0.20/32 -j SNAT --to $IPEXT
        $IPT -A POSTROUTING -t nat -o $IFEXT -s 10.0.0.37/32 -j SNAT --to $IPEXT
        $IPT -A POSTROUTING -t nat -o $IFEXT -s 10.0.0.215/32 -j SNAT --to $IPEXT
        $IPT -A POSTROUTING -t nat -o $IFEXT -s 10.0.0.225/32 -j SNAT --to $IPEXT
        $IPT -A POSTROUTING -t nat -o $IFEXT -s 10.0.0.226/32 -j SNAT --to $IPEXT
        $IPT -A POSTROUTING -t nat -o $IFEXT -s 10.0.0.227/32 -j SNAT --to $IPEXT
        $IPT -A POSTROUTING -t nat -o $IFEXT -s 10.0.0.228/32 -j SNAT --to $IPEXT
        $IPT -A POSTROUTING -t nat -o $IFEXT -s 10.0.0.231/32 -j SNAT --to $IPEXT
        ### Portas liberadas ####
        for PORT in `cat /etc/init.d/ports`; do
                $IPT -A POSTROUTING -t nat -o $IFEXT -s $NTW -p tcp --dport $PORT -j SNAT --to $IPEXT
                $IPT -A POSTROUTING -t nat -o $IFEXT -s $NTW -p udp --dport $PORT -j SNAT --to $IPEXT
        done
        echo "Ok"


        #### Politicas de OUTPUT ####

        echo -n "Setting OUTPUT policies... "
        #### Liberando acesso loopback ####
        $IPT -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
        #### Limitando o ping a 5/s ####
        $IPT -A OUTPUT -p icmp -m limit --limit 5/s -j ACCEPT
        #### Acesso DNS externo ####
        $IPT -A OUTPUT -p udp --dport 53 -j ACCEPT
        ### Libera navegacao web ####
        for PORT in `cat /etc/init.d/ports`; do
                $IPT -A OUTPUT -s $NTW -p tcp --dport $PORT -j ACCEPT
                $IPT -A OUTPUT -s $NTW -p udp --dport $PORT -j ACCEPT
        done

        $IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
        $IPT -A OUTPUT -m limit --limit 3/m --limit-burst 3 -j LOG --log-level info --log-prefix "Firewall: OUTPUT -- "
        echo "Ok"


        #### Politicas de INPUT ####

        echo -n "Setting INPUT policies... "
        #### Liberando acesso loopback ####
        $IPT -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
        #### Limitando ping a 5/s ####
        $IPT -A INPUT -p icmp -m limit --limit 5/s -j ACCEPT
        $IPT -A INPUT -p icmp -m limit --limit 5/s -j ACCEPT
        #### Liberando APACHE local ####
        $IPT -A INPUT -p tcp -i $IFEXT --dport 80 -j ACCEPT
        #### Bloqueando IP Spoofing
        $IPT -A INPUT -i $IFEXT -s 10.0.0.0/8 -m limit --limit 3/m -j LOG --log-prefix "FW: 10. Spoofing -- "
        $IPT -A INPUT -i $IFEXT -s 10.0.0.0/8 -j DROP
        $IPT -A INPUT -i $IFEXT -s 172.16.0.0/16 -m limit --limit 3/m -j LOG --log-prefix "FW: 172. Spoofing -- "
        $IPT -A INPUT -i $IFEXT -s 172.16.0.0/16 -j DROP
        $IPT -A INPUT -i $IFEXT -s 192.168.0.0/16 -m limit --limit 3/m -j LOG --log-prefix "FW: 192. Spoofing -- "
        $IPT -A INPUT -i $IFEXT -s 192.168.0.0/16 -j DROP

        ### Trafego para o squid ###
        $IPT -A INPUT -i $IFLCL -p tcp -s $NTW --dport 8787 -j ACCEPT
        $IPT -A INPUT -i $IFLCL -p udp -s $NTW --dport 8787 -j ACCEPT

        $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
        $IPT -A INPUT -m limit --limit 3/m --limit-burst 3 -j LOG --log-level info --log-prefix "Firewall: INPUT --"
        echo "Ok"


        #### Politicas de FORWARD ####

        echo -n "Setting FORWARD policies... "
        #### Liberando acesso loopback ####
        $IPT -A FORWARD -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
        #### Acesso DNS ####
        $IPT -A FORWARD -p udp -s $NTW --dport 53 -j ACCEPT
        ### Libera navegacao web ####
        for PORT in `cat /etc/init.d/ports`; do
                $IPT -A FORWARD -s $NTW -p tcp --dport $PORT -j ACCEPT
                $IPT -A FORWARD -s $NTW -p udp --dport $PORT -j ACCEPT
        done

        $IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
        $IPT -A FORWARD -m limit --limit 3/m --limit-burst 3 -j LOG --log-level info --log-prefix "Firewall: FORWARD -- "
        echo "Ok"

        echo -n ""
        echo "Iptables starded sucessfuly"
        echo -n ""

}

iptables_down(){

        echo -n "Stopping Iptables firewall... "
        echo -n ""

        echo -n "Cleaning rules... "
        $IPT -F
        $IPT -F -t nat
        $IPT -F -t mangle
        $IPT -X
        $IPT -X -t nat
        $IPT -X -t mangle
        $IPT -Z
        $IPT -Z -t nat
        $IPT -Z -t mangle
        echo "Ok"
       
        echo -n "Setting default ACCEPT policy... "
        $IPT -P FORWARD ACCEPT
        $IPT -P INPUT ACCEPT
        $IPT -P OUTPUT ACCEPT
        echo "Ok"

        echo -n ""
        echo -n "Iptables stopped sucessfuly"
        echo -n ""

}

iptables_restart(){
        iptables_down
        echo ""
        sleep 1
        iptables_up
}

iptables_status(){
        echo "==========   NAT Status Policies   =========="
        echo ""
        $IPT -t nat -nL
        echo ""
        echo "==========   Mangle Status Policies   =========="
        echo ""
        $IPT -t mangle -nL
        echo ""
        echo "==========   Filter Status Policies   =========="
        echo ""
        $IPT -nL
        echo ""
}

case "$1" in
        "start")
                iptables_up
        ;;
        "stop")
                iptables_down
        ;;
        "restart")
                iptables_restart
        ;;
        "status")
                iptables_status
        ;;
        * ) echo "Use: [start] [stop] [restart] [status]"
esac

squid.conf
Citar
# Proxy Transparente
http_port 8787 transparent
visible_hostname pombo

# Cache em memoria
cache_mem 128 MB
maximum_object_size_in_memory 128 KB

# Cache em disco
maximum_object_size 64 MB
minimum_object_size 4 KB
cache_swap_low 90
cache_swap_high 95
cache_dir ufs /var/spool/squid3 2048 16 256
refresh_pattern ^ftp: 15 20% 1440
refresh_pattern ^gopher: 15 0% 1440
refresh_pattern . 15 20% 1440

# Acl's de conexao e cache
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl local_network src 10.0.0.0/24

acl SSL_ports port 443 563
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 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl Safe_ports port 901         # swat
acl Safe_ports port 1025-65535  # high ports

acl purge method PURGE
acl CONNECT method CONNECT

# Acl's de bloqueio
#acl blocked_sites url_regex -i "/etc/squid3/rules/blocked_sites"
#acl free_sites url_regex -i "/etc/squid3/rules/free_sites"
#acl unlimited_ips src "/etc/squid3/rules/unlimited_ips"
#acl limited_downloads url_regex -i "/etc/squid3/rules/limited_downloads"
#acl low_rate url_regex -i "/etc/squid3/rules/low_rate"

http_access allow manager localhost
http_access deny manager

http_access allow purge localhost
http_access deny purge

http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
htcp_access allow all
icp_access allow all
# Bloqueando e liberando sites e banda para navegacao
#http_access allow unlimited_ips
#http_access allow free_sites
#http_access deny blocked_sites

http_access allow localhost
http_access allow local_network
http_access deny all

# Limitando banda para navegacao
#delay_pools 2

#delay_class 1 2
#delay_parameters 1 380160/380160 4096/4096
#delay_access 1 allow limited_downloads

#delay_class 2 2
#delay_parameters 2 380160/380160 4096/4096
#delay_access 2 allow low_rate


Agradeço qualquer ajuda

zekkerj

Citar$IPT -P OUTPUT DROP
(...)
        echo -n "Setting OUTPUT policies... "
        #### Liberando acesso loopback ####
        $IPT -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
        #### Limitando o ping a 5/s ####
        $IPT -A OUTPUT -p icmp -m limit --limit 5/s -j ACCEPT
        #### Acesso DNS externo ####
        $IPT -A OUTPUT -p udp --dport 53 -j ACCEPT
        ### Libera navegacao web ####
        for PORT in `cat /etc/init.d/ports`; do
                $IPT -A OUTPUT -s $NTW -p tcp --dport $PORT -j ACCEPT
                $IPT -A OUTPUT -s $NTW -p udp --dport $PORT -j ACCEPT
        done

        $IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
        $IPT -A OUTPUT -m limit --limit 3/m --limit-burst 3 -j LOG --log-level info --log-prefix "Firewall: OUTPUT -- "
        echo "Ok"

Você está usando política DROP na cadeia OUTPUT. Que fique registrado que "passarinho que come pedra, sabe o tamanho do jaburu que tem".

A cadeia OUTPUT é destinada para pacotes originados da própria máquina; assim, essas regras que você adicionou, p.ex. "$IPT -A OUTPUT -s $NTW -p udp --dport $PORT -j ACCEPT" só estão te atrapalhando --- estão dizendo que vc pode enviar pacotes a partir de sua máquina quando o endereço de origem for da rede interna. Ora, os pacotes que são gerados em sua máquina só têm origem na rede interna quando você está escrevendo na própria rede interna.

Aí vc vai me perguntar: como consertar isso? Pessoalmente eu acho que não vale a pena usar política DROP na cadeia OUTPUT em servidores. É muita mão de obra pra pouco resultado. Então, em vez de corrigir, eu desativaria todo esse trecho e voltaria a política pra ACCEPT.
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

luis.sch

Entendi sua colocação, mas como eu falei no tópico, no meu entender o problema está no Squid, e é esse problema que eu não estou conseguindo identificar.
Se o iptables estiver funcionando sozinho, as estações navegam.
Agora, se eu redireciono a porta 80 para o squid, aí é que a navegação não acontece.

zekkerj

Claro q vc tem um problema no squid: ele não pode conectar na internet pq seu firewall não deixa.

Baixe seu firewall q seu problema no squid acaba.
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

zekkerj

Só pra esclarecer: sem a regra de redirecionamento, o tráfego não passa pela cadeia OUTPUT, q está com as regras erradas, e sim pela cadeia FORWARD, q está correta. Por isso funciona.
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

luis.sch