Serveur Proxy Réseau Domestique

D'abord, ma configuration:

  1. un modem câble et un Fritz !Box me connectant à Internet
  2. un PC connecté via un câble réseau à la Fritz Box
  3. plusieurs appareils Wi-Fi, également connectés à la Fritz Box

Voici ce que je veux réaliser: Je veux configurer quelque chose comme un serveur proxy réseau sur une machine séparée, qui intercepte et relaie (potentiellement) TOUT le trafic entre n'importe quel périphérique de mon réseau et Internet.  Je m'en fiche à propos du trafic entre les appareils de mon réseau.  Je ne veux pas être limité aux messages sur un certain protocole / port / adresse IP.  Mon objectif principal est d'en apprendre davantage sur les réseaux / protocoles, etc., et implémenter plusieurs applications / jouer sur ce serveur proxy.  Des exemples pourraient être:

  • Collectez des statistiques sur toutes les adresses IP / ports qui avaient une communication continue (donc, en gros, en transmettant tout le trafic et en faisant quelques comptes)
  • bloquez un peu de trafic (par exemple, empêchez les enfants de accéder à des choses qu'ils ne devraient pas voir, en fonction de l'adresse IP.  Empêcher les logiciels d'envoyer des données relatives à la confidentialité à mon sujet.)
  • avertir de nouveaux appareils sur mon réseau domestique (par exemple, quelqu'un utilise mal mon Wi-Fi)
  • modifier les messages avant de les transférer (par exemple, ajouter du texte au contenu Web entrant)
  • envoyer ses propres messages soit à un serveur sur Internet, soit à l'un des appareils connectés (par exemple, des statistiques d'utilisation collectées à afficher dans une interface Web)
  • beaucoup plus ...

En supposant que j'ai une machine Unix (/Linux) disponible:

  • Configuration du réseau : Quelle topologie de réseau serait nécessaire ?  Où dois-je placer la machine proxy dans mon réseau ?
  • Paramètres : Que dois-je configurer sur le proxy pour recevoir et transférer tout le trafic entrant et sortant ? Je ne souhaite PAS modifier les paramètres sur les appareils hôtes. Les connecter au réseau devrait suffire.
  • Programmabilité: De quoi ai-je besoin pour configurer de plus, afin de lire / modifier / écrire / envoyer / bloquer des messages / paquets en utilisant Python?
  • Limitations: Une telle configuration aurait-elle un impact sérieux sur la vitesse de mon réseau?

--- MODIFIER --- J'ai fait quelques progrès et créé un script python qui accepte les connexions entrantes. De plus, j'ai configuré la connexion wifi d'une autre machine pour utiliser la première comme passerelle. Je reçois avec succès des messages maintenant, mais le problème est que je n'ai aucune idée de l'endroit où ils devraient réellement être envoyé à. Je suppose que je dois changer la configuration du socket et utiliser des mandataires transparents, mais je n'ai pas trouvé grand-chose sur la façon de le faire en python. De plus, mon script s'exécute actuellement sur un mac, donc peut-être que toutes les options pour les sockets ne sont pas disponibles.

Sous mon extrait actuel :

import socket


def received_from(sock, timeout):
    dt = ""
    sock.settimeout(timeout)
    try:
        while True:
            dt = sock.recv(4096)
            if not dt:
                break
            dt = + dt
    except:
        pass
    return dt


def hexdump(data, length=16):
    filter = ''.join([(len(repr(chr(x))) == 3) and chr(x) or '.' for x in range(256)])
    lines = []
    digits = 4 if isinstance(data, str) else 2
    for c in range(0, len(data), length):
        chars = data[c:c+length]
        hex = ' '.join(["%0*x" % (digits, (x)) for x in chars])
        printable = ''.join(["%s" % (((x) <= 127 and filter[(x)]) or '.') for x in chars])
        lines.append("%04x  %-*s  %sn" % (c, length*3, hex, printable))
    print(''.join(lines))


s = socket.socket()
print("Socket successfully created")

try:
    port = 12222

    s.bind(('', port))
    print("socket bound to port {}".format(port))

    s.listen(5)
    print("socket listening")

    print("proxy sock: {}".format(s.getsockname()))

    while True:
        try:
            c, addr = s.accept()
            print("got connection from {}".format(addr))
            print("client peer: {}".format(c.getpeername()))
            print("client sock: {}".format(c.getsockname()))

            data = received_from(c, 3)
            hexdump(data)
            print()

            c.send("Connection received. Thanks and bye!".encode('utf-8'))

            c.close()
        except Exception as e:
            c.close()
            raise e

except Exception as e:
    s.close()
    raise e
demandé sur