<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>2009/06/12 on Yano&#39;s digital garage</title>
    <link>https://www.bravotouring.com/~yano/archives/2009/06/12/</link>
    <description>Recent content in 2009/06/12 on Yano&#39;s digital garage</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Fri, 12 Jun 2009 00:23:45 +0900</lastBuildDate>
    <atom:link href="https://www.bravotouring.com/~yano/archives/2009/06/12/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>ICMP Checksum</title>
      <link>https://www.bravotouring.com/~yano/diary/it/20090612icmp.htm</link>
      <pubDate>Fri, 12 Jun 2009 00:23:45 +0900</pubDate>
      <guid>https://www.bravotouring.com/~yano/diary/it/20090612icmp.htm</guid>
      <description>&lt;p&gt;&lt;span class=&#34;Software&#34;&gt;ICMP&lt;/span&gt;のチェックサム計算でハマった記録。&lt;/p&gt;&#xA;&lt;p&gt;そもそもは転送するパケットをこっそり加工して転送しようというトリッキーなソフトウェア作成で、&lt;span class=&#34;Software&#34;&gt;&#34;ICMP_ECHOREPLY&#34;&lt;/span&gt;をシーケンス番号が「3の倍数」&lt;span class=&#34;Strike&#34;&gt;と「3が付く数字」&lt;/span&gt;の時は&lt;span class=&#34;Software&#34;&gt;&#34;ICMP_DEST_UNREACH&#34;&lt;/span&gt;に擬装しようという趣旨。&lt;/p&gt;&#xA;&lt;p&gt;&lt;span class=&#34;Software&#34;&gt;ping&lt;/span&gt;コマンドそのものは期待通りに通らなくなって、&lt;span class=&#34;Software&#34;&gt;tcpdump&lt;/span&gt;で見てもちゃんと&lt;span class=&#34;Warning&#34;&gt;&#34;Unreachable&#34;&lt;/span&gt;と表示されているのでOK。と思ったが、&lt;span class=&#34;Software&#34;&gt;ping&lt;/span&gt;は&lt;span class=&#34;Warning&#34;&gt;なんで&#34;Unreachable&#34;て出ないんだっけ？&lt;/span&gt;と思いながら、&#34;&lt;span class=&#34;Software&#34;&gt;tcpdump&lt;/span&gt; -vv&#34;したところ、&lt;span class=&#34;Warning&#34;&gt;&#34;bad Checksum&#34;&lt;/span&gt;という怪しげな出力に気が付いた。&lt;/p&gt;&#xA;&lt;p&gt;ならば試しに…と&lt;span class=&#34;Software&#34;&gt;&#34;ICMP_DEST_UNREACH&#34;&lt;/span&gt;以前に&lt;span class=&#34;Software&#34;&gt;&#34;ICMP_ECHO&#34;&lt;/span&gt;のチェックサムを再計算したところ元の値とは異なってた。当然相手側からの応答はなくなり、こりゃ「チェックサム計算処理」の嫌疑が濃厚だ。&lt;/p&gt;&#xA;&lt;p&gt;計算ロジックは以前使った実績ある関数を持ってきたのだが、無責任にもうっかり弄っちゃった可能性もあると思い、&lt;a href=&#34;http://www.fenix.ne.jp/~thomas/memo/ip/checksum.html&#34; target=&#34;SubWindow&#34;&gt;IP,ICMP,UDP checksum calculation&lt;/a&gt;と比較したところ問題なさげ。ICMPヘッダーサイズは8バイト固定なので、データ長の指定を&lt;span class=&#34;Strong&#34;&gt;&#34;sizeof(struct icmphdr)&#34;&lt;/span&gt;から&#39;8&#39;に書換えてみたけれど、案の定事態は微動だにせず。&lt;/p&gt;&#xA;&lt;p&gt;いろいろ調べたところ&lt;a href=&#34;http://pc.nikkeibp.co.jp/&#34; target=&#34;SubWindow&#34;&gt;PC Online&lt;/a&gt;の&lt;a href=&#34;http://pc.nikkeibp.co.jp/article/NPC/20070611/274351/?P=3&#34; target=&#34;SubWindow&#34;&gt;TCP/IP再入門&lt;/a&gt;に到達。記事によると&lt;blockquote cite=&#34;http://pc.nikkeibp.co.jp/article/NPC/20070611/274351/?P=3&#34;&gt;　ICMPヘッダーにあるチェックサムは、&lt;span class=&#34;Strong&#34;&gt;ICMPパケット全体&lt;/span&gt;を対象にした計算値です。ICMPパケット全体を16ビット単位に分割したうえで、チェックサム部分にゼロを入れておき、全体のチェックサムを計算します。なお、このチェックサムでは、IPヘッダー部分は計算に含まれません。&lt;br/&gt;&lt;br/&gt;　データ部分は、可変長で、メッセージごとに違う内容が入ります。ICMPパケット自体には、パケット全体の長さを指定するフィールドはありません。しかし、&lt;span class=&#34;Strong&#34;&gt;IPヘッダーが全体のパケット・サイズを指定している&lt;/span&gt;ため、この情報を使うことでデータ部分の長さを求めることができます。&lt;/blockquote&gt;との事。&lt;/p&gt;&#xA;&lt;p&gt;なんと、チェックサム算出対象は&lt;span class=&#34;Strong&#34;&gt;ICMPヘッダー&lt;/span&gt;ではなく&lt;span class=&#34;Strong&#34;&gt;ICMPパケット全体&lt;/span&gt;で、しかもIPヘッダーに存在する全体長から&lt;span class=&#34;Strong&#34;&gt;IPヘッダーの長さ&lt;/span&gt;を差し引いて&lt;span class=&#34;Strong&#34;&gt;ICMPパケット全体の長さ&lt;/span&gt;を求めるのがスジだそうだ。&lt;/p&gt;&#xA;&lt;p&gt;教えに従ってようやく無事&lt;span class=&#34;Software&#34;&gt;&#34;ICMP_ECHO&#34;&lt;/span&gt;のチェックサムが通るようになった。が、肝心の&lt;span class=&#34;Software&#34;&gt;&#34;ICMP_DEST_UNREACH&#34;&lt;/span&gt;は&lt;a href=&#34;http://www.asahi-net.or.jp/~AA4T-NNGK/&#34; target=&#34;SubWindow&#34;&gt;Stray Penguin&lt;/a&gt;の&lt;a href=&#34;http://www.asahi-net.or.jp/~AA4T-NNGK/ipttut/output/icmpheaders.html&#34; target=&#34;SubWindow&#34;&gt;ICMPヘッダ&lt;/a&gt;の「2.9.2. ICMP到達不能メッセージ (Destination Unreachable)」によると&lt;blockquote cite=&#34;http://www.asahi-net.or.jp/~AA4T-NNGK/ipttut/output/icmpheaders.html&#34;&gt;　これに加えて、小さなデータ部を持つこともでき、その中身はインターネットヘッダ (IPヘッダ) のヘッダ全てと、元の IP データグラムのうちの 64 ビットを写したものとなる。次のレベルのプロトコルがポート定義などを持つのなら 64 ビットデータ部からそれが読み取れるはずだと解釈される。&lt;/blockquote&gt;との事。&lt;/p&gt;&#xA;&lt;p&gt;data部に「ICMP_ECHOのIPヘッダ全てと、ICMPヘッダから64ビット」合わせて28バイトを搭載してIPヘッダのチェックサムを再設定する事により、&lt;span class=&#34;Software&#34;&gt;ping&lt;/span&gt;でも&lt;span class=&#34;Warning&#34;&gt;&#34;Unreachable&#34;&lt;/span&gt;が表示されるようになり、万事OK。&lt;/p&gt;&#xA;&lt;p class=&#34;Reference&#34;&gt;【参照】&#xA;&#x9;&lt;br/&gt;●thomas&#39;s home page &lt;a href=&#34;http://www.fenix.ne.jp/~thomas/&#34; target=&#34;SubWindow&#34;&gt;http://www.fenix.ne.jp/~thomas/&lt;/a&gt;&#xA;&lt;br/&gt;┗&lt;a href=&#34;http://www.fenix.ne.jp/~thomas/memo/ip/checksum.html&#34; target=&#34;SubWindow&#34;&gt;IP,ICMP,UDP checksum calculation&lt;/a&gt;&#xA;&lt;br/&gt;●PC Online ビジネスパーソンのパソコン活用情報サイト &lt;a href=&#34;http://pc.nikkeibp.co.jp/&#34; target=&#34;SubWindow&#34;&gt;http://pc.nikkeibp.co.jp/&lt;/a&gt;&#xA;&lt;br/&gt;┗&lt;a href=&#34;http://pc.nikkeibp.co.jp/article/NPC/20070611/274351/?P=3&#34; target=&#34;SubWindow&#34;&gt;IPにはないエラー通知の仕組みを提供する――ICMP・その1（第10回）：TCP/IP再入門&lt;/a&gt;&#xA;&lt;br/&gt;●Stray Penguin - Linux Memo - &lt;a href=&#34;http://www.asahi-net.or.jp/~AA4T-NNGK/&#34; target=&#34;SubWindow&#34;&gt;http://www.asahi-net.or.jp/~AA4T-NNGK/&lt;/a&gt;&#xA;&lt;br/&gt;┗&lt;a href=&#34;http://www.asahi-net.or.jp/~AA4T-NNGK/ipttut/&#34; target=&#34;SubWindow&#34;&gt;Iptables tutorial&lt;/a&gt; &gt;&gt; &lt;a href=&#34;http://www.asahi-net.or.jp/~AA4T-NNGK/ipttut/output/icmpheaders.html&#34; target=&#34;SubWindow&#34;&gt;ICMPヘッダ&lt;/a&gt;&#xA;&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
