Servidor proxy de rede doméstica

Servidor proxy de rede doméstica

Primeiro, minha configuração:

  1. um modem a cabo e um Fritz!Box me conectando à Internet
  2. um PC conectado via cabo de rede ao Fritz Box
  3. vários dispositivos Wi-Fi, também conectados ao Fritz Box

Aqui está o que eu quero alcançar: quero configurar algo como um servidor proxy de rede em uma máquina separada, que intercepte e (potencialmente) retransmita TODO o tráfego entre qualquer dispositivo na minha rede e a Internet. Não me importo com o tráfego entre dispositivos na minha rede. Não quero ficar limitado a mensagens em um determinado protocolo/porta/endereço IP. Meu principal objetivo é aprender sobre redes/protocolos, etc., e implementar vários aplicativos/brincar nesse servidor proxy. Exemplos poderiam ser:

  • Colete estatísticas sobre todos os IPs/portas que tinham comunicação contínua (basicamente encaminhando todo o tráfego e fazendo algumas contagens)
  • bloquear algum tráfego (por exemplo, impedir que as crianças acessem coisas que não deveriam ver, com base no endereço IP. Impedir que o software envie dados relacionados à privacidade sobre mim).
  • avisar sobre novos dispositivos na minha rede doméstica (por exemplo, alguém fazendo uso indevido do meu Wi-Fi)
  • alterar mensagens antes de encaminhá-las (por exemplo, adicionar texto ao conteúdo da web que chega)
  • enviar mensagens próprias para um servidor na Internet ou para um dos dispositivos conectados (por exemplo, estatísticas de uso coletadas para serem exibidas em uma interface web)
  • muito mais ...

Supondo que eu tenha uma máquina Unix (/Linux) disponível:

  • Configuração de rede: Qual topologia de rede seria necessária? Onde na minha rede preciso colocar a máquina proxy?
  • Configurações: O que preciso configurar no proxy para receber e encaminhar todo o tráfego de entrada e saída? NÃO quero alterar as configurações nos dispositivos host. Conectá-los à rede deve ser suficiente.
  • Programabilidade: O que preciso configurar adicionalmente para ler/modificar/escrever/enviar/bloquear mensagens/pacotes usando Python?
  • Limitações: Essa configuração teria um impacto sério na velocidade da minha rede?

--- EDIT --- Fiz alguns progressos e criei um script python que aceita conexões de entrada. Além disso, configurei a conexão wifi de outra máquina para usar a primeira como gateway. Agora recebo mensagens com sucesso, mas o problema é que não tenho ideia de para onde elas deveriam ser enviadas. Eu diria que preciso alterar a configuração do soquete e usar proxies transparentes, mas não descobri muito sobre como fazer isso em python. Além disso, meu script é executado atualmente em um Mac, então talvez nem todas as opções de soquetes estejam disponíveis.

Abaixo do meu trecho atual:

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

Responder1

Aqui estão algumas sugestões:

1) Em primeiro lugar, obtenha acesso à página de administração do seu gateway doméstico (FritzBox). Geralmente é uma conexão de nome de usuário/senha via navegador para 192.168.1.1. Revise as configurações de WAN, LAN, Wifi e leia sobre isso.

2) Instale Linux e ferramentas de linha de comando: tcpdump, netstat, nc, telnet

3) Tenha outra máquina windows/linux com interface de usuário, instale aí o Wireshark

4) Tente desenvolver alguns simplesprogramas em nível de soquete python(bibliotecas de soquete python se adaptam perfeitamente às APIs de soquete C)

5) Registre o tráfego entre programas em computadores diferentes com tcpdump e examine pacotes com Wireshark

6) Tente adicionar um servidor proxy (máquina dedicada) à sua rede LAN doméstica.

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

Você pode usar meucalor de chitapara o Linux experimentar coisas relacionadas à rede

8) Tente criar seus próprios certificados SSL, para proteger as conexões entre os computadores da sua rede.

Respostas às suas perguntas:

Configuração de rede: o proxy é colocado na rede como qualquer outra máquina. Mas todas as máquinas se referem a ele (use-o como "gateway").

Configurações: Todas as máquinas precisam ser informadas sobre um proxy (porta, endereço) via parâmetro de configuração.

Programabilidade: Nada. funcionará imediatamente.

Limitações: Essa configuração teria um impacto sério na velocidade da minha rede? Não.

informação relacionada