管理バむクオヌバヌレむネットワヌクでのトンネルの断片化の远跡

叙情的な玹介



管理者が予期しない問題以前は動䜜しおいたが、曎新埌に突然停止したに遭遇した堎合、戊闘たたは飛行ずいう2぀の可胜な動䜜アルゎリズムがありたす。 ぀たり、問題を最埌たで理解するか、その本質を掘り䞋げるこずなく問題から脱出するかのいずれかです。 ゜フトりェア曎新のコンテキストでは、ロヌルバックしたす。



アップグレヌドが倱敗した埌にロヌルバックする-これは悲しいベストプラクティスず蚀えたす。 ロヌルバックの準備方法、ロヌルバックの実行方法、およびロヌルバックに倱敗した堎合の察凊方法に関するマニュアル党䜓がありたす。 industry病な行動の業界党䜓。



別の方法は、最埌を理解するこずです。 これは誰も成功を玄束しない非垞に難しい方法であり、費やされる劎力の量は結果ず比范できず、出力は䜕が起こったのかを少しだけ理解するだけです。



ドラマのプロット



Webzillのむンスタントサヌバヌクラりド。 nova-computeホストの定期的な曎新。 新しいラむブむメヌゞPXEロヌディングを䜿甚、フルフィルメントシェフ。 すべお順調です。 突然、クラむアントからの苊情「仮想マシンの1぀が奇劙に動䜜し、動䜜しおいるように芋えたすが、実際の負荷が始たるず、すべおがフリヌズしたす。」 クラむアントむンスタンスを別のノヌドに転送するず、クラむアントの問題は解決したす。 問題が始たりたす。 このノヌトでむンスタンスを起動したす。 写真Cirrosでのsshログむンが成功し、Ubuntuではフリヌズしたした。 ssh -vは、すべおが「debug1SSH2_MSG_KEXINIT sent」ステヌゞで停止するこずを瀺したす。



すべおの可胜な倖郚デバッグ方法が機胜したす-メタデヌタが取埗され、DHCPリヌスがむンスタンスによっお曎新されたす。 むンスタンスがMTUでDHCPオプションを受信しないずいう疑いがありたす。 Tcpdumpは、オプションが送信されおいるこずを瀺したすが、むンスタンスがそれを受け入れるかどうかは䞍明です。



本圓にむンスタンスに到達したいのですが、取埗できるCirrosではMTUが正しく、UbuntuではMTU問題に぀いお疑念があるため、取埗できたせん。 しかし、本圓にしたい。



これがMTUの問題である堎合、突然のヘルパヌがいたす。 これはIPv6です。 「癜い」IPv6を割り圓おないずいう事実にもかかわらず申し蚳ありたせんが、openstackではただ実皌働に察応しおいたせん、リンクロヌカルIPv6は機胜したす。



2぀のコン゜ヌルを開きたす。 ネットワヌクノヌドごずに1぀。 ネットワヌク名前空間に䟵入したす。



 sudo stdbuf -o0 -e0 ip net exec qrouter-271cf1ec-7f94-4d0a-b4cd-048ab80b53dc / bin / bash


stdbufを䜿甚するず、ip netのバッファリングを無効にするこずができたす。これにより、画面の出力がリアルタむムで衚瀺され、遅延は発生したせん。ipnet execは、指定されたネットワヌク名前空間でコヌドを実行したす。bashはシェルを提䟛したす。



2番目のコン゜ヌルで、compute-nodeを開いお、tcpdumpをubuntuのタップにtcpdump -ni tap87fd85b5-65



たす tcpdump -ni tap87fd85b5-65







内郚名前空間から、すべおのノヌドのリンクロヌカルマルチキャストを芁求したすこの蚘事はipv6に関するものではありたせんが、䜕が起こっおいるかの本質です各ノヌドには、FE80 ::で始たるipv6アドレスが自動的に生成され、さらに、各ノヌドはマルチキャストアドレスをリッスンしお応答したすノヌドの圹割に応じお、マルチキャストのリストは異なりたすが、各ノヌドは少なくずも、すべおのノヌド、぀たりアドレスFF02 :: 1に応答したす。 そのため、マルチキャストpingを実行したす。



 ping6 -I qr-bda2b276-72 ff02 :: 1
 PING ff02 :: 1ff02 :: 1from fe80 :: f8163efffe0ac6a8 qr-bda2b276-7256デヌタバむト
 fe80から64バむト:: f8163efffe0ac6a8icmp_seq = 1 ttl = 64 time = 0.040 ms
 fe80から64バむト:: f8163efffe1035e7icmp_seq = 1 ttl = 64 time = 0.923 msDUP
 fe80から64バむト:: f8163efffe4a8bcaicmp_seq = 1 ttl = 64 time = 1.23 msDUP
 fe80から64バむト:: 54e35efffe878637icmp_seq = 1 ttl = 64 time = 1.29 msDUP
 fe80から64バむト:: f8163efffeec3ebicmp_seq = 1 ttl = 255 time = 1.43 msDUP
 fe80から64バむト:: f8163efffe428927icmp_seq = 1 ttl = 64 time = 1.90 msDUP
 fe80から64バむト:: f8163efffe62e6b9icmp_seq = 1 ttl = 64 time = 2.01 msDUP
 fe80から64バむト:: f8163efffe4d53aficmp_seq = 1 ttl = 64 time = 3.66 msDUP


疑問が生じたす-誰が誰ですか 順番に、入力しようずするず、䞍䟿で長いです。



次のりィンドりの暪にあるtcpdumpは、関心のあるむンスタンスのむンタヌフェむスをリッスンしおいたす。 そしお、その䞭に、私たちが興味を持っおいるIPである1぀のIPからの答えがありたす。 これはfe80 :: f8163efffeec3ebであるこずが刀明したした。



次に、sshを介しおこのノヌドに接続したす。 しかし、 ssh fe80::f816:3eff:feec:3eb



を詊しおみた人は誰でも驚きたす-「無効な匕数」。



その理由は、リンクロヌカルアドレスは「そのように」䜿甚するこずはできず、リンクむンタヌフェむス内でのみ意味があるためです。 ただし、sshには「このような発信IP /むンタヌフェむスなどを䜿甚する」オプションはありたせん。 幞いなこずに、IPアドレスにむンタヌフェむス名を指定するオプションがありたす。



ssh fe80::f816:3eff:feec:3eb% qr-bda2b276-72



を実行したす。 はい、はい、私はあなたのinりず圓惑を理解しおいたすあなたがそれを持っおいない堎合-あなたは本圓のオタクではないか、IPv6で長幎仕事をしおいたす。 「Fe80 :: f8163efffeec3ebqr-bda2b276-72」はそのような「IPアドレス」です。 これらの匕甚笊で皮肉の皋床を䌝えるのに十分な蚀語がありたせん。 パヌセントおよびむンタヌフェヌス名を含むIPアドレス。 誰かがhttp// [fe80 :: f8163efffeec3ebeth1] /secret.fileのようなものをWebサヌバヌロケヌルのサヌバヌからいく぀かのWebサむトにアップロヌドするずどうなるかは興味深い...



...そしお、私たちは仮想マシン䞊にいたす。 なんで 必須のPMTUDのおかげで、IPv6はIPv4よりも悪いMTU状況を凊理するのに優れおいるためです。 したがっお、仮想マシン䞊にいたす。



間違ったMTU倀が衚瀺され、cloud-initログにアクセスしお、その理由を突き止めるこずを期埅しおいたす。 しかし、ここに驚きがありたす-MTUは正しいです。 おっず



デバッグの荒野で



突然、ロヌカルで理解可胜な問題が完党に理解䞍胜になりたす。 MTUは正しいが、パケットはドロップしおいる... ...慎重に考えれば、問題は最初からそれほど単玔ではなかった-むンスタンスの移行によっおMTUが倉曎されるべきではなかった。



苊しいデバッグが始たりたす。 tcpdump、ping、および2぀のむンスタンスおよびネットワヌクノヌドのネットワヌク名前空間を䜿甚しお、次のこずがわかりたす。





おっず 倧きな荷物が到着したすが、垰りに迷子になりたす。 非察称ルヌティングず蚀いたすが、隣接するスむッチポヌトにある堎合のルヌティングは䜕ですか



回答に现心の泚意を払っおください。回答はむンスタンスに衚瀺されたす。 答えはタップで衚瀺されたす。 しかし、答えはネットワヌク名前空間では芋えたせん。 そしお、ネットワヌクノヌドずコンピュヌタヌの間のmtuずパケットの状況はどうですか 内郚的には、私はすでに勝利を収めおいる、ず圌らは蚀う、私は問題を芋぀けた。 Rraz-および倧pingが実行されたす。



なに そしお長い間困惑した䌑止。



次に䜕をすべきかは明らかではありたせん。 元の問題に戻りたす。 MTUは悪いです。 どのMTUが良いですか 実隓を開始したす。 分割前の倀からマむナス14バむト。 マむナス14バむト。 䞀䜓どうしお ゜フトりェアのアップグレヌド埌 私はvimdiffをパッケヌゞのリストにしたした。カヌネル、ovs、libcなどを含む玄80個の曎新されたパッケヌゞを扱う芋蟌みがあるず思いたす。 そのため、退华するには2぀の方法がありたす。MTUを14バむト䞋げるか、曎新をロヌルバックしお震えたす。



クラむアントが監芖ではなく問題を報告したこずを思い出させおください。 MTUはクラむアント蚭定であるため、「DFフラグで倧きなパケットを枡さない」こずは、完党なむンフラストラクチャの問題ではありたせん。 それはむンフラストラクチャの問題ではありたせん。 ぀たり、アップグレヌドが原因ではなく、次の日食ず昚日の雚が原因である堎合、誰かが苊情を申し立おるたで、問題が戻っおくるこずすらわかりたせん。 曎新に぀いお震え、未知のものを恐れたす。これは事前にはわかりたせんか ありがずう、プロずしおの人生を倢芋おきた芋通し。 そしお、MTUを䞋げおも、なぜ14バむトなのでしょうか 明日が20だったらどうなりたすか たたは、石油の䟡栌が45に䞋がりたすか それず䞀緒に暮らすには



ただし、確認したす。 実際、MTUはDHCPオプションでわずかに䜎く、再起動したむンスタンスは正垞に機胜したす。 しかし、これはオプションではありたせん。 どうしお



最初からやり盎したす。 叀いMTUであるtcpdumpトレヌスパッケヌゞを再床返したす。答えは、むンスタンスのむンタヌフェむス、tap'eに衚瀺されたす...ノヌドのネットワヌクむンタヌフェむスでtcpdumpを確認したす。 たくさんの小さな迷惑な措氎ですが、grepを䜿甚するず、リク゚ストがGRE内で発生するこずがわかりたすが、答えは戻りたせん。



うん



少なくずも、プロセスのどこかで倱われおいるこずがわかりたす。 しかし、どこに 動䜜をラむブノヌドず比范するこずにしたした。 しかし問題は、「ラむブ」ノヌドでtcpdumpがパッケヌゞを衚瀺するこずです。 数千人。 ミリ秒で。 tengigabitethernet時代ぞようこそ。 Grepを䜿甚するず、この措氎から䜕かをキャッチできたすが、通垞のダンプを取埗するこずはできなくなり、この蚭蚈のパフォヌマンスには疑問が生じたす。



私達は問題に焊点を合わせたすtcpdumpを䜿甚しおトラフィックをフィルタリングする方法がわかりたせん。 送信元、宛先、ポヌト、プロトなどでフィルタリングする方法は知っおいたすが、GRE内でIPアドレスでパケットをフィルタリングする方法はわかりたせん。 さらに、グヌグルはそれを非垞によく知らない。



ある時点たで、私はこの問題を無芖したした。修理がより重芁であるず信じおいたしたが、知識の䞍足が非垞に痛々しく噛み始めたした。 同僚私が質問に答えたkevitが察凊したした。リンクtcpdump -i eth1 'proto gre and ( ip[58:4] = 0x0a050505 or ip[62:4] = 0x0a050505 )'



。



うわヌ 私のwebdwanolクラりドの特異点におけるハヌドコア0xhex。 じゃあ あなたは生きるこずができたす。



残念ながら、ルヌルは正しく機胜しなかったか、正しく機胜したせんでした。 ブルヌトフォヌス法を䜿甚しおアむデアを぀かみ、必芁なオフセットを取埗したした送信元および宛先IPアドレスの54および58。 ケビットは、圌がオフセットを埗た堎所を瀺したしたが、それは非垞に説埗力がありたした。 IPヘッダヌ、GRE、IPヘッダヌ。



重芁な成果数ギガバむトの措氎で単䞀のパケットを正確に芋るためのツヌルを埗たした。 パッケヌゞを芋る...ずにかく、䜕も明確ではありたせん。



Tcpdumpは私たちの友人ですが、wiresharkの方が䟿利です。 私はtsharkに぀いお知っおいたすが、それも䞍䟿です。 パケットダンプを実行しtcpdump -w dump、実行可胜になりたした、マシンにドラッグしお敎理し始めたす。 私は䞀般的な腐食性からバむアスに察凊するこずに決めたした。 Wiresharkで開いお、参照しおください...







ヘッダヌのサむズを調べお、IPパケットの先頭の正しいオフセットが46ではなく42であるこずを確認したす。この゚ラヌを誰かの䞍泚意に曞き留めお、翌日、それを把握し続けるこずに決め、垰宅したした。



すでに家の近くのどこかで、それが私に珟れたした。 ヘッダヌの構造に関する最初の仮定が正しくない堎合、これはトンネリング時のGREからのオヌバヌヘッドが異なるこずを意味したす。



むヌサネットヘッダヌ、VLAN、IPヘッダヌ、GREヘッダヌ、カプセル化されたIPパケット...



やめお しかし、写真の芋出しはたったく異なりたす。 neutronのGREはIPパケットをカプセル化したせんが、むヌサネットフレヌムをカプセル化したす。 蚀い換えれば、MTU GREのどの郚分がそれ自䜓を食べるかに぀いおの最初の仮定は間違っおいたす。 GREは、予想よりも14バむト倚く「受け取り」たす。



neutronは、GREを䜿甚しおIP経由でオヌバヌレむネットワヌクを構築したす。これはL2ネットワヌクです。 もちろん、カプセル化されたむヌサネットヘッダヌが必芁です。



぀たり、MTUは14バむト少なくする必芁がありたす。 最初から。 ネットワヌクを蚈画したずき、GREによるMTUの削枛に぀いおの仮定が間違っおいたした。 パケットの断片化を匕き起こすため、かなり深刻です。



さお、゚ラヌは明らかです。 しかし、曎新埌に機胜しなくなったのはなぜですか 以前の研究によるず、問題はMTU、GREヘッダヌの誀ったカりント、GREパケットのフラグメンテヌションに関連しおいるこずが明らかになりたした。 断片化されたパケットの通過が停止したのはなぜですか



慎重か぀綿密なtcpdumpで答えが瀺されたした。GREはDNF断片化しないフラグずずもに送信され始めたした。 フラグは、内郚にDNFフラグを含むIPパケットをカプセル化したGREパケットにのみ衚瀺されたした。぀たり、フラグはペむロヌドからGREにコピヌされたした。



確かに、私は叀いノヌドを芋たした-それらはGREを断片化したした。 メむンパケットず、14バむトのペむロヌドを持぀テヌルがありたした。 これは倱敗です...



アップグレヌド埌に開始された理由を調べるこずは残っおいたす。



ドキュメントを読む



最も疑わしい回垰パッケヌゞはLinuxずOpenvswitchでした。 Readme / changelog / newsは特別なこずを明確にしたせんでしたが、gitむンスペクション答えはここにありたす。なぜドキュメントにアクセスするためにオヌプン゜ヌスコヌドが必芁なのかは非垞に興味深いこずを明らかにしたした。



コミットbf82d5560e38403b8b33a1a846b2fbf4ab891af8
䜜成者Pravin B Shelar <pshelar@nicira.com>
日付月10月13日02:02:44 2014 -0700

    デヌタパスcompatコンパむル3.11を修正
    
    カヌネル3.11はGRE APIが利甚可胜なカヌネルのみですが、
     vxlanではありたせん。 このケヌスを怜出するには、vxlan xmitのチェックを远加したす。




パッチ自䜓は興味深いものを衚しおおらず、問題の本質には適甚されたせんが、ヒントを提䟛したすカヌネルのGRE API。 そしお、3.8から3.13ぞのアップグレヌドが行われたした。 Google in bing ...カヌネルのgit.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=aa310701e787087dbfbccf1409982a96e16c57a6のopenvswitchデヌタパスモゞュヌルにパッチがありたす。 ぀たり、カヌネルがGREサヌビスの提䟛を開始するず、openvswitchカヌネルモゞュヌルはgre凊理をip_greカヌネルモゞュヌルに枡したす。 私たちはip_gre.cコヌドを研究しおいたす。その䞭のコメントに感謝したす。はい、私たちは皆、tsiskaを「愛しおいたす」。



切望されたラむンはここにありたす



 static int ipgre_fill_info(struct sk_buff *skb, const struct net_device *dev) { struct ip_tunnel *t = netdev_priv(dev); struct ip_tunnel_parm *p = &t->parms; if (nla_put_u32(skb, IFLA_GRE_LINK, p->link) || .... nla_put_u8(skb, IFLA_GRE_PMTUDISC, !!(p->iph.frag_off & htons(IP_DF))))
      
      







぀たり、カヌネルはカプセル化されたパケットのヘッダヌからIP_DFをコピヌしたす。



突然興味深い興味深いトピックLinuxは元のパッケヌゞからTTLもコピヌしたす。぀たり、GREトンネルはカプセル化されたパッケヌゞからTTLを「継承」したす



ドラむスクむヌズ



地球が飛行方向に向いたため、飛行機がcrash萜したした。



むンストヌルの初期セットアップ䞭に、誀った仮定の䞀郚ずしお仮想マシンのMTUを蚭定したす。 フラグメンテヌションメカニズムにより、パフォヌマンスがわずかに䜎䞋したした。 カヌネルを3.8から3.13にアップグレヌドした埌、OVSはip_gre.cカヌネルモゞュヌルに切り替え、元のIPパケットからフラグメント化しないフラグをコピヌしたす。 ヘッダヌを远加した埌にMTUに「適合」しなかった倧きなパケットは、断片化されなくなりたしたが、ドロップされたした。 GREがドロップされ、その䞭にパケットが含たれおいなかったため、TCPセッションの参加者パケットの送信はICMP「劚害」アラヌトを受信したせんでした。぀たり、より小さいMTUに適応できたせんでした。 次に、IPv6はフラグメンテヌションを予期せずIPv6にはない、倧きなパケットの損倱を正しい方法で凊理し、パケットのサむズを瞮小したした。



誰が責任を負い、䜕をすべきか



私たちのせいです-誀っおMTUを蚭定したす。 ゜フトりェアのほずんど目立たない動䜜は、゚ラヌがIPv4の動䜜を混乱させ始めたずいう事実に぀ながりたした。



どうする dnsmasq-neutron.conf蚭定のMTUを修正しオプションdhcp-option-force=26,



、クラむアントに「スタンド」を䞎えたしたオプションず共にDHCP経由でアドレスのリヌスを曎新したす。問題は完党に解決したした。



これを監芖するこずで予防的に怜出できたすか 正盎なずころ、合理的なオプションはありたせん-蚺断は非垞に繊现で耇雑であり、クラむアントむンスタンスからの極端な協力が必芁ですこれに頌るこずはできたせん-突然、誰かが、圌自身のニヌズに応じお、iptablesを䜿甚しお奇劙なこずを曞きたすか 。



叙情的な結論



゜フトりェアの前のバヌゞョンにco病にロヌルバックし、「動䜜する-觊らない」、「曎新するず䜕が倉わるかわからないので、再び曎新されるこずはありたせん」ずいう立堎を取る代わりに、デバッグに1日玄2人がかかりたした。しかし、ロヌカル可芖回垰が解決されただけでなく、既存の構成で゚ラヌが怜出および修正され、ネットワヌクからのオヌバヌヘッドが増加したした。 問題の解消に加えお、䜿甚されおいる技術の理解が倧幅に向䞊し、ネットワヌクの問題をデバッグする技術が開発されたしたGRE内のフィヌルドによるtcpdumpのトラフィックのフィルタリング。



コメント-パワヌ



突然、コメントの䞭で、 ildarzはこのようなものを芋぀ける方法に぀いお玠晎らしいアむデアを提案したした-IP統蚈を芋お、増加するフラグメント/ proc / net / snmp、netstat -sに反応したす。 この問題に぀いおはただ調査しおいたせんが、非垞に有望です。



All Articles