TUNインターフェイスから読み取られたパケットは、同じTUNインターフェイスに書き戻されたときにその方法を見つけられません。
インターネットに接続されている1 NIC(eth0)のみのマシンで、TUNインターフェイスからIPパケットを読み取るアプリケーションを作成しました。次の場合があります。
次の手順を実行しました。
次に、次のコマンドを実行します。
ifconfig tun0 up ifconfig tun0 10.0.0.2 route add -net 0.0.0.0 netmask 0.0.0.0 dev tun0 echo 1 > /proc/sys/net/ipv4/ip_forward
これで、プログラムはパケットの読み取りを正常に開始します(そして、その内容を印刷/ログに記録します)。
書き戻されたパケットは、たとえばeth0またはアプリケーション層に戻るためのルートを見つけられません。たとえば、pingを実行すると次のようになります。
ping 4.2.2.4
および別の端末:
tshark -i tun0
Tun0がICMPエコーパケット(私のプログラムも)を認識していることがわかります。
10.0.0.2 → 4.2.2.4 ICMP 84 Echo (ping) request id=0x14b1, seq=2/512, ttl=64
10.0.0.2 → 4.2.2.4 ICMP 84 Echo (ping) request id=0x14b1, seq=3/768, ttl=64
10.0.0.2 → 4.2.2.4 ICMP 84 Unknown ICMP (obsolete or malformed?)
私のプログラムはパケットをtun0に書き戻し、tshark
はそれを確認します(上記のスニペット)
ただし、ICMP要求はeth0に到達しないため、4.2.2.4
への道を見つけることができます。私見では、ルーティングルールに問題がありますが、変更方法がわかりませんでした。
コメントは大歓迎です、よろしくお願いします
もちろん、ルーティングルールに問題があります。カーネルにすべてのパケットをtun0
:)からルーティングするように指示しました。そのパケットをtun0
に送り返すと、tun0
ではなく、再びeth0
からルーティングされます。あなたの場合のように聞こえる場合を除いて、パケットは「リバースパスフィルター」のためにドロップされます。つまり、パケットが入ったのと同じインターフェースからパケットをバウンスすることを拒否します。