TUNデバイスを作成し、そのインターフェイスに入ってくるすべてのパケットをチェックし、スキャンが成功すると、変更されずにTUNに書き換えるアプリケーションがあります。 (ファイアウォールについて考えてください)パケットのソースは、ファイアウォールアプリケーションを実行するのと同じデバイスです。このシステム(VM、)は、デフォルトのルーティングテーブルを使用して10.0.2.15
他のシステム(ホスト、)に接続できます(設定は不要)。192.168.1.151
今私の問題は、ファイアウォールアプリケーションを介してパケットを送信するたびにカーネルがパケットを破棄するようです。具体的には、TUNインターフェイスでtcpdumpを実行すると、次のようになります。
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes
12:24:21.548119 IP 10.0.2.15 > 192.168.1.151: ICMP echo request, id 9967, seq 1, length 64
12:24:21.548248 IP 10.0.2.15 > 192.168.1.151: ICMP echo request, id 9967, seq 1, length 64
12:24:22.555972 IP 10.0.2.15 > 192.168.1.151: ICMP echo request, id 9967, seq 2, length 64
12:24:22.556087 IP 10.0.2.15 > 192.168.1.151: ICMP echo request, id 9967, seq 2, length 64
各パケットが2回記録されることがわかります。私のアプリに入るときは一度、アプリから出るときは一度。しかし、そこからそれは消えるように見えた。私のホストに出ることになっているインターフェイスでtcpdumpを実行すると、何も表示されません。
私の仮想マシンで以下を設定しました。
# enable forwarding and disable reverse path filtering
sudo sysctl net.ipv4.conf.default.rp_filter=0
sudo sysctl net.ipv4.conf.all.rp_filter=0
sudo sysctl net.ipv4.ip_forward=1
# routes for the packets to take
sudo ip rule add to 192.168.1.151/32 lookup 11 prio 11
sudo ip rule add iif tun0 lookup main priority 10
表 11 に TUN デバイスに着信するパケットを示します。動作原理はtcpdumpに示されています。
また、iptables FORWARDおよびOUTPUTチェーンをデフォルトでACCEPTに設定しました。また、パケットがリターンパスを見つけることができない問題を排除するために、UDPとnetcatを使用してトラフィックをテストしました。
私は何を見逃していますか?カーネルが私のパケットをドロップするのはなぜですか?
答え1
TUNデバイスを作成し、そのインターフェイスに入ってくるすべてのパケットをチェックし、スキャンが成功すると、変更されずにTUNに書き換えるアプリケーションがあります。
今私の問題は、ファイアウォールアプリケーションを介してパケットを送信するたびにカーネルがパケットを破棄するようです。
カーネルは、自分が送信するパケットが入ってくるのを見て、ネットワークのどこかにルーティングループがなければならないと結論付け、ネットワークがフラッディングされるのを防ぐためにパケットを破棄します。
この動作を無効にしてみましたが、TUNインターフェイスにローカルアドレスがあるため、rp_filter
これを設定する必要があります。accept_local
より良いアプローチは、実際にアプリケーションをファイアウォールとして使用し、2つのTUNインターフェイス(受信と送信)を作成し、その両方または両方を必要なネットワークネームスペース/ VMに移動することです。
これにより、ルーティングループのように見えることを回避できます。