IDS スタイルのデバイスにフィードするために、2 つの Linux (Centos 6) ホスト間で gretap トンネルを介してトランスポートしようとしています。
転送しようとしている複製された pkt で PMTU 検出が機能しないことを考えると、GRE pkt のヘッダーにある DF ビットをクリアする方法を見つける必要があります。これにより、送信側ホストによってフラグメント化され、再構築できるようになります。もう一方の端に。そうしないと、GRE オーバーヘッドが追加された後、大きな pkts (... 1500 バイトの nmark に近い) がサイレントにドロップされます。
上記のDFビットをクリアするためにiptablesプラグインを構成することを含む実用的な解決策を見つけましたが、その解決策は少し複雑すぎます。ここを参照してください: http://backreference.org/2013/07/23/gre-bridging-ipsec-and-nfqueue/ .
net/ipv4/ip_gre.c のソース コードをのぞき見したところ、興味深い行が見つかりました (ここから 432 行目あたり: https://github.com/torvalds/linux/blob/master/net /ipv4/ip_gre.c ):
df = key->tun_flags & TUNNEL_DONT_FRAGMENT ? htons(IP_DF) : 0;
iptunnel_xmit(skb->sk, rt, skb, fl.saddr, key->u.ipv4.dst, IPPROTO_GRE,
key->tos, key->ttl, df, false);
return;
特に最初の行は、いくつかのロジックが条件付きで発信 GRE pkt の DF ビットを設定できるように思われます。コードを正しく理解していると仮定すると、pkts は DF ビットを設定せずに Linux ホストを離れることができ、フラグメンテーションが可能になります。
key->tun_flags の値を設定して、条件文の結果が「0」になる方法を見つけようとしましたが、それを可能にする CLU が見つかりませんでした (ip li, ifconfig、udevadm など...)。
key->tun_flags の値を操作する方法を知っている人はいますか?