Tíquete #30300

ipモジュールで-Fオプション利用時にリクエストが破壊される

: 2012-12-11 13:31 Última Atualização: 2012-12-12 17:33

Relator:
Dono:
Tipo:
Estado:
Fechado
Marcos:
(Nenhum)
Prioridade:
5 - Medium
Gravidade:
5 - Medium
Resolução:
Fixed
Arquivo:
6

Details

userのML投稿で見つかった、ipモジュールで-Fオプションを使用した際に、HTTPリクエストが壊れる問題

開発者の皆様

太田と申します。

UltraMonkey-L7を大変有意義に使用させていただいております。
この場を借りて感謝の言葉を述べさせていただきます。

さて、
UltraMonkey-L7 v3系において、
ロードバランサー経由のPost処理後のWeb画面が正常に
表示されない事象が発生しましたので、
ご報告いたします。

パケットキャプチャ等取得しましたので、
ご確認いただけますと幸いです。

【事象】
クライアントPCから、
UltraMonkey-l7-3.0.3-1経由でWebシステムのPost処理を
行った際に処理後のWeb画面が正常に表示されない場合がある。
(事象を記したpdfファイルを別途お送りします)

【検証】
・Webサーバに直接アクセスして処理を行った場合、正常に動作します。
・UltraMonkey-l7-2.1.3-1であれば問題なく動作します。
・UltraMonkey-l7-3.0.4-2では同様に処理異常となります。
・処理異常が発生する前に「Malformed Packet」が発生しております。

【環境】
<ロードバランサー>
OS:Cent OS 5.6 32bit
Kernel:2.6.18-238.el5
UltraMonkey-l7バージョン:3.0.3-1
振り分け方法:IPモジュール( module = ip -F -R )

<Webサーバー>
OS:RHEL 5.4
Kernel:2.6.18-164.el5 32bit
Apache:2.2.15

【お送りする情報】
※各種取得情報を竹林様宛に別途送らせていただきます。

・Ultramonkeyl7-3.0.3.1経由の処理異常画面.pdf

・パケットキャプチャ
  <UltraMonkey-l7-3.0.3-1経由>
  1.クライアントPCパケットキャプチャ「PC_dump_UMv3.pcap」
  2.ロードバランサーパケットキャプチャ「LB_dump_UMv3.pcap」
  3.WEBサーバーパケットキャプチャ「WEB_dump_UMv3.pcap」

  <UltraMonkey-l7-2.1.3-1経由>
  4.クライアントPCパケットキャプチャ
    「PC_dump_UMv2.pcap」

・l7directord.cf

※その他必要な情報がありましたら、
 お申し付けください。


以上、よろしくお願いいたします。

Ticket History (3/14 Histories)

2012-12-11 13:31 Updated by: hibari
  • New Ticket "ipモジュールで-Fオプション利用時にリクエストが破壊される" created
2012-12-11 13:35 Updated by: hibari
  • Componente Update from (Nenhum) to [1] UltraMonkey-L7 v3.0.3
  • Dono Update from (Nenhum) to hibari
Comentário
2012-12-11 13:36 Updated by: hibari
Comentário
  • 解析結果
send_bufferを上回る(※)データを送るときの処理にバグが潜んでいました。

具体的には、protocol_module_ip.cppのput_data_into_sendbuffer()関数内、
「//sendbuffer rest size is too small」コメント以下のelse文が該当箇所に
なります。

send_bufferを上回った場合、以下の処理で残ったデータの
開始位置とサイズを計算していますが、

//set item position
buffer_element.first += sendbuffer_rest_size;
buffer_element.second -= sendbuffer_rest_size;

その後、data_ptr->buffer_sequenceにpushする処理が
抜けているため、残ったデータの開始位置とサイズが
更新されていませんでした。

そのため、残りのデータを送信しようとしたときに、
前と同じデータの開始位置で送信を行うため、
同じデータが2回送られてしまい、HTTPリクエストが壊れた
と考えられます。


本事象はv3.0.0以降のipモジュールのみ発生する問題で、
XFFを追加して、送信データがsend_bufferを上回るサイズになった場合や、
Sorry-URI書き換え時にも同様の事象が発生します。


(※)補足 send_bufferを上回る場合について、
recv_bufferとsend_bufferは同じサイズであるため、
どんなに大きなサイズのデータが送られてきても、
受信処理の中で、send_bufferサイズを上回るデータを
取得することはない。
送信データサイズがsend_bufferサイズを上回るのは、
データ送信前に、URIの書き換えやXFFの追加を行うことで、
データサイズが増加した場合にのみ起こる。


2012-12-11 13:39 Updated by: hibari
Comentário
  • 修正patchを添付しました。
2012-12-11 13:53 Updated by: hibari
Comentário
  • patchの説明
    コードを解析したところ、本問題はipモジュールでSorryURIオプションを
    利用したときにも発生します。
    添付のpatchで、-Fオプション利用時とSorryURIオプション利用時、
    どちらの場合でも、事象が解消します。
    
    本修正は、v3.1.0に取り込むのが良いと思います。
    
    (修正内容)
    put_data_into_sendbuffer()関数内で、送信データがsend_bufferを
    上回った場合に、残ったデータの開始位置とサイズが更新されていな
    かった箇所を修正しました。
    
2012-12-12 10:55 Updated by: hiroakinakano
  • Resolução Update from Nenhum to Fixed
Comentário

上記パッチでBug fixされたことを、発見者の太田さんに確認してもらえました。

パッチ適用バージョンであるv3.0.4-3をリリースできた時点で、本チケットはclosedにしようと思います。
v3.1.0への適用を忘れないようにしましょう。

# すでに雲雀さんがv3.1.0-develでパッチを作成されているので、そのままコードを残せばいいだけですけど。

2012-12-12 11:05 Updated by: hibari
Comentário
v3.1.0への適用については、gitにmod_ip_xff_bugfixというブランチを作成しているので、
v3.1.0-develで上記ブランチをpullしていただければと思います。
2012-12-12 17:33 Updated by: hiroakinakano
  • Ticket Close date is changed to 2012-12-12 17:33
  • Estado Update from Aberto to Fechado

Attachment File List

Editar

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » Login