まず、私のセットアップ:
- ケーブルモデムとインターネットに接続するためのFritz!Box
- ネットワークケーブルを介して Fritz Box に接続された PC
- 複数のWi-FiデバイスもFritz Boxに接続されています
私が実現したいことは次のとおりです。別のマシンにネットワーク プロキシ サーバーのようなものを設定し、ネットワーク内の任意のデバイスとインターネット間のすべてのトラフィックを傍受して (潜在的に) 中継します。ネットワーク内のデバイス間のトラフィックは気にしません。特定のプロトコル / ポート / IP アドレスのメッセージに限定したくありません。私の主な目標は、ネットワーク / プロトコルなどについて学び、複数のアプリケーションを実装して、そのプロキシ サーバーで試してみることです。例:
- 進行中の通信があったすべての IP / ポートに関する統計を収集します (つまり、基本的にすべてのトラフィックを転送し、いくつかのカウントを実行します)
- 一部のトラフィックをブロックする (例: IP アドレスに基づいて、子供が見るべきではないものにアクセスできないようにする。ソフトウェアが私に関するプライバシー関連のデータを送信するのを防ぐ)。
- 自宅のネットワークに新しいデバイスがある場合に警告する(例:誰かが私の Wi-Fi を悪用している場合)
- 転送する前にメッセージを変更する(例:受信したWebコンテンツにテキストを追加する)
- インターネット上のサーバーまたは接続されたデバイスの 1 つに独自のメッセージを送信する (例: 収集された使用状況統計を Web インターフェイスに表示する)
- その他多数...
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 %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 リレー、MiniDLNA などのプログラムをインストールします。
私のチートシーツLinuxでネットワーク関連の実験をするため
8) ネットワーク内のコンピュータ間の接続を保護するために、独自の SSL 証明書を作成してみてください。
ご質問への回答:
ネットワーク設定: プロキシは他のマシンと同様にネットワーク上に配置されます。ただし、すべてのマシンがプロキシを参照します (「ゲートウェイ」として使用します)。
設定: 構成パラメータを介してすべてのマシンにプロキシ (ポート、アドレス) を通知する必要があります。
プログラミング性: 何も必要ありません。そのまますぐに使えます。
制限事項: このような設定はネットワーク速度に重大な影響を与えるでしょうか? いいえ。