TUNTAP を使用して Python トンネリング プロジェクトに取り組んでいます。TUNTAP インターフェイスで受信したデータには、すべてのヘッダーを含む元の IP パケットが含まれています。私は2つのうちの1つを行うことができます。
受信側は Twisted で聞いています。発信側には、IP パケットをダンプする raw ソケットがあります。パケットをダンプする前に、プログラムは送信元アドレスをサーバーのアドレスと交換します。また、TCP および UDP チェックサムを再計算します。また、次のいずれかの方法を使用してポートをスワップします。この情報は NAT テーブルで追跡されます
1) 次のように、ユーザーごとに 1 つのポートを使用します。
US.ER.01.IP:10000 ----> SE.RV.ER.IP:3000 ----> facebook.com:80
US.ER.01.IP:10001 ----> SE.RV.ER.IP:3000 ----> facebook.com:80
US.ER.02.IP:3000 ----> SE.RV.ER.IP:3001 ----> facebook.com:80
2 番目のユーザーが 1 秒で facebook を同時に要求した場合、これは問題を引き起こす可能性がありますか? システムは、Facebook の返信をどのようにルーティングするかをどのように知るのでしょうか。ポート 3000 で着信しているため、user1 に属していますが、10000 または 10001 にマップされますか?
2) 次のような接続ごとに一意のポートを使用します。
US.ER.01.IP:10000 ----> SE.RV.ER.IP:3000 ----> facebook.com:80
US.ER.01.IP:10001 ----> SE.RV.ER.IP:3001 ----> facebook.com:80
US.ER.02.IP:3000 ----> SE.RV.ER.IP:3002 ----> remoteHost.com:22
NAT テーブルからエントリを削除するタイミングを知るにはどうすればよいですか? この方法を使用すると、NAT テーブルがすぐにいっぱいになることがわかりました。これに対する解決策は次のとおりです。
I could wit for FIN packets from the server. This will not work with UDP though.
I could age the NAT entry on each hit. I could then run garbage collection
every N seconds. I see this being an issue if garbage collection runs
and how would a server's delayed response get to the proper host if it gets
deleted from the table.
raw ソケットからの読み取りの問題もあります。送信方法は知っていますが、個々の IP パケットを受信することは可能でしょうか。raw ソケットは、sock.recieve(65535) 呼び出しごとに 1 つのパケットを受信し、複数の IP パケットを受信する可能性がありますか?
どの実装が最適ですか? 他に気をつけるべきヒントやことはありますか?
編集:
わかりましたので、N個のクライアントがいます。誤解されている場合は、enitre /30 がクライアントとそれ自体の間で使用されます。トンネルを可能にするのは単なる抽象化です。私もそれが問題だとは思いませんでしたが、websocket は実際には LAN 上の「プロキシ」を通過します (IPdata は単純に新しい websocket に再パッケージ化されますが、マッピングは一意です)。説明をそれほど混乱させたくありませんでした。これがどのように変化するかわかりません。
Client PC CLIENT PC Client PC----->LAN INTERNET
Client 1: 10.1.1.2 ----> 10.1.1.1 ----> Websocket(IPdata) ----> Browser ---> newWebSocket(IPData) ----> SE.RV.ER.IP
Client 2: 10.1.1.4 ----> 10.1.1.3 ----> Websocket(IPdata) ----> Browser ---> newWebSocket(IPData) ----> SE.RV.ER.IP
Client 3: 10.1.1.6 ----> 10.1.1.5 ----> Websocket(IPdata) ----> Browser ---> newWebSocket(IPData) ----> SE.RV.ER.IP
各クライアントは、そのデフォルト ルートをトンネル エンドポイント (たとえば 10.1.1.1) に設定します。クライアントは IP データグラムを取得し、それを Websocket に入れ、その Websocket を LAN 上のブラウザーに送信します。次に、LAN はそれをサーバー (またはおそらく別のプロキシ) に送信します。Websocket の内部には、元の IP データグラムが含まれています (ソースは 10.1.1.2 またはその他の内部 IP です)。
サーバーはインターネットから Websocket メッセージを受信することに注意してください。Pythonサーバーはこれをどのように使用しますか? それ自体で新しいトンネルを作成し、パケットをそのままトンネルにダンプし、適切にルーティングしますか?
それとも、マッピングを使用できますか?
この websocket チェーンを介してトンネル抽象化を「マップ」するにはどうすればよいでしょうか? クライアントにはインターネットへのルートはありませんが、インターネットにアクセスできる「ブラウザ」に到達できます。これは、VPN トンネルの場合と同じようです。抽象化は次のようになります。
Client 1: 10.1.1.2 ----> 10.1.1.1 ----> Websocket(IPdata) ----> Browser ---> newWebSocket(IPData) ----> SE.RV.ER.IP -> Internet
10.1.2.2------------------------------------------------------------------------------------> 10.1.2.1 ----> Internet
私を正しい軌道に乗せるためのリソースを知っていれば、それは素晴らしいことです!