Servidor proxy de red doméstica

Servidor proxy de red doméstica

Primero, mi configuración:

  1. un módem por cable y un Fritz!Box que me conecta a Internet
  2. un PC conectado mediante cable de red al Fritz Box
  3. múltiples dispositivos Wi-Fi, también conectados a la Fritz Box

Esto es lo que quiero lograr: quiero configurar algo así como un servidor proxy de red en una máquina separada, que intercepte y (potencialmente) retransmita TODO el tráfico entre cualquier dispositivo de mi red e Internet. No me importa el tráfico entre dispositivos en mi red. No quiero limitarme a mensajes en un determinado protocolo/puerto/dirección IP. Mi objetivo principal es aprender sobre redes/protocolos, etc., e implementar múltiples aplicaciones/jugar en ese servidor proxy. Ejemplos podrían ser:

  • Recopile estadísticas sobre todas las IP/puertos que tuvieron comunicación continua (es decir, básicamente reenviar todo el tráfico y hacer algunos recuentos)
  • bloquear parte del tráfico (por ejemplo, evitar que los niños accedan a cosas que no deberían ver, según la dirección IP. Evitar que el software envíe datos sobre mí relacionados con la privacidad).
  • advertir sobre nuevos dispositivos en mi red doméstica (por ejemplo, alguien haciendo mal uso de mi Wi-Fi)
  • cambiar los mensajes antes de reenviarlos (por ejemplo, agregar texto al contenido web entrante)
  • enviar mensajes propios a un servidor en Internet o a uno de los dispositivos conectados (por ejemplo, estadísticas de uso recopiladas que se mostrarán en una interfaz web)
  • mucho mas ...

Suponiendo que tengo una máquina Unix (/ Linux) disponible:

  • Configuración de la red: ¿Qué topología de red se necesitaría? ¿En qué parte de mi red necesito colocar la máquina proxy?
  • Configuración: ¿Qué necesito configurar en el proxy para recibir y reenviar todo el tráfico entrante y saliente? NO quiero cambiar la configuración de los dispositivos host. Con conectarlos a la red debería ser suficiente.
  • Programabilidad: ¿Qué necesito configurar adicionalmente para leer/modificar/escribir/enviar/bloquear mensajes/paquetes usando Python?
  • Limitaciones: ¿Tal configuración significaría un impacto grave en la velocidad de mi red?

--- EDITAR --- Progresé un poco y creé un script en Python que acepta conexiones entrantes. Además, configuro la conexión wifi de otra máquina para usar la primera como puerta de enlace. Ahora recibo mensajes con éxito, pero el problema es que no tengo idea de a dónde deberían enviarse. Supongo que tengo que cambiar la configuración del socket y usar servidores proxy transparentes, pero no encontré mucho sobre cómo hacer esto en Python. Además, mi script se ejecuta actualmente en una Mac, por lo que tal vez no todas las opciones para sockets estén disponibles.

Debajo de mi fragmento actual:

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  %s\n" % (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

Respuesta1

Aquí hay algunas sugerencias:

1) En primer lugar, obtenga acceso a la página de administración de su puerta de enlace doméstica (FritzBox). Generalmente es una conexión de nombre de usuario/contraseña a través del navegador a 192.168.1.1. Revise la configuración de WAN, LAN, Wifi y lea sobre ello.

2) Instale Linux y herramientas de línea de comandos: tcpdump, netstat, nc, telnet

3) Tenga otra máquina Windows/Linux con interfaz de usuario, instale allí Wireshark

4) Intenta desarrollar algunos sencillos.programas de nivel de socket de Python(Las bibliotecas de sockets de Python encajan muy bien en las API de sockets C)

5) Registre el tráfico entre programas en diferentes computadoras con tcpdump y examine los paquetes con Wireshark

6) Intente agregar un servidor proxy (máquina dedicada) a su red LAN doméstica.

7) Instalar programas como el servidor web Apache, CuteFTP, SMPT Relay, MiniDLNA, etc.

Puedes usar miquesocalientepara que Linux experimente con cosas relacionadas con la red

8) Intente crear sus propios certificados SSL para proteger las conexiones entre las computadoras de su red.

Respuestas a tus preguntas:

Configuración de red: el proxy se coloca en la red como cualquier otra máquina. Pero todas las máquinas se refieren a él (úselo como "puerta de enlace").

Configuración: todas las máquinas deben ser informadas de un proxy (puerto, dirección) a través del parámetro de configuración.

Programabilidad: Nada. Funcionará desde el primer momento.

Limitaciones: ¿Tal configuración significaría un impacto serio en la velocidad de mi red? No.

información relacionada