Сначала моя настройка:
- кабельный модем и Fritz!Box, соединяющие меня с Интернетом
- ПК, подключенный через сетевой кабель к Fritz Box
- несколько устройств 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-сертификаты для защиты соединений между компьютерами в вашей сети.
Ответы на ваши вопросы:
Настройка сети: прокси-сервер размещается в сети, как и любая другая машина. Но все машины обращаются к нему (используют его как «шлюз»).
Настройки: Всем машинам необходимо сообщить прокси-сервер (порт, адрес) через параметр конфигурации.
Программируемость: Никакой. Все будет работать «из коробки».
Ограничения: Окажет ли такая настройка серьезное влияние на скорость моей сети? Нет.