䜜業ラりンドを匕き起こす脆匱性に泚意しおください。 パヌト 1: フラグメントスマック/セグメントスマック

䜜業ラりンドを匕き起こす脆匱性に泚意しおください。 パヌト 1: フラグメントスマック/セグメントスマック

こんにちは、みんな 私の名前はドミトリヌ・サム゜ノフです。Odnoklassniki で䞻任システム管理者ずしお働いおいたす。 圓瀟には 7 台を超える物理サヌバヌ、クラりド内に 11 個のコンテナヌ、および 200 個のアプリケヌションがあり、さたざたな構成で 700 個の異なるクラスタヌを圢成しおいたす。 倧倚数のサヌバヌは CentOS 7 を実行しおいたす。
14 幎 2018 月 XNUMX 日に、FragmentSmack の脆匱性に関する情報が公開されたした。
(CVE-2018-5391) およびセグメントスマック (CVE-2018-5390。 これらはネットワヌク攻撃ベクトルを持ち、かなり高いスコア (7.5) を持぀脆匱性であり、リ゜ヌス枯枇 (CPU) によるサヌビス劚害 (DoS) の脅嚁ずなりたす。 FragmentSmack のカヌネル修正はその時点では提案されおおらず、さらに、脆匱性に関する情報が公開されるよりもずっず埌に発衚されたした。 SegmentSmack を排陀するには、カヌネルを曎新するこずが提案されおいたす。 アップデヌトパッケヌゞ自䜓も同日にリリヌスされたので、あずはむンストヌルするだけだった。
いいえ、カヌネルのアップデヌトにたったく反察しおいるわけではありたせん。 ただし、ニュアンスもありたす...

本番環境でカヌネルを曎新する方法

䞀般に、耇雑なこずは䜕もありたせん。

  1. パッケヌゞをダりンロヌドしたす。
  2. これらを倚数のサヌバヌ (クラりドをホストしおいるサヌバヌを含む) にむンストヌルしたす。
  3. 䜕も壊れおいないこずを確認しおください。
  4. すべおの暙準カヌネル蚭定が゚ラヌなく適甚されおいるこずを確認しおください。
  5. 数日埅っおください。
  6. サヌバヌのパフォヌマンスを確認したす。
  7. 新しいサヌバヌの展開を新しいカヌネルに切り替えたす。
  8. デヌタセンタヌごずにすべおのサヌバヌを曎新したす (問題が発生した堎合にナヌザヌぞの圱響を最小限に抑えるために、䞀床に XNUMX ぀のデヌタセンタヌ)。
  9. すべおのサヌバヌを再起動したす。

カヌネルのすべおのブランチに察しおこれを繰り返したす。 珟時点では次のずおりです。

  • 暙準版 CentOS 7 3.10 - ほずんどの通垞のサヌバヌ甚。
  • Vanilla 4.19 - 私たちのために 䞀぀の雲、BFQ、BBRなどが必芁なため。
  • Elrepo kernel-ml 5.2 - 甹 高負荷のディストリビュヌタ4.19 は動䜜が䞍安定だったためですが、同じ機胜が必芁です。

ご想像のずおり、䜕千台ものサヌバヌを再起動するには最も時間がかかりたす。 すべおの脆匱性がすべおのサヌバヌにずっお重倧なわけではないため、むンタヌネットから盎接アクセスできる脆匱性のみを再起動したす。 クラりドでは、柔軟性を制限しないように、倖郚からアクセス可胜なコンテナを新しいカヌネルを備えた個々のサヌバヌに関連付けず、䟋倖なくすべおのホストを再起動したす。 幞いなこずに、その手順は通垞のサヌバヌよりも簡単です。 たずえば、ステヌトレス コンテナは、再起動䞭に別のサヌバヌに簡単に移動できたす。

ただし、ただ倚くの䜜業があり、数週間、新しいバヌゞョンに問題がある堎合は最倧で数か月かかる堎合がありたす。 攻撃者はこのこずをよく理解しおいるため、プラン B が必芁です。

フラグメントスマック/セグメントスマック。 回避策

幞いなこずに、䞀郚の脆匱性に぀いおは、そのようなプラン「B」が存圚し、それは回避策ず呌ばれたす。 ほずんどの堎合、これはカヌネル/アプリケヌション蚭定の倉曎であり、起こり埗る圱響を最小限に抑えたり、脆匱性の悪甚を完党に排陀したりできたす。

FragmentSmack/SegmentSmackの堎合 提案されたした 次のような回避策:

«net.ipv4.ipfrag_high_thresh および net.ipv3.ipfrag_low_thresh (および ipv4 net.ipv4.ipfrag_high_thresh および net.ipv6.ipfrag_low_thresh の察応するもの) のデフォルト倀 6MB および 6MB を、それぞれ 256 KB および 192 KB に倉曎できたす。より䜎い。 テストでは、ハヌドりェア、蚭定、条件に応じお、攻撃䞭に CPU 䜿甚率が小芏暡から倧幅に䜎䞋するこずが瀺されおいたす。 ただし、䞀床に再アセンブリ キュヌに収たるのは 262144 ぀の 64K フラグメントのみであるため、ipfrag_high_thresh=XNUMX バむトにより、パフォヌマンスに倚少の圱響が生じる可胜性がありたす。 たずえば、倧きな UDP パケットを扱うアプリケヌションが壊れるリスクがありたす。'。

パラメヌタ自䜓 カヌネルのドキュメントにある 次のように説明されおいたす。

ipfrag_high_thresh - LONG INTEGER
    Maximum memory used to reassemble IP fragments.

ipfrag_low_thresh - LONG INTEGER
    Maximum memory used to reassemble IP fragments before the kernel
    begins to remove incomplete fragment queues to free up resources.
    The kernel still accepts new fragments for defragmentation.

本番サヌビスには倧芏暡な UDP がありたせん。 LAN 䞊には断片化されたトラフィックはありたせん。WAN 䞊には断片化されたトラフィックがありたすが、重倧ではありたせん。 兆候はありたせん - 回避策を展開できたす。

フラグメントスマック/セグメントスマック。 最初の血

私たちが遭遇した最初の問題は、クラりド コンテナヌが新しい蚭定を郚分的にのみ (ipfrag_low_thresh のみ) 適甚する堎合ず、たったく適甚しない堎合があり、単に開始時にクラッシュするずいうこずでした。 問題を安定しお再珟するこずはできたせんでした (すべおの蚭定は手動で問題なく適甚されたした)。 コンテナが開始時にクラッシュする理由を理解するのも、それほど簡単ではありたせん。゚ラヌは芋぀からなかったのです。 XNUMX ぀確かなこずは、蚭定をロヌルバックするず、コンテナヌのクラッシュの問題が解決されるずいうこずです。

ホストに Sysctl を適甚するだけでは䞍十分なのはなぜですか? コンテナは独自の専甚ネットワヌク名前空間に存圚するため、少なくずも ネットワヌク Sysctl パラメヌタの䞀郚 コンテナ内の内容はホストずは異なる堎合がありたす。

Sysctl 蚭定はコンテナにどのように正確に適甚されたすか? 私たちのコンテナには特暩がないため、コンテナ自䜓にアクセスしお Sysctl 蚭定を倉曎するこずはできたせん。単に十分な暩限がないだけです。 コンテナを実行するために、圓時のクラりドでは Docker を䜿甚しおいたした (珟圚は ポッドマン。 新しいコンテナのパラメヌタは、必芁な Sysctl 蚭定を含め、API 経由で Docker に枡されたした。
バヌゞョンを調べたずころ、Docker API がすべおの゚ラヌを返しおいないこずが刀明したした (少なくずもバヌゞョン 1.10)。 「docker run」経由でコンテナを起動しようずするず、最終的に少なくずも䜕かが芋えたした。

write /proc/sys/net/ipv4/ipfrag_high_thresh: invalid argument docker: Error response from daemon: Cannot start container <...>: [9] System error: could not synchronise with container process.

パラメヌタ倀が無効です。 しかし、なぜ そしお、なぜそれが時々のみ有効ではないのでしょうか? Docker は Sysctl パラメヌタヌが適甚される順序を保蚌しおいないこずが刀明したした (最新のテスト枈みバヌゞョンは 1.13.1)。そのため、ipfrag_low_thresh がただ 256M、぀たり䞊限が䜎いずきに ipfrag_high_thresh を 3K に蚭定しようずするこずがありたした。䞋限を䞋回ったため、゚ラヌが発生したした。

その時点で、起動埌にコンテナを再構成するための独自のメカニズム (起動埌にコンテナをフリヌズする) をすでに䜿甚しおいたした。 グルヌプ冷凍庫 そしお、コンテナの名前空間でコマンドを実行したす。 IPネット)、この郚分に Sysctl パラメヌタヌの曞き蟌みも远加したした。 問題は解決したした。

フラグメントスマック/セグメントスマック。 ファヌストブラッド2

クラりドでの Workaround の䜿甚法を理解する前に、たれにナヌザヌから最初の苊情が届き始めたした。 その時点で、最初のサヌバヌで Workaround の䜿甚を開始しおから数週間が経過しおいたした。 初期調査では、苊情は個々のサヌビスに察しお受け取られたものであり、これらのサヌビスのすべおのサヌバヌに察しお受け取られたわけではないこずが刀明したした。 問題は再び極めお䞍確実なものずなった。

もちろん、たず第䞀に、Sysctl 蚭定をロヌルバックしようずしたしたが、効果はありたせんでした。 サヌバヌやアプリケヌションの蚭定をさたざたに操䜜しおも圹に立ちたせんでした。 再起動が圹に立ちたした。 Linux を再起動するのは、昔の Windows では普通だったのず同じくらい䞍自然です。 しかし、それは圹に立ったので、Sysctl で新しい蚭定を適甚するずきの「カヌネルの䞍具合」であるず考えたした。 なんお軜薄だったんだろう 。

504週間埌、問題が再発したした。 これらのサヌバヌの構成は非垞に単玔で、プロキシ/バランサヌ モヌドの Nginx でした。 亀通量はあたり倚くありたせん。 新しい導入メモ: クラむアント䞊の XNUMX ゚ラヌの数は毎日増加しおいたす (ゲヌトりェむタむムアりト。 グラフは、このサヌビスの 504 日あたりの XNUMX ゚ラヌの数を瀺しおいたす。

䜜業ラりンドを匕き起こす脆匱性に泚意しおください。 パヌト 1: フラグメントスマック/セグメントスマック

すべおの゚ラヌは同じバック゚ンド、぀たりクラりド内にあるバック゚ンドに関するものです。 このバック゚ンドのパッケヌゞ フラグメントのメモリ消費量グラフは次のようになりたす。

䜜業ラりンドを匕き起こす脆匱性に泚意しおください。 パヌト 1: フラグメントスマック/セグメントスマック

これは、オペレヌティング システムのグラフの問題の最も明癜な兆候の XNUMX ぀です。 クラりドでは、ちょうど同時に、QoS (トラフィック制埡) 蚭定に関する別のネットワヌク問題が修正されたした。 パケット フラグメントのメモリ消費量のグラフでは、たったく同じように芋えたした。

䜜業ラりンドを匕き起こす脆匱性に泚意しおください。 パヌト 1: フラグメントスマック/セグメントスマック

仮定は単玔で、グラフ䞊で同じように芋える堎合は、同じ理由があるずいうこずです。 さらに、このタむプのメモリに関する問題は非垞にたれです。

修正された問題の本質は、QoS のデフォルト蚭定で fq パケット スケゞュヌラを䜿甚したこずでした。 デフォルトでは、100 ぀の接続に察しお XNUMX パケットをキュヌに远加できたすが、チャネル䞍足の状況では、䞀郚の接続がキュヌの容量を詰たらせ始めたした。 この堎合、パケットはドロップされたす。 tc 統蚈 (tc -s qdisc) では、次のように衚瀺されたす。

qdisc fq 2c6c: parent 1:2c6c limit 10000p flow_limit 100p buckets 1024 orphan_mask 1023 quantum 3028 initial_quantum 15140 refill_delay 40.0ms
 Sent 454701676345 bytes 491683359 pkt (dropped 464545, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
  1024 flows (1021 inactive, 0 throttled)
  0 gc, 0 highprio, 0 throttled, 464545 flows_plimit

「464545 flows_plimit」は、464545 ぀の接続のキュヌ制限を超えたためにドロップされたパケットであり、「dropped 1」は、このスケゞュヌラのすべおのドロップされたパケットの合蚈です。 キュヌの長さを XNUMX に増やしおコンテナヌを再起動するず、問題は発生しなくなりたした。 座っおスムヌゞヌを飲むこずもできたす。

フラグメントスマック/セグメントスマック。 ラストブラッド

たず、カヌネルの脆匱性の発衚から数か月埌、぀いに FragmentSmack の修正版が登堎したした (7.5 月の発衚ず同時に、SegmentSmack のみの修正版もリリヌスされたした)。これにより、回避策を攟棄する機䌚が䞎えられたした。それは私たちに倚倧な迷惑をかけたした。 この間、すでに䞀郚のサヌバヌを新しいカヌネルに移行するこずに成功しおいたしたが、今床は最初からやり盎す必芁がありたした。 FragmentSmack の修正を埅たずにカヌネルを曎新したのはなぜですか? 実際、これらの脆匱性から保護するプロセスは、CentOS 自䜓の曎新プロセスず同時 (および統合) されおいたす (カヌネルのみを曎新するよりもさらに時間がかかりたす)。 さらに、SegmentSmack はより危険な脆匱性であり、その修正はすぐに公開されたため、いずれにせよ理にかなっおいたした。 ただし、CentOS 7.6 のずきに発生した FragmentSmack の脆匱性はバヌゞョン 7.5 でのみ修正されたため、CentOS 䞊のカヌネルを単玔に曎新するこずはできたせんでした。そのため、7.6 ぞの曎新を䞭止し、XNUMX ぞの曎新からやり盎す必芁がありたした。 そしお、これも起こりたす。

第二に、たれにナヌザヌから問題に関する苊情が戻っおくるこずがありたす。 これらはすべお、クラむアントから䞀郚のサヌバヌぞのファむルのアップロヌドに関連しおいるこずはすでにわかっおいたす。 さらに、これらのサヌバヌを経由したアップロヌドは、党䜓のうち非垞に少数でした。

䞊蚘の話から芚えおいるように、Sysctl をロヌルバックしおも圹に立ちたせんでした。 再起動は圹に立ちたしたが、䞀時的でした。
Sysctlに関する疑惑は払拭できなかったが、今回は可胜な限りの情報を収集する必芁があった。 たた、䜕が起こっおいるのかをより正確に調査するために、クラむアント䞊でアップロヌドの問題を再珟する胜力も倧幅に䞍足しおいたした。

入手可胜なすべおの統蚈ずログを分析しおも、䜕が起こっおいるのかを理解するこずはできたせんでした。 特定の぀ながりを「感じる」ために問題を再珟する胜力が著しく欠劂しおいたした。 最埌に、開発者は特別なバヌゞョンのアプリケヌションを䜿甚しお、Wi-Fi 経由で接続したテスト デバむス䞊で問題を安定しお再珟するこずに成功したした。 これは調査における画期的な出来事でした。 クラむアントは Nginx に接続し、バック゚ンド (Java アプリケヌション) にプロキシしたした。

䜜業ラりンドを匕き起こす脆匱性に泚意しおください。 パヌト 1: フラグメントスマック/セグメントスマック

問題に関するダむアログは次のずおりです (Nginx プロキシ偎で修正されたした)。

  1. クラむアント: ファむルのダりンロヌドに関する情報の受信を芁求したす。
  2. Java サヌバヌ: 応答。
  3. クラむアント: ファむル付きで POST。
  4. Java サヌバヌ: ゚ラヌ。

同時に、Java サヌバヌはクラむアントから受信したデヌタが 0 バむトであるこずをログに曞き蟌み、Nginx プロキシはリク゚ストに 30 秒以䞊かかったこずが曞き蟌みたす (30 秒はクラむアント アプリケヌションのタむムアりトです)。 なぜタむムアりトになり、なぜ 0 バむトになるのでしょうか? HTTP の芳点から芋るず、すべおが正垞に機胜したすが、ファむルを含む POST がネットワヌクから消えおいるように芋えたす。 しかもクラむアントずNginxの間では消滅しおしたいたす。 Tcpdump を䜿甚しお歊装する時期が来たした。 ただし、最初にネットワヌク構成を理解する必芁がありたす。 Nginx プロキシは L3 バランサヌの背埌にありたす NFりェア。 トンネリングは、L3 バランサヌからサヌバヌにパケットを配信するために䜿甚され、サヌバヌはパケットにヘッダヌを远加したす。

䜜業ラりンドを匕き起こす脆匱性に泚意しおください。 パヌト 1: フラグメントスマック/セグメントスマック

この堎合、ネットワヌクは Vlan タグ付きトラフィックの圢匏でこのサヌバヌに到達し、独自のフィヌルドもパケットに远加したす。

䜜業ラりンドを匕き起こす脆匱性に泚意しおください。 パヌト 1: フラグメントスマック/セグメントスマック

たた、このトラフィックは断片化するこずもできたす (回避策のリスクを評䟡するずきに説明した、断片化された受信トラフィックのごく䞀郚ず同じです)。これにより、ヘッダヌの内容も倉曎されたす。

䜜業ラりンドを匕き起こす脆匱性に泚意しおください。 パヌト 1: フラグメントスマック/セグメントスマック

繰り返しになりたすが、パケットは Vlan タグでカプセル化され、トンネルでカプセル化され、断片化されたす。 これがどのように起こるかをよりよく理解するために、クラむアントから Nginx プロキシたでのパケット ルヌトを远跡しおみたしょう。

  1. パケットは L3 バランサヌに到達したす。 デヌタセンタヌ内で正しいルヌティングを行うために、パケットはトンネル内にカプセル化され、ネットワヌク カヌドに送信されたす。
  2. パケット + トンネル ヘッダヌは MTU に収たらないため、パケットはフラグメントに分割されおネットワヌクに送信されたす。
  3. L3 バランサ以降のスむッチはパケットを受信するず、Vlan タグを付加しお送信したす。
  4. Nginx プロキシの前にあるスむッチは、(ポヌト蚭定に基づいお) サヌバヌが Vlan でカプセル化されたパケットを予期しおいるこずを認識するため、Vlan タグを削陀せずにそのたた送信したす。
  5. Linux は、個々のパッケヌゞの断片を取埗し、それらを XNUMX ぀の倧きなパッケヌゞにマヌゞしたす。
  6. 次に、パケットは Vlan むンタヌフェむスに到達し、最初の局 (Vlan カプセル化) が削陀されたす。
  7. Linux はそれをトンネル むンタヌフェむスに送信し、そこで別の局 (トンネル カプセル化) が削陀されたす。

難しいのは、これらすべおをパラメヌタずしお tcpdump に枡すこずです。
最埌から始めたしょう。VLAN ずトンネルのカプセル化が削陀された、クラむアントからのクリヌンな (䞍芁なヘッダヌのない) IP パケットはありたすか?

tcpdump host <ip клОеМта>

いいえ、サヌバヌ䞊にそのようなパッケヌゞはありたせんでした。 したがっお、問題はもっず前に存圚しおいるはずです。 Vlanカプセル化のみが解陀されたパケットはありたすか?

tcpdump ip[32:4]=0xx390x2xx

0xx390x2xx は、XNUMX 進数圢匏のクラむアント IP アドレスです。
32:4 — トンネル パケット内の SCR IP が曞き蟌たれるフィヌルドのアドレスず長さ。

むンタヌネット䞊では 40、44、50、54 ず曞かれおいたすが、そこには IP アドレスがなかったため、フィヌルド アドレスは総圓たりで遞択する必芁がありたした。 たた、XNUMX 進数のパケット (tcpdump の -xx たたは -XX パラメヌタヌ) を調べお、既知の IP アドレスを蚈算するこずもできたす。

VLAN ずトンネルのカプセル化が削陀されおいないパケット フラグメントはありたすか?

tcpdump ((ip[6:2] > 0) and (not ip[6] = 64))

この魔法は、最埌のものを含むすべおの断片を衚瀺したす。 おそらく、同じものを IP でフィルタリングできるず思いたすが、そのようなパケットはそれほど倚くなく、必芁なパケットは䞀般的なフロヌで簡単に芋぀けられるため、詊したせんでした。 どうぞ

14:02:58.471063 In 00:de:ff:1a:94:11 ethertype IPv4 (0x0800), length 1516: (tos 0x0, ttl 63, id 53652, offset 0, flags [+], proto IPIP (4), length 1500)
    11.11.11.11 > 22.22.22.22: truncated-ip - 20 bytes missing! (tos 0x0, ttl 50, id 57750, offset 0, flags [DF], proto TCP (6), length 1500)
    33.33.33.33.33333 > 44.44.44.44.80: Flags [.], seq 0:1448, ack 1, win 343, options [nop,nop,TS val 11660691 ecr 2998165860], length 1448
        0x0000: 0000 0001 0006 00de fb1a 9441 0000 0800 ...........A....
        0x0010: 4500 05dc d194 2000 3f09 d5fb 0a66 387d E.......?....f8}
        0x0020: 1x67 7899 4500 06xx e198 4000 3206 6xx4 [email protected].
        0x0030: b291 x9xx x345 2541 83b9 0050 9740 0x04 .......A...P.@..
        0x0040: 6444 4939 8010 0257 8c3c 0000 0101 080x dDI9...W.......
        0x0050: 00b1 ed93 b2b4 6964 xxd8 ffe1 006a 4578 ......ad.....jEx
        0x0060: 6966 0000 4x4d 002a 0500 0008 0004 0100 if..MM.*........

14:02:58.471103 In 00:de:ff:1a:94:11 ethertype IPv4 (0x0800), length 62: (tos 0x0, ttl 63, id 53652, offset 1480, flags [none], proto IPIP (4), length 40)
    11.11.11.11 > 22.22.22.22: ip-proto-4
        0x0000: 0000 0001 0006 00de fb1a 9441 0000 0800 ...........A....
        0x0010: 4500 0028 d194 00b9 3f04 faf6 2x76 385x E..(....?....f8}
        0x0020: 1x76 6545 xxxx 1x11 2d2c 0c21 8016 8e43 .faE...D-,.!...C
        0x0030: x978 e91d x9b0 d608 0000 0000 0000 7c31 .x............|Q
        0x0040: 881d c4b6 0000 0000 0000 0000 0000 ..............

これらは、写真付きの 53652 ぀のパッケヌゞ (同じ ID XNUMX) の XNUMX ぀の断片です (Exif ずいう単語は最初のパッケヌゞに衚瀺されたす)。 このレベルのパッケヌゞは存圚するが、ダンプ内にマヌゞされた圢匏ではないずいう事実により、問題は明らかにアセンブリにありたす。 ぀いにこれを蚌明する文曞が登堎したした

パケット デコヌダでは、ビルドを劚げるような問題は怜出されたせんでした。 ここで詊しおみたした: hpd.gasmi.net。 たず、そこに䜕かを詰め蟌もうずするず、デコヌダはそのパケット圢匏を奜みたせん。 Srcmac ず Ethertype の間に䜙分な XNUMX オクテットがあるこずが刀明したした (フラグメント情報ずは関係ありたせん)。 それらを削陀するず、デコヌダヌが動䜜し始めたした。 しかし、問題はありたせんでした。
䜕ず蚀っおも、これらの Sysctl 以倖には䜕も芋぀かりたせんでした。 あずは、芏暡を理解し、さらなるアクションを決定するために、問題のあるサヌバヌを特定する方法を芋぀けるだけでした。 必芁なカりンタヌはすぐに芋぀かりたした。

netstat -s | grep "packet reassembles failed”

これは、snmpd の OID=1.3.6.1.2.1.4.31.1.1.16.1 (ipSystemStatsReasmFails).

「IP 再構成アルゎリズムによっお怜出された障害の数 (䜕らかの理由: タむムアりト、゚ラヌなど)。」

問題が調査されたサヌバヌのグルヌプのうち、このカりンタは XNUMX 台では速く増加し、XNUMX 台では遅くなり、XNUMX 台ではたったく増加したせんでした。 このカりンタヌのダむナミクスを Java サヌバヌ䞊の HTTP ゚ラヌのダむナミクスず比范するず、盞関関係が明らかになりたした。 ぀たり、メヌタヌを監芖するこずができたす。

Sysctl のロヌルバックが圹立぀かどうかを正確に刀断できるように、問題の信頌できる指暙を甚意するこずは非垞に重芁です。これは、前の話から、アプリケヌションからはこれをすぐに理解できないこずがわかっおいるからです。 この指暙を䜿甚するず、ナヌザヌが発芋する前に、本番環境におけるすべおの問題領域を特定できるようになりたす。
Sysctl をロヌルバックした埌、監芖゚ラヌが停止したため、問題の原因が蚌明され、ロヌルバックが圹立぀ずいう事実も刀明したした。

他のサヌバヌのフラグメンテヌション蚭定をロヌルバックし、そこで新しい監芖が機胜し、以前のデフォルトよりもさらに倚くのメモリをフラグメントに割り圓おたした (これは UDP 統蚈であり、䞀般的な背景に察しお郚分的な損倱は目立ちたせんでした)。 。

最も重芁な質問

L3 バランサヌでパケットが断片化されるのはなぜですか? ナヌザヌからバランサヌに到着するパケットのほずんどは SYN ず ACK です。 これらのパッケヌゞのサむズは小さいです。 しかし、そのようなパケットの割合が非垞に倧きいため、それらを背景に、断片化し始めた倧きなパケットの存圚に気づきたせんでした。

原因は構成スクリプトの砎損でした advmss VLAN むンタヌフェむスを備えたサヌバヌ䞊で実行できたす (圓時の実皌働環境では、タグ付きトラフィックを備えたサヌバヌはほずんどありたせんでした)。 Advmss を䜿甚するず、トンネル ヘッダヌをパケットに付加した埌に断片化する必芁がないように、こちらの方向のパケットのサむズを小さくする必芁があるずいう情報をクラむアントに䌝えるこずができたす。

Sysctl のロヌルバックでは解決せず、再起動では解決したのはなぜですか? Sysctl をロヌルバックするず、パッケヌゞのマヌゞに䜿甚できるメモリの量が倉曎されたした。 同時に、明らかにフラグメントのメモリ オヌバヌフロヌ自䜓が接続の速床䜎䞋を匕き起こし、その結果、フラグメントがキュヌ内で長時間遅延するこずになりたした。 ぀たり、プロセスはサむクルで行われたした。
再起動するずメモリがクリアされ、すべおが正垞に戻りたした。

回避策なしで実行できたしたか? はい、ただし、攻撃が発生した堎合にナヌザヌがサヌビスを受けられなくなるリスクが高くなりたす。 もちろん、回避策の䜿甚により、ナヌザヌ向けサヌビスの XNUMX ぀が遅くなるなど、さたざたな問題が発生したしたが、それでも、その措眮は正圓なものだったず考えおいたす。

Andrey Timofeev に感謝したす (アティモフェ゚フ捜査の実斜に協力しおいただいたほか、アレクセむ・クレネフデバむスx) - サヌバヌ䞊の Centos ずカヌネルを曎新するずいう倧芏暡な䜜業甚。 この堎合、プロセスを最初から䜕床も開始する必芁があったため、䜕ヶ月もかかりたした。

出所 habr.com

コメントを远加したす