Primeiro, minha configuração:
- um modem a cabo e um Fritz!Box me conectando à Internet
- um PC conectado via cabo de rede ao Fritz Box
- 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.