
要約
システムからのすべての送信トラフィックを tun0 デバイスにルーティングし、DNS パケットでラップしてからインターネットに送信するようにしたいのですが、DNS パケットも tun0 デバイスにルーティングされます。
背景
私が取り組んでいるプロジェクトの一環として、TCP トラフィックのないシステム (すべての TCP トラフィックがドロップされる) に DNS トンネルを実装する必要があります。
私はこれを Python で実装することに決めましたが、トラフィックをルーティングする方法を理解する際に問題に遭遇しました。
セットアップは、TCP を使用できないクライアント コンピューター上のエージェントと、ネットワーク制限のないサーバーから構成されます。
現在は、クライアントからサーバーへの送信トラフィックのみをアドレス指定しています。
私がクライアントに対して現在採用したいアプローチは次のとおりです。
tun0
クライアントシステム上にインターフェースを作成する- すべての送信トラフィックをそのインターフェース経由でルーティングします。
- 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 プログラムはどのようにこれを実行するのでしょうか。
ご協力ありがとうございます。ご不明な点や編集が必要な場合はコメントしてください。