Infraestrutura: servidores no Datacenter, SO - Debian Squeeze, servidor Web - Apache 2.2.16
Situação:
O servidor ativo é usado diariamente por nossos clientes, o que torna impossível testar ajustes e melhorias. Portanto, gostaríamos de duplicar o tráfego HTTP de entrada no servidor ativo para um ou vários servidores remotos em tempo real. O tráfego deve ser passado para o servidor da Web local (neste caso, Apache) E para o (s) servidor (es) remoto (s). Dessa forma, podemos ajustar as configurações e usar código diferente / atualizado no (s) servidor (es) remoto (s) para comparação e comparação com o servidor ativo atual. Atualmente, o servidor da web está ouvindo aprox. 60 portas adicionais além de 80 e 443, devido à estrutura do cliente.
Pergunta: Como essa duplicação em um ou vários servidores remotos pode ser implementada?
Já tentamos:
- duplicador agnoster - isso exigiria uma sessão aberta por porta que não é aplicável. ( https://github.com/agnoster/duplicator )
- proxy kklis - apenas encaminha o tráfego para o servidor remoto, mas não o transmite para o servidor lcoal. ( https://github.com/kklis/proxy )
- iptables - O DNAT apenas encaminha o tráfego, mas não o transmite ao servidor da web local
- iptables - o TEE duplica apenas para servidores na rede local -> os servidores não estão localizados na mesma rede devido à estrutura do datacenter
- as alternativas sugeridas fornecidas para a pergunta "tráfego tcp duplicado com um proxy" no stackoverflow ( https://stackoverflow.com/questions/7247668/duplicate-tcp-traffic-with-a-proxy ) não tiveram êxito. Como mencionado, o TEE não funciona com servidores remotos fora da rede local. teeproxy não está mais disponível ( https://github.com/chrislusf/tee-proxy ) e não conseguimos encontrá-lo em outro lugar.
- Adicionamos um segundo endereço IP (que está na mesma rede) e o atribuímos a eth0: 0 (o endereço IP primário é atribuído a eth0). Não foi possível combinar essa nova interface IP ou virtual eth0: 0 com a função ou rotas iptables TEE.
- as alternativas sugeridas fornecidas para a pergunta "tráfego tcp de entrada duplicado no debian squeeze" ( tráfego TCP de entrada duplicado no debian squeeze ) não tiveram êxito. As sessões cat | nc (cat / tmp / prodpipe | nc 127.0.0.1 12345 e cat / tmp / testpipe | nc 127.0.0.1 23456) são interrompidas após cada solicitação / conexão por um cliente sem nenhum aviso ou log. Keepalive não mudou essa situação. Pacotes TCP não foram transportados para o sistema remoto.
- Tentativas adicionais com diferentes opções de socat (HowTo: http://www.cyberciti.biz/faq/linux-unix-tcp-port-forwarding/ , https://stackoverflow.com/questions/9024227/duplicate-input- unix-stream-to-múltiplo-tcp-clients-using-socat ) e ferramentas semelhantes não tiveram êxito, porque a função TEE fornecida gravará apenas no FS.
- Obviamente, pesquisar no Google e procurar esse "problema" ou configuração também não teve êxito.
Estamos ficando sem opções aqui.
Existe um método para desativar a imposição de "servidor na rede local" da função TEE ao usar IPTABLES?
Nosso objetivo pode ser alcançado com o uso diferente de IPTABLES ou rotas?
Você conhece uma ferramenta diferente para esse fim que foi testada e funciona para essas circunstâncias específicas?
Existe uma fonte diferente para tee-proxy (que atenderia perfeitamente aos nossos requisitos, AFAIK)?
Agradecemos antecipadamente por suas respostas.
----------
editar: 05.02.2014
aqui está o script python, que funcionaria da maneira que precisamos:
import socket
import SimpleHTTPServer
import SocketServer
import sys, thread, time
def main(config, errorlog):
sys.stderr = file(errorlog, 'a')
for settings in parse(config):
thread.start_new_thread(server, settings)
while True:
time.sleep(60)
def parse(configline):
settings = list()
for line in file(configline):
parts = line.split()
settings.append((int(parts[0]), int(parts[1]), parts[2], int(parts[3])))
return settings
def server(*settings):
try:
dock_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
dock_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
dock_socket.bind(('', settings[0]))
dock_socket.listen(5)
while True:
client_socket = dock_socket.accept()[0]
client_data = client_socket.recv(1024)
sys.stderr.write("[OK] Data received:\n %s \n" % client_data)
print "Forward data to local port: %s" % (settings[1])
local_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
local_socket.connect(('', settings[1]))
local_socket.sendall(client_data)
print "Get response from local socket"
client_response = local_socket.recv(1024)
local_socket.close()
print "Send response to client"
client_socket.sendall(client_response)
print "Close client socket"
client_socket.close()
print "Forward data to remote server: %s:%s" % (settings[2],settings[3])
remote_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
remote_socket.connect((settings[2], settings[3]))
remote_socket.sendall(client_data)
print "Close remote sockets"
remote_socket.close()
except:
print "[ERROR]: ",
print sys.exc_info()
raise
if __name__ == '__main__':
main('multiforwarder.config', 'error.log')
Os comentários para usar este script:
Esse script encaminha várias portas locais configuradas para outro servidor de soquete local e remoto.
Configuração:
adicione ao arquivo de configuração as linhas port-forward.config com o conteúdo da seguinte maneira:
As mensagens de erro são armazenadas no arquivo 'error.log'.
O script divide os parâmetros do arquivo de configuração:
Divida cada linha de configuração com espaços
0: porta local para escutar
1: porta local para encaminhar para
2: endereço IP remoto do servidor de destino
3: porta remota do servidor de destino
e configurações de retorno