Proxy Transparente em Máquina Virtual

1. Proxy Transparente em Máquina Virtual

Fernando Souza Henriques
fernando_sh

(usa Slackware)

Enviado em 27/12/2014 - 20:55h

Prezados, boa noite. Preciso muito das ajuda dos colegas, qualquer dica é importante. Não sou especialista em Linux, sou programador e tenho alguma experiência em administração de servidores Slackware apenas, mas precisei realizar a tarefa que descreverei a seguir.

O Problema:

Preciso montar um Servidor Proxy transparente em uma máquina virtual, com um serviço HTTP no mesmo server. Escolhi o VirtualBox e o Slackware 14 para a tarefa. O Slackware somente por ser a distro que tenho alguma familiaridade. A instalação foi tranquila, e a "ativação" do HTTP ficou ok também. Para o serviço funcionar corretamente, coloquei outra placa de rede - ficou então uma onboard e outra offboard -, reconheceu direitinho, então configurei os ips no Slack - atribui o IP manualmente a uma, que será o gateway para a rede que puxarei a partir desse server, e deixei a segunda, que receberá o sinal externo de internet, em DHCP. No VirtualBox, coloquei ambas em modo bridge, para serem vistas externamente como se fossem reais. Funcionou. Consigo usar o server como HTTP normalmente, chamando a página de teste dele do PC que está instalado a VM.

Depois disso, instalei o Squid e deixei o squid.conf com a configuração mínima padrão, para testar - não é meu forte a configuração tanto do Squid, quanto do IpTables -, inserindo apenas o "transparent" para que rode como transparente. Feito o Squid, criei o arquivo rc.firewall baseado nas regras do arquivo que roda lá no trabalho - lá é Slack 10, ainda! -, adicionando de diferente apenas a linha que redireciona tudo pro proxy:

iptables -t nat -A PREROUTING -s $lan -p tcp —dport 80 -j DNAT —to 192.168.0.2:3128 iptables -t nat -A PREROUTING -i $internet -p tcp —dport 80 -j REDIRECT —to-port 3128.

Teoricamente, era para estar pronto, mas quando ligo os cabos como devem ficar - o cabo de internet externo alimentando uma placa e o um outro cabo saindo com o sinal, ligado num switch que deveria distribuir a internet -, não funciona.

Tenho certeza que o problema está no rc.firewall e/ou no squid.conf, mas como não acusa nada no Slack, não consigo identificar. Posto abaixo à integra de ambos os arquivos, para que possam ajudar (Por favor!):

rc.firewall

***

#!/bin/sh
#
# Iptables Packet Filter
#
# Variaveis da INTERFACE
lan=eth0
internet=eth1

echo "Starting iptables 1.3.3..."

iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F
iptables -t nat -F
iptables -X
iptables -Z

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
iptables -F
iptables -t nat -F
iptables -X
iptables -Z

# Spoof Protection
iptables -t nat -A PREROUTING -i $internet -s 10.0.0.0/8 -j DROP

# Regras Basicas
iptables -I OUTPUT -d 127.0.0.1 -j ACCEPT
iptables -I INPUT -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -s 192.168.0.2 -d 192.168.0.2 -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -s 192.168.0.2 -j ACCEPT

# internet -> firewall
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 22,53 -j ACCEPT

## REDE INTERNA ##

# SERVER_VIP
iptables -N SRV_VIP

# lan -> internet
iptables -A FORWARD -i $lan -o $internet -p tcp -m multiport --dports 21,110,587 -j ACCEPT
iptables -A FORWARD -i $lan -o $internet -p udp --dport 123 -j ACCEPT

# lan -> firewall
iptables -A FORWARD -p tcp -m multiport --dports 53,113 -s 192.168.0.0/24 -j ACCEPT
iptables -A FORWARD -p udp --dport 53 -s 192.168.0.0/24 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 53,80,3128 -s 192.168.0.0/24 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -s 192.168.0.0/24 -j ACCEPT

# firewall -> internet
iptables -A OUTPUT -p udp -m multiport --dports 53 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -d 192.168.0.2 -j ACCEPT
iptables -A OUTPUT -o $internet -p tcp -m multiport --dports 21,22,53,80,81,113,443,2087,2095,3309,5800,7003,7777,8008,8080 -j ACCEPT
iptables -A OUTPUT -o $internet -p udp -m multiport --dports 500,4000,4500 -j ACCEPT
iptables -A OUTPUT -d 192.168.0.2 -j ACCEPT
iptables -A OUTPUT -o $lan -p all -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT

# FORWARDS
iptables -A FORWARD -i $lan -o $internet -j SRV_VIP

# Statefull Rules
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# Mascaramento
iptables -t nat -A POSTROUTING -o $internet -j MASQUERADE

# Redirecionamento para Proxy transparente
iptables -t nat -A PREROUTING -s $lan -p tcp —dport 80 -j DNAT —to 192.168.0.2:3128 iptables -t nat -A PREROUTING -i $internet -p tcp —dport 80 -j REDIRECT —to-port 3128

echo "iptables started."

***

squid.conf

#
# Recommended minimum configuration:
#

# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed
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

#
# Recommended minimum Access Permission configuration:
#
# Deny requests to certain unsafe ports
http_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

# Only allow cachemgr access from localhost
http_access allow localhost manager
http_access deny manager

# We strongly recommend the following be uncommented to protect innocent
# web applications running on the proxy server who think the only
# one who can access services on "localhost" is a local user
#http_access deny to_localhost

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#

# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
http_access allow localnet
http_access allow localhost

# And finally deny all other access to this proxy
http_access deny all

# Squid normally listens to port 3128
http_port 3128 transparent

# Uncomment and adjust the following to add a disk cache directory.
#cache_dir ufs /usr/local/squid/var/cache/squid 100 16 256

# Leave coredumps in the first cache dir
coredump_dir /usr/local/squid/var/cache/squid

#
# Add any of your own refresh_pattern entries above these.
#
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


  


2. Atualização

Fernando Souza Henriques
fernando_sh

(usa Slackware)

Enviado em 28/12/2014 - 04:14h

Troquei o "transparent" no squid.conf por "intercept", pois segundo li, o primeiro foi depreciado e o comando equivalente é o segundo.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts