要約

要約

要約

システムからのすべての送信トラフィックを tun0 デバイスにルーティングし、DNS パケットでラップしてからインターネットに送信するようにしたいのですが、DNS パケットも tun0 デバイスにルーティングされます。

背景

私が取り組んでいるプロジェクトの一環として、TCP トラフィックのないシステム (すべての TCP トラフィックがドロップされる) に DNS トンネルを実装する必要があります。

私はこれを Python で実装することに決めましたが、トラフィックをルーティングする方法を理解する際に問題に遭遇しました。

セットアップは、TCP を使用できないクライアント コンピューター上のエージェントと、ネットワーク制限のないサーバーから構成されます。

現在は、クライアントからサーバーへの送信トラフィックのみをアドレス指定しています。

私がクライアントに対して現在採用したいアプローチは次のとおりです。

  1. tun0クライアントシステム上にインターフェースを作成する
  2. すべての送信トラフィックをそのインターフェース経由でルーティングします。
  3. Python プログラムにそのインターフェースを listen させます。発信パケットは、インターネットに接続されているインターフェース (私の場合ens33) を介してインターネットに送信される DNS クエリでラップされます。

tun デバイスを作成するために、次のものを使用しました。

from pytun import TunTapDevice

tun = TunTapDevice(name=”tun0”)
tun.addr = '10.8.0.1'
tun.dstaddr = '10.8.0.2'
tun.netmask = '255.255.255.0'
tun.mtu = 1500

tun.up()

tun0インターフェースにトラフィックをルーティングするために、私は

sudo ip route add default via 10.8.0.1 dev tun0

問題

トラフィックは Python プログラムにルーティングされ、デバイスからパケットを読み取ることができますが、新しい DNS パケット (パケット内に元のデータを含む) を構築した後、インターフェイス経由でパケットをインターネットに送信しようとするens33と、要求が tun0 インターフェイスから送信されようとしていることがtcpdumpわかります。wireshark

自分のプログラムからではないパケットだけを tun0 にルーティングするにはどうすればよいでしょうか。この概念は VPN に似ているように思えますが、VPN プログラムはどのようにこれを実行するのでしょうか。

ご協力ありがとうございます。ご不明な点や編集が必要な場合はコメントしてください。

関連情報