Прокси-сервер Домашней Сети
Во-первых, моя настройка:
- кабельный модем и фриц!Коробка, соединяющая меня с Интернетом
- ПК, подключенный по сетевому кабелю к коробке Fritz
- несколько устройств 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