web-dev-qa-db-ja.com

TUNデバイスからのパケットの送信

システム内のすべてのトラフィックをユーザースペースプログラムに通そうとしています。この目的のために、TUNデバイスを作成し、そこからパケットを読み取り、そのまま書き戻すプログラムを作成しました。次に、次の方法でルーティングを操作しようとしています。

まず、ローカル以外のすべてをトンネルにリダイレクトします。これは正しく機能します。

ip link set tun0 up
ip addr add 10.0.0.1/24 dev tun0
echo 100 test >> /etc/iproute2/rt_tables
ip route add default via 10.0.0.2 dev tun0 table test
ip rule add from all lookup test priority 10000

次に、トンネルから物理デバイスにパケットをルーティングします。 これは問題のあるステップです

echo 101 test0 >> /etc/iproute2/rt_tables
ip route add default via 172.31.4.1 dev wlp3s0 table test0
ip rule add from all iif tun0 lookup test0 priority 9000

私の考えによれば、そのような構成はデフォルトとしてインターネットアクセスを提供するはずです。しかし、そうではありません。

Iptablesでロギングを使用すると、パケットはtun0デバイスに正しく到達して離れますが、その後消えますであることがわかりました。詳細については、次のようなことをしています。

iptables -t mangle -A PREROUTING -i tun0 -j LOG --log-prefix "From tun0: "
iptables -t mangle -A PREROUTING -i tun0 -j MARK --set-mark 0x7
iptables -t mangle -A POSTROUTING -m mark --mark 0x7 -j LOG --log-prefix "From tun0 (postrouting): "

PREROUTINGステップのパケットは、syslogで検出されますが、POSTROUTINGステップ、およびマングルテーブルの他のチェーン(INPUTFORWARDOUTPUT)はそうではありません。

デバイスに書き込む代わりに、生のIPソケットを使用してパケットを送信することをすでに考えていますが、それでもTUNとルーティングポリシーで可能でなければならないと考えています。

どんなアイデアも楽しみにしています。

2
user3778438

部分的な答え:

Linuxカーネルは、ネットワークインターフェイス(この場合はtun0)まったく同じマシンで発生し、ネットワークのどこかにルーティングの設定ミスがあると見なし(ルーティングループが存在する必要があります。そうしないと、パケットが返されません)、ネットワークのフラッディングを防ぐためにパケットをすぐにドロップします。

これをオフにすることはできますが(その方法の詳細を忘れたので、調べなければなりません)、正しい解決策はおそらく、あなたがしていることではなく、何か他のことをすることです。

たとえば、MITM攻撃を実行する2番目のホストをシミュレートするには、twoTUNインターフェイスを作成し、最初のホストから読み取り、操作されたパケットを2番目のホストに書き込みます。発信パケットは、着信パケットに対して同じことを(場合によっては異なる操作で)実行してから、2番目のTUNインターフェイスを物理インターフェイスと一緒にネットワーク名前空間に配置します。

詳細は、あなたが私たちに伝えなかった最終的な目標が何であるかによって異なります(したがって、 XY問題 も読んでください。ここであなたのYは「ルーティングと一緒に単一のエコーTUNインターフェースが必要です」です)。

1
dirkt