Прокси-сервер Домашней Сети

Во-первых, моя настройка:

  1. кабельный модем и фриц!Коробка, соединяющая меня с Интернетом
  2. ПК, подключенный по сетевому кабелю к коробке Fritz
  3. несколько устройств Wi-Fi, также подключенных к ящику Fritz

Вот чего я хочу достичь: Я хочу настроить что-то вроде сетевого прокси-сервера на отдельной машине, который перехватывает и (потенциально) ретранслирует ВЕСЬ трафик между любым устройством в моей сети и Интернетом.  Мне все равно о трафике между устройствами в моей сети.  Я не хочу ограничиваться сообщениями по определенному протоколу/порту/IP-адресу.  Моя главная цель - узнать о сетях/протоколах и т. Д. И внедрить несколько приложений /игр на этом прокси-сервере.  Примерами могут быть:

  • Соберите статистику обо всех IP-адресах/портах, которые поддерживали постоянную связь (таким образом, в основном перенаправляя весь трафик и выполняя некоторые подсчеты)
  • блокировать некоторый трафик (например, не позволять детям доступ к вещам, которые они не должны видеть, на основе IP-адреса.  Запретить программному обеспечению отправлять данные обо мне, связанные с конфиденциальностью.)
  • предупреждать о новых устройствах в моей домашней сети (например, о том, что кто-то неправильно использует мой Wi-Fi)
  • изменение сообщений перед их пересылкой (например, добавление текста в поступающий веб-контент)
  • отправлять собственные сообщения либо на сервер в Интернете, либо на одно из подключенных устройств (например, собранную статистику использования для отображения в веб-интерфейсе)
  • многое другое ...

Предполагая, что у меня есть доступная машина Unix (/Linux):

  • Настройка сети: Какая потребуется топология сети?  Где в моей сети мне нужно разместить прокси-сервер?
  • Настройки: Что мне нужно настроить на прокси-сервере, чтобы получать и пересылать весь входящий и исходящий трафик? Я не хочу изменять настройки на хост-устройствах. Подключения их к сети должно быть достаточно.
  • Программируемость: Что мне нужно настроить кроме того, для чтения/изменения/записи/отправки/блокировки сообщений/пакетов с использованием Python?
  • Ограничения: Будет ли такая настройка серьезно влиять на скорость моей сети?

--- РЕДАКТИРОВАТЬ --- Я добился некоторого прогресса и создал скрипт на python, который принимает входящие соединения. Кроме того, я установил подключение Wi-Fi на другой машине, чтобы использовать первую в качестве шлюза. Сейчас я успешно получаю сообщения, но проблема в том, что я понятия не имею, где они на самом деле должны быть быть отправленным. Я бы предположил, что мне нужно изменить конфигурацию сокета и использовать прозрачные прокси-серверы, но я не нашел много информации о том, как на самом деле это сделать в python. Кроме того, мой скрипт в настоящее время работает на Mac, поэтому, возможно, доступны не все опции для сокетов.

Ниже моего текущего фрагмента:

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