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

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

Сначала моя настройка:

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

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

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

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

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

--- EDIT --- Я добился некоторого прогресса и создал скрипт на 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  %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

решение1

Вот некоторые предложения:

1) Прежде всего, получите доступ к странице администратора вашего домашнего шлюза (FritzBox). Обычно это подключение по имени пользователя и паролю через браузер к 192.168.1.1. Просмотрите настройки WAN, LAN, Wifi и прочтите об этом.

2) Установите Linux и инструменты командной строки: tcpdump, netstat, nc, telnet

3) Имеем еще одну машину Windows / Linux с пользовательским интерфейсом, устанавливаем на нее Wireshark

4) Попробуйте разработать несколько простыхпрограммы уровня сокета python(библиотеки сокетов Python прекрасно подходят для API сокетов C)

5) Записывайте трафик между программами на разных компьютерах с помощью tcpdump и проверяйте пакеты с помощью Wireshark

6) Попробуйте добавить прокси-сервер (выделенный компьютер) в домашнюю локальную сеть.

7) Установите такие программы, как веб-сервер Apache, CuteFTP, SMPT Relay, MiniDLNA и т. д.

Вы можете использовать мойчитсхитдля Linux, чтобы экспериментировать с сетевыми вещами

8) Попробуйте создать собственные SSL-сертификаты для защиты соединений между компьютерами в вашей сети.

Ответы на ваши вопросы:

Настройка сети: прокси-сервер размещается в сети, как и любая другая машина. Но все машины обращаются к нему (используют его как «шлюз»).

Настройки: Всем машинам необходимо сообщить прокси-сервер (порт, адрес) через параметр конфигурации.

Программируемость: Никакой. Все будет работать «из коробки».

Ограничения: Окажет ли такая настройка серьезное влияние на скорость моей сети? Нет.

Связанный контент