WireShark – TCP の生のデータを保存する

Follow TCP Stream を使えば生の TCP ストリームデータを取得可能です。
 
例えば、HTTP で画像を取得して、その画像をファイルとして保存したい場合は
次のようにします。
 
1. HTTP/1.1 200 OK などの HTTP レスポンスパケットを選んで右クリック→Follow TCP Stream を選択
2. Follow TCP stream ウィンドウが開いたら、右下の Raw をチェック
3. Save As をボタンをクリック
4. 保存先を指定して保存(保存例: http_gif.dat|rs/http_gif.dat)
5. バイナリエディタを開き、0D 0A 0D 0A 以前(HTTP Header)を削除し、拡張子変更(変更例: 画像)
 
追記:
(2006-07-27)同日の別トピックに書きましたが、Ethereal は複製版が Wireshark として独立し、そちらが更新されています。

ARP Poisoning してみる

どういうものかはあえて触れず、dsniff 付属の arpspool を使う手順だけメモしておきます。
下手をすると、自分がいる LAN 全体の通信を止めてしまう危険もあるものです。

(Linux + apt)
# apt-get dsniff
(FreeBSD)
# portinstall -r security/dsniff

ソースからビルドする場合は公式サイトからダウンロードします。
 
OS や FW の設定で、パケットの転送を許可しておく必要があります。

[Linux]
# sysctl -w net.ipv4.ip_forward = 1

転送を完全に許可するようにした上で、次のコマンドを打てば完了です。

arpspool < ゲートウェイのIPアドレス>

もし転送が禁止になっている状態でこれを実行すると、当然ですが指定のゲートウェイを通る新規の通信が全てつながらなくなります。
 
なお、何か通信に問題が発生した時に気づいてプログラムを停止しても, ゲートウェイの ARP テーブルが更新されるまでの数秒はつながらないままになります。
参考:
dsniffFAQ
Dumnetと遊ぼう
eringe – Statically Compiled ARP Poisoning Tool

iptables -F でネットにつながらなくなりました

Q. リモートからネットワーク設定作業をしており、いざと言うときのために、

sleep 300 && iptables -F

を裏で実行するようにしましたが、iptables -F を実行した瞬間にネットに一切つながらなくなりました。何が原因ですか?
 
A.iptables -F はデフォルトポリシー以外の全てのルールを消去します。
iptables -F を実行した直後はデフォルトポリシーだけの状態になるため、
たとえば iptables-save が次のように始まるような場合…

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

このように、INPUT DROP の設定になっている場合、もし iptables -F を実行すると、入力パケット(INPUT)を常に破棄(DROP)してしまうため、外部から(ping = ICMP すら)一切つながらなくなってしまいます。
 
こういう環境で作業する場合、代替として次のようにして確実に繋げる設定を復旧させるとよいでしょう。

sleep 300 && ( iptables-restore < iptables-free )

あるいは、環境に依存しますが例えば次のようにして /etc/sysconfig/iptables の状態を復元するのもいいでしょう。

sleep 300 && /etc/init.d/network restart

モニタリング用プロトコル SNMP を体験するには

– Linux の場合、yum, apt-get などで net-snmp-*.rpm をインストールします。

yum install net-snmp-*.rpm

 
– /etc/snmp.conf でアクセス権を設定する。
次のような設定で全ての情報が参照可能になります。この状態で外部に UDP 160, UDP 161 番ポートを公開すると、誰でもどこからでも同じ情報が参照可能になることに注意してください!!

# 詳細は man 5 snmpd.conf を参照。
# sec.name source community
com2sec notConfigUser default public
# groupName securityModel securityName
group notConfigGroup v1 notConfigUser
group notConfigGroup v2c notConfigUser
group notConfigGroup v3 notConfigUser
# name incl/excl subtree mask(optional)
view all included .1
# group context sec.model sec.level prefix read write notif
access notConfigGroup “” any noauth exact all all all
 
 
syslocation Unknown (edit /etc/snmp/snmpd.conf)
syscontact Root <root@localhost> (configure /etc/snmp/snmp.local.conf)
 
# Added for support of bcm5820 cards
pass .1.3.6.1.4.1.4413.4.1 /usr/bin/ucd5820stat

> /etc/init.d/snmpd start

/etc/init.d/snmptrapd start

でサーバ側は完了です。
監視側は TWSNMP というフリーソフトを使うとお手軽なのでおすすめです。

bind8/bind9 設定の基本

named.conf 全体設定、zone の項目でゾーン(ドメイン、逆引き時の IP アドレス)を定義し、実際の DNS レコードについては、ゾーンごとにゾーンファイルに記述していく。

named.conf:
    options {
        directory “/etc/named”;
        // 任意のディレクトリ名。ここで設定したものが、
        // ゾーンファイルなど設定ファイルのルートディレクトリになる。
    };
    // 正引き(ドメイン -> IP アドレス)用。
    zone “example.org” { // example.org ドメインについての定義
        type master; // 他の DNS サーバを参照するのではなく、自分で
                      // DNS レコードを定義する場合は master。
                      // 他のサーバを参照する場合は slave
        file “master/example.org”; // 利用するゾーンファイル。ファイル名は任意のものでよい。master 用。
        // masters { 192.168.1.1; 10.0.0.10; }; // DNS レコード参照先マスタサーバ。slave 用。
    };
    
    // 逆引き(IP アドレス -> ドメイン)用。
    zone “1.168.192.in-addr.arpa” { // 192.168.1.* 用。ドット区切りで逆転して、in-addr.arpa を付加する。
        type master;
        file “master/1.168.192.in-addr.arpa”;
    }

次にゾーン設定ファイルです。ドメイン指定の部分では、最後にドットをつける形式(FQDN)にすることに注意します。これは FQDN 形式でないと後にドメイン名が続く(example.org のゾーン設定の場合、ns.example.org は ns.example.org.example.org.)と解釈するためです。

master/example.org:
$TTL 3600 ; Default TTL. 全てのレコードについて有効期間を何秒にするか。
@ IN SOA ns.example.org. postmaster.examle.org. (
       ; 第一パラメータはどのホストについてのレコードか、で @ は *.example.org の意味です。
       ; 第二パラメータは IN は Internet の意味です。常に IN にするものだと思っていていいんじゃないでしょうか。
       ; 第三パラメータはレコードの内容です。SOA は Start of Authority の意味で、ゾーン設定で最初に設定します。
       ; SOA レコードには後ろに二つパラメータと ( 〜 ) が続きます。
       ; ns.example.org が DNS サーバ, postmaster.example.org が
       ; 管理者宛メールアドレス(@ を . に置き換えたもの)です。
       2006021714; Serial. 任意の数値でよいが、更新の必要の有無は
                 ; この数値以下かで判別されるため、
                 ; 更新の際はこの数値以上にする。
       3600 ; Refresh (sec). 更新確認の頻度を何秒ごとにするか。
       1000 ; Retry (times). 失敗時の試行回数。
       86400 ; Expire (sec). 失敗したときに何秒後に破棄するか。
       86400 ; Minimum TTL(sec).
    )
  IN NS ns.example.org. ; example.org, *.example.org の DNS サーバのドメインを ns.example.org にします。
  IN A 192.168.1.11 ; example.org, *.example.org の名前解決結果を 192.168.1.11 にします。
ns IN A 192.168.1.2 ; ns.exmaple.org の名前解決結果を 192.168.1.2 にします。
www IN A 192.168.1.11 ; www.example.org の名前解決結果を 192.168.1.11 にします。

master/1.168.192.in-addr.arpa:
$ORIGIN 1.168.192.in-addr.arpa. ; 192.168.1.* についての設定であることを宣言
$TTL 3600
@ IN SOA ns.example.org. postmaster.example.org. (
        2006021714 ; Serial
        3600 ; Refresh
        1000 ; Retry
        86400 ; Expire
        86400 ; Minimum TTL
    )
  IN NS ns.example.org. ; Primary DNS
  IN NS ns2.exmaple.org. ; Secondary DNS (Optional)
; 以下 IP アドレスごとに固有で逆引き設定をする場合のみ記述する。
1 IN PTR root.example.org. ; 192.168.1.1 の逆引き結果
11 IN PTR www.example.org. ; 192.168.1.11 の逆引き結果

参考:
ネームサーバーの設定
bind9 設定
ゾーンファイルの書き方について教えてください(@IT)
ISC BIND(English)

存在するのに Can’t find server name … がでる

たとえば DNS が 192.168.1.100 のとき、DNS が存在して動作もしているにもかかわらず

Can’t find server name for address 192.168.1.100: Non-existent domain

と出る場合があります。
このとき DNS サーバにログインし、

nslookup 192.168.1.100

というようにエラーとして出た(DNSの) IP アドレスを指定して解決できなかった場合、
その IP アドレスについて逆引きが正しく設定されていない事が原因である可能性があります。
 
他の原因としては、/etc/resolve.conf が不適切(一番最初の nameserver 指定先が存在しない等)なことが考えられます。
 
正しく設定しているつもりなのに何故か動作していない、という場合は /var/log/messages や /var/log/syslog などで named のログ出力を見ると役に立つかもしれません。

パケットキャプチャツール

昔(2年ほど前)使っていて、機能的にも優秀で使いやすかったものなのですが、
名前を度忘れしていて今日やっと思い出しました orz.
 
Wireshark
(Etherealから改称)
ネットワークに実際に流れている中身をキャプチャして、GUI で見ることができるオープンソースなパケットキャプチャツールです。
Ethereal, Wireshark の Windows での動作には WinPcap が必要です。
 
Windows の他に、Linux 等さまざまな環境で動作します。
 
追記:
(2006-07-27) Ethereal は Wireshark として更新されるようになりました
参考:
Ethereal(イーサリアル)の日本語解説サイト
Wireshark

利用可能な DNS サーバを調べる

nslookup コマンドを使うと、任意のISP(任意のネットワーク)が利用しているDNSサーバIPアドレスを調べることが可能です。
 
既に DNS が使える環境で、
nslookup を使い、ISP のホスト名についてネームサーバの解決をすることで調べます。

$ nslookup
Default Server: XXX.XXX.ne.jp
Address: XXX.XXX.XXX.XXX
 > set q=ns # ← set q=any でも可。
 > example.org # ← 調べたい ISP のホスト名
Default Server: XXX.XXX.ne.jp
Address: XXX.XXX.XXX.XXX
 
Non-authoritative answer:
example.org nameserver = a.iana-servers.net
example.org nameserver = b.iana-servers.net # ←DNSサーバのホスト名
 
Authoritative answers can be found from:
b.iana-servers.net internet address = 193.0.0.236 # ←DNS サーバの IP アドレス

この結果として返ってきた DNS サーバの IP アドレスを名前解決用 DNS サーバとして指定できます(できないこともあります)。
ただし、自分が所属している ISP 、ネットワーク以外を指定するとはじかれることがありますし、ネットワーク的に遠いと遅いこともままあるので、自分の IP アドレスの逆引きから調べるようにしたほうがいいでしょう。

HTTP プロトコルの POST リクエストサンプル

POST /path/to/file.cgi HTTP/1.0
host: example.com
Content-Length: 13
 
foo=1&boo=abc
 

POST Request のときは HTTP Response と同じように、空行を挟んで header, content に分かれる。
GET で ? 以降に与えていたものを、Content 部分に入れる。
Content-Length ヘッダに、Content 部分の長さ(パラメータ文字列のバイト数)を指定すること。