web-dev-qa-db-ja.com

ホームネットワークプロキシサーバー

まず、私の設定:

  1. ケーブルモデムとインターネットに接続するFritz!Box
  2. ネットワークケーブルを介してFritzBoxに接続されたPC
  3. フリッツボックスにも接続された複数のWi-Fiデバイス

これが私が達成したいことです:私は別のマシン上にネットワークプロキシサーバーのようなものをセットアップしたいと思います。それは私のネットワーク内の任意のデバイスとインターネットの間のすべてのトラフィックを傍受し、(潜在的に)中継します。ネットワーク内のデバイス間のトラフィックは気にしません。特定のプロトコル/ポート/ IPアドレスのメッセージに制限されたくありません。私の主な目標は、ネットワーク/プロトコルなどについて学び、そのプロキシサーバーで複数のアプリケーションを実装したり遊んだりすることです。例は次のとおりです。

  • 進行中の通信があったすべてのIP /ポートに関する統計を収集します(つまり、基本的にすべてのトラフィックを転送し、いくつかのカウントを行います)
  • 一部のトラフィックをブロックします(たとえば、IPアドレスに基づいて、子供が表示されるべきではないものにアクセスできないようにします。ソフトウェアが私に関するプライバシー関連のデータを送信しないようにします)。
  • ホームネットワーク内の新しいデバイスについて警告する(例:誰かが私のWi-Fiを誤用している)
  • メッセージを転送する前にメッセージを変更する(たとえば、受信するWebコンテンツにテキストを追加する)
  • インターネット上のサーバーまたは接続されているデバイスの1つに独自のメッセージを送信します(たとえば、収集された使用統計情報をウェブインターフェースに表示します)
  • もっとたくさん...

Unix(/ Linux)マシンが利用可能であると仮定します。

  • ネットワーク設定:どのようなネットワークトポロジが必要ですか?ネットワークのどこにプロキシマシンを配置する必要がありますか?
  • 設定:すべての着信および発信トラフィックを送受信するには、プロキシで何を構成する必要がありますか?ホストデバイスの設定を変更したくない。それらをネットワークに接続するだけで十分です。
  • プログラマビリティ:Pythonを使用してメッセージ/パケットを読み取り/変更/書き込み/送信/ブロックするには、何を追加で設定する必要がありますか?
  • 制限事項:このような設定は、ネットワーク速度に深刻な影響を与えることを意味しますか?

---編集---少し進歩し、着信接続を受け入れるpythonスクリプトを作成しました。さらに、別のマシンのWi-Fi接続を、最初のマシンをゲートウェイとして使用するように設定しました。I今は正常にメッセージを受信できますが、問題は、実際にどこにメッセージを送信すればよいかわからないことです。ソケット構成を変更して透過プロキシを使用する必要があると思いますが、あまりわかりませんでした。実際に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
bln-tom

ここにいくつかの提案があります:

1)まず、ホームゲートウェイ(FritzBox)の管理ページにアクセスします。通常は、ブラウザを介した192.168.1.1へのユーザー名/パスワード接続です。 WAN、LAN、Wifiの設定を確認し、それについて読んでください。

2)Linuxおよびコマンドラインツールをインストールします:tcpdump、netstat、nc、telnet

3)ユーザーインターフェイスを備えた別のマシンウィンドウ/ Linuxを用意し、そこにWiresharkをインストールします

4)いくつかの単純な pythonソケットレベルのプログラム (pythonソケットライブラリはCソケットAPIにうまく適合します)を開発してみてください

5)tcpdumpを使用して異なるコンピューター上のプログラム間のトラフィックを記録し、Wiresharkを使用してパッケージを調べます

6)ホームLANネットワークにプロキシサーバー(専用機)を追加してみてください。

7)Apache Webサーバー、CuteFTP、SMPTリレー、MiniDLNAなどのプログラムをインストールします...

Linux用のmy cheetsheat を使用して、ネットワーク関連のものを試すことができます

8)ネットワーク内のコンピューター間の接続を保護するために、独自のSSL証明書を作成してみてください。

あなたの質問への回答:

ネットワーク設定:プロキシは他のマシンと同じようにネットワーク上に配置されます。しかし、すべてのマシンがそれを参照しています(「ゲートウェイ」として使用してください)。

設定:すべてのマシンは、構成パラメーターを介してプロキシ(ポート、アドレス)を通知される必要があります。

プログラマビリティ:なし。箱から出して動作します。

制限事項:このような設定は、ネットワーク速度に深刻な影響を与えることを意味しますか?番号。

1
Mitja Gustin