首先,我的設定:
- 電纜調變解調器和 Fritz!Box 將我連接到互聯網
- 透過網路線連接到 Fritz Box 的 PC
- 多個 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 證書,以保護網路中電腦之間的連線。
對您問題的答覆:
網路設定:代理程式像其他機器一樣放置在網路上。但所有機器都引用它(將其用作“網關”)。
設定:所有機器都需要透過設定參數獲知代理(連接埠、位址)。
可程式性:沒有。它開箱即用。
限制:這樣的設定是否會對我的網路速度產生嚴重影響?不。