Infrastructure: serveurs dans Datacenter, OS - Debian Squeeze, Webserver - Apache 2.2.16
Situation:
Le serveur en direct est utilisé quotidiennement par nos clients, ce qui rend impossible le test des ajustements et des améliorations. Par conséquent, nous aimerions dupliquer le trafic HTTP entrant sur le serveur en direct vers un ou plusieurs serveurs distants en temps réel. Le trafic doit être transmis au serveur Web local (dans ce cas, Apache) ET aux serveurs distants. Ainsi, nous pouvons ajuster les configurations et utiliser un code différent / mis à jour sur le ou les serveurs distants pour l'analyse comparative et la comparaison avec le serveur en direct actuel. Actuellement, le serveur Web écoute environ. 60 ports supplémentaires en plus de 80 et 443, en raison de la structure du client.
Question: Comment mettre en œuvre cette duplication sur un ou plusieurs serveurs distants?
Nous avons déjà essayé:
- duplicateur agnoster - cela nécessiterait une session ouverte par port, ce qui n'est pas applicable. ( https://github.com/agnoster/duplicator )
- kklis proxy - ne transfère que le trafic vers le serveur distant, mais ne le transmet pas au serveur Web lcoal. ( https://github.com/kklis/proxy )
- iptables - DNAT ne transfère que le trafic, mais ne le transmet pas au serveur Web local
- iptables - TEE ne se duplique que sur les serveurs du réseau local -> les serveurs ne sont pas situés sur le même réseau en raison de la structure du centre de données
- les alternatives suggérées fournies pour la question "trafic tcp en double avec un proxy" sur stackoverflow ( /programming/7247668/duplicate-tcp-traffic-with-a-proxy ) ont échoué. Comme mentionné, TEE ne fonctionne pas avec des serveurs distants en dehors du réseau local. teeproxy n'est plus disponible ( https://github.com/chrislusf/tee-proxy ) et nous n'avons pu le trouver ailleurs.
- Nous avons ajouté une deuxième adresse IP (qui se trouve dans le même réseau) et l'avons attribuée à eth0: 0 (l'adresse IP principale est attribuée à eth0). Pas de succès avec la combinaison de cette nouvelle interface IP ou virtuelle eth0: 0 avec la fonction ou les routes iptables TEE.
- Les alternatives suggérées fournies pour la question « Dupliquer le trafic TCP entrant sur Debian Squeeze » ( Dupliquer le trafic TCP entrant sur Debian Squeeze ) ont échoué. Les sessions cat | nc (cat / tmp / prodpipe | nc 127.0.0.1 12345 et cat / tmp / testpipe | nc 127.0.0.1 23456) sont interrompues après chaque demande / connexion par un client sans préavis ni journal. Keepalive n'a pas changé cette situation. Les packages TCP n'ont pas été transportés vers le système distant.
- Essais supplémentaires avec différentes options de socat (HowTo: http://www.cyberciti.biz/faq/linux-unix-tcp-port-forwarding/ , /programming/9024227/duplicate-input- unix-stream-to-multiple-tcp-clients-using-socat ) et des outils similaires ont échoué, car la fonction TEE fournie n'écrira que sur FS.
- Bien sûr, googler et rechercher ce «problème» ou la configuration a également échoué.
Nous manquons d'options ici.
Existe-t-il une méthode pour désactiver l'application du "serveur dans le réseau local" de la fonction TEE lors de l'utilisation d'IPTABLES?
Notre objectif peut-il être atteint par une utilisation différente des IPTABLES ou des itinéraires?
Connaissez-vous un outil différent à cet effet qui a été testé et fonctionne pour ces circonstances spécifiques?
Existe-t-il une autre source de tee-proxy (qui répondrait parfaitement à nos besoins, AFAIK)?
Merci d'avance pour vos réponses.
----------
modifier: 05.02.2014
voici le script python, qui fonctionnerait comme nous en avons besoin:
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')
Commentaires pour utiliser ce script:
Ce script transfère un certain nombre de ports locaux configurés vers un autre serveur de socket local et distant.
Configuration:
Ajoutez au fichier de configuration des lignes port-forward.config avec le contenu comme suit:
Les messages d'erreur sont stockés dans le fichier 'error.log'.
Le script divise les paramètres du fichier de configuration:
Fractionnez chaque ligne de configuration avec des espaces
0: port local à écouter
1: port local à transmettre à
2: adresse IP distante du serveur de destination
3: port distant du serveur de destination
et retour des paramètres