Problema.
Olá a todos,
Eu estou na necessidade de ter um pequeno número de máquinas virtuais vivendo em um servidor específico. Cada máquina deve ter sua própria configuração de proxy, mas o software em execução nelas não possui recursos adequados de configuração de proxy, portanto, a configuração de proxy no convidado não é uma opção. Meu objetivo é rotear tanto tráfego quanto o meu proxy externo permitir, não apenas HTTP.
Estou usando o VirtualBox em execução em um servidor Ubuntu, conectado a um roteador que tem firmware Tomato (pense nisso como uma minúscula caixa Linux). As VMs estão conectadas ao roteador por meio de uma conexão em ponte, de modo que o roteador enxerga cada uma delas de forma independente; Eu preferiria strongmente mantê-lo assim porque é extremamente conveniente poder falar com cada uma das VMs por seu IP (posso configurar isso para ser estático). Estou aberto a usar outro software do lado do servidor, mas não vejo uma razão pela qual minha configuração atual não funcione. Pensei em algumas opções diferentes, e gostaria de saber se alguém tem alguma ideia sobre qual seria a melhor ou se estou perdendo uma opção melhor:
Opção 1.
Eu consegui instalar e configurar com sucesso um servidor proxy squid3 em meu servidor Ubuntu (o mesmo que executa as VMs), que se comunica com os proxies autenticados em estado selvagem. Por motivos de segurança, ativei apenas conexões locais com o proxy e outras máquinas na mesma rede podem usar a conexão com o proxy local que, por sua vez, as redireciona para o proxy externo:
Local Machine -> Ubuntu Server (squid3) -> External Proxy
Infelizmente, como mencionei acima, as VMs não têm recursos de cliente proxy. Pensei que poderia rotear todo o tráfego do servidor através de seu próprio servidor Squid, mas como as VMs têm uma conexão em ponte, elas conversam diretamente com o roteador. Para atenuar esse problema, tenho tentado redirecionar o tráfego das VMs do roteador de volta para o servidor Ubuntu:
Virtual Machine -> Tomato Router -> Ubuntu Server (squid3) -> External Proxy
Eu tenho tido pouco sucesso com essa abordagem até agora, já que estou me perdendo nos detalhes de como redirecionar o tráfego para todas as portas e nunca fiz nenhum trabalho com o iptables antes. Mesmo se eu fosse capaz de redirecionar todo o tráfego de volta para o servidor squid3, não sei como seria possível aplicar configurações de proxy individuais a cada uma das VMs. Eu precisaria configurar um servidor squid3 para cada uma das VMs? Tenho certeza de que o squid3 me permite filtrar por IP de entrada, mas a opção cache_peer "proxy-host" parent "proxy-port" 0 no-query default login=username:password
que estou usando para falar com os proxies externos parece se comportar globalmente.
Opção 2.
Eu poderia instalar um servidor proxy squid3 no roteador Tomato e fazer tudo o que descrevi na primeira opção no próprio roteador, mas ainda não consegui instalar o servidor proxy. Assim como eu estava pensando na primeira opção, eu precisaria de um servidor proxy diferente para cada uma das VMs? O layout seria muito parecido:
Virtual Machine -> Tomato Router (squid3) -> External Proxy
Opção 3.
Embora eu prefira manter a conexão em ponte das VMs para o roteador, talvez haja uma maneira de se conectar às VMs por meio do NAT e usar o servidor squid3 no servidor Ubuntu ou no roteador Tomato (se eu for capaz de fazê-lo funcionar).
Pergunta.
Qual opção seria a melhor maneira de contornar meu problema? Existe uma maneira melhor de abordar isso que eu não considerei?
Atualizar.
Aparentemente, eu estava errado sobre o squid não ser capaz de lidar com a diretiva cache_peer
em uma base de cliente, em vez de globalmente, eu posso simplesmente usar cache_peer_access
. Atualmente, estou tentando ir para a opção 1 até que alguém me dê uma razão melhor para não fazer isso. Esta é a configuração que eu tenho para /etc/squid3/squid.conf
:
Editar: http_port atualizado conforme sugerido
# acl definitions here
acl localnet src 192.168.1.0/24
acl localhost src 127.0.0.1
# Only allow cachemgr access from localhost
http_access allow localhost manager
http_access deny manager
# any client in the local network has access
http_access allow localhost
http_access allow localnet
# And finally deny all other access to this proxy
#http_access deny all
http_access allow all # test only
# external proxy settings
http_port 3128 transparent
cache_peer XXXX.XXXX.XXXX.XXXX parent 80 0 no-query default login=user:pass
# No direct access
never_direct allow all
# do not forward the IP address
forwarded_for off
O tráfego está sendo redirecionado do roteador Tomato para o meu servidor de lula. Para fazer isso, estou usando os seguintes iptables (as VMs estão limitadas aos ips no intervalo 192.168.1.50-192.168.1.100 impostos pela ligação estaticamente do endereço MAC a um IP através do servidor DHCP):
PROXY_IP=192.168.1.115
REDIRECT_PORTS=443,80,21,70,210,1025:65535,280,488,591,777
iptables -t mangle -A PREROUTING -p tcp --dport 80 -s $PROXY_IP -j ACCEPT
iptables -t mangle -A PREROUTING -m iprange --src-range 192.168.1.50-192.168.1.100 -p tcp -m multiport --dport $REDIRECT_PORTS -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -m iprange --src-range 192.168.1.50-192.168.1.100 -p udp -m multiport --dport $REDIRECT_PORTS -j MARK --set-mark 3
ip rule add fwmark 3 table 2
ip route add default via $PROXY_IP dev br0 table 2
E depois de volta ao servidor Ubuntu:
iptables -A PREROUTING -t nat -p tcp -m multiport --dport $REDIRECT_PORTS -j REDIRECT --to 3128
iptables -A PREROUTING -t nat -p udp -m multiport --dport $REDIRECT_PORTS -j REDIRECT --to 3128