家庭網路代理伺服器

家庭網路代理伺服器

首先,我的設定:

  1. 電纜調變解調器和 Fritz!Box 將我連接到互聯網
  2. 透過網路線連接到 Fritz Box 的 PC
  3. 多個 Wi-Fi 設備,也連接到 Fritz Box

這是我想要實現的目標:我想在一台單獨的機器上設定類似網路代理伺服器的東西,它攔截並(可能)中繼我的網路中的任何裝置和網路之間的所有流量。我不關心網路中設備之間的流量。我不想僅限於某個協定/連接埠/IP 位址上的訊息。我的主要目標是了解網路/協定等,並在該代理伺服器上實現多個應用程式/運行。例子可以是:

  • 收集有關正在進行通訊的所有 IP/連接埠的統計資料(因此,基本上轉送所有流量,並進行一些計數)
  • 阻止某些流量(例如,根據 IP 位址阻止孩子存取他們不應該看到的內容。阻止軟體發送有關我的隱私相關資料。)
  • 警告我的家庭網路中的新設備(例如,有人濫用我的 Wi-Fi)
  • 在轉發訊息之前更改訊息(例如,在傳入的網頁內容中添加文字)
  • 將自己的訊息傳送到網路上的伺服器或連接的裝置之一(例如,收集的使用統計資料顯示在 Web 介面中)
  • 還有很多 ...

假設我有一台可用的 Unix (/Linux) 機器:

  • 網路設定:需要什麼樣的網路拓撲?我需要將代理計算機放置在網路中的哪個位置?
  • 設定:為了接收和轉送所有傳入和傳出流量,我需要在代理上配置什麼?我不想更改主機設備上的設定。將它們連接到網路就足夠了。
  • 可程式性:為了使用 Python 讀取/修改/寫入/發送/阻止訊息/封包,我需要另外設定什麼?
  • 限制:這樣的設定是否會對我的網路速度產生嚴重影響?

--- 編輯 --- 我取得了一些進展並創建了一個接受傳入連接的 python 腳本。此外,我將另一台機器的 wifi 連線設定為使用第一台機器作為閘道。我現在成功接收訊息,但問題是,我不知道它們實際上應該發送到哪裡。我假設我必須更改套接字配置並使用透明代理,但我沒有找到太多關於如何在 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 套接字庫非常適合 C 套接字 API)

5)使用tcpdump記錄不同電腦上程式之間的流量,並使用Wireshark檢查包

6) 嘗試將代理伺服器(專用機器)新增至您的家庭 LAN 網路。

7) 安裝 Apache Web 伺服器、CuteFTP、SMPT Relay、MiniDLNA 等程式...

你可以用我的奇茨希特用於 linux 實驗網絡相關的東西

8) 嘗試建立您自己的 SSL 證書,以保護網路中電腦之間的連線。

對您問題的答覆:

網路設定:代理程式像其他機器一樣放置在網路上。但所有機器都引用它(將其用作“網關”)。

設定:所有機器都需要透過設定參數獲知代理(連接埠、位址)。

可程式性:沒有。它開箱即用。

限制:這樣的設定是否會對我的網路速度產生嚴重影響?不。

相關內容