M's Diary -- 2002年1月中旬 --

Last-modified: Thu, 26 Dec 2002 13:41:37 JST
powered by tds-1.7.4 [static,cache:on]
前月 2002/1 翌月
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

2002年 1月 10日 (木)

FreeBSD

_ ppp (続)

ここから延々と続いているネタ。最近だと こちら

サーバを今日の 4.5-RC に上げてみた。ときどき PPPoE のコネクションが 切れるのだが、その際には

Jan 10 23:30:41 ppp[XXX]: tun0: Phase: Received NGM_PPPOE_CLOSE (hook "tun0") 
Jan 10 23:30:41 ppp[XXX]: tun0: Phase: deflink: Device disconnected 
Jan 10 23:30:41 ppp[XXX]: tun0: CCP: deflink: State change Stopped --> Closed 
Jan 10 23:30:41 ppp[XXX]: tun0: CCP: deflink: State change Closed --> Initial 
Jan 10 23:30:41 ppp[XXX]: tun0: Phase: deflink: open -> lcp 
Jan 10 23:30:41 ppp[XXX]: tun0: IPCP: deflink: LayerDown: XXX.XXX.XXX.XXX
[snip]
Jan 10 23:30:41 ppp[XXX]: tun0: Phase: deflink: Enter pause (3) for redialing. 
Jan 10 23:30:44 ppp[XXX]: tun0: Phase: deflink: Connected! 
Jan 10 23:30:44 ppp[XXX]: tun0: Phase: deflink: opening -> dial 
Jan 10 23:30:44 ppp[XXX]: tun0: Phase: deflink: dial -> carrier 
Jan 10 23:30:45 ppp[XXX]: tun0: Phase: Received NGM_PPPOE_SUCCESS (hook "tun0") 
Jan 10 23:30:45 ppp[XXX]: tun0: Phase: deflink: carrier -> login 
[snip]
Jan 10 23:30:46 ppp[XXX]: tun0: IPCP: deflink: LayerUp. 
Jan 10 23:30:46 ppp[XXX]: tun0: IPCP: myaddr XXX.XXX.XXX.XXX hisaddr = XXX.XXX.XXX.XXX 

という感じで再接続しにいくようになった。

どうしてこうなったのか理由は検証していない *1けど、前に比べたら良くなったかな。


*1:ちょうど今日の朝に Flets ADSL のメンテナンス工事があったので、 Flets ADSL 側に設定変更があってそれが影響しているのかもしれない。

今日の出来事

_ SPAM 業者保護育成

するための省令改正が決まったらしい ( 経済産業省の PDF)。 Subject: に !連絡方法無!とさえ明記すれば、 SPAM 受け取り拒否の窓口を設ける必要がない。 相手の意向に関係なく勝手に送りつけ続ける行為に 経済産業省がお墨付きを与えたわけですね。手元の端末で読まずに捨てることは可能だけど、携帯電話や PHS で 「受信するのにお金がかかる」という問題は相変わらず。

電話会社側で特定 Subject: のメールをフィルターするようなサービスも 考えられるけど、こんなフィルターしにくい文字列 *1にしているところは明らかに SPAM 業者保護育成が目的だからだろうな。


*1:文字コードを変えたり MIME encoding するパターンを変えたりして 何種類ものパターンが簡単に作れそう。


2002年 1月 17日 (木)

FreeBSD

_ ppp (続)

これの続き。

Jan 16 16:00:01 ppp[XXXX]: tun0: Phase: deflink: write (1): Message too long 

というエラーが出て ppp が異常終了する原因がとりあえず判明。

_ 原因

これは src/usr.sbin/ppp/physical.cの 810 行め付近の

ssize_t
physical_Write(struct physical *p, const void *buf, size_t nbytes)
{
  log_DumpBuff(LogPHYSICAL, "write", buf, nbytes);

  if (p->handler && p->handler->write)
    return (*p->handler->write)(p, buf, nbytes);

  return write(p->fd, buf, nbytes);
}

の write が失敗するために発生している。ここは PPP で接続先にデータを送る 書き込みをする部分。エラーになるデータを dump してみると

00 21 60 06 62 c2 00 20 06 40 3f fe 05 05 20 22  .!`.b.. .@?... " 
00 00 00 00 00 00 00 00 00 01 20 01 02 18 04 99  .......... ..... 
00 01 00 00 00 00 00 00 00 02 00 50 0d d5 ac 44  ...........P...D 
35 29 44 e3 14 c1 80 11 81 c4 08 fd 00 00 01 01  5)D............. 
08 0a 00 1b b3 63 00 30 63 3a 63 2e              .....c.0c:c.

のようになっている。これは PPP のカプセル化されたデータ (RFC 1548)。 最初の 00 21 が protocol field で、以降のデータが IP であることを示している。

次の 60 以降が IP パケットだが、 6 で始まることから明らかに IPv6。

IPv4 Header Format (RFC 791)

    0                   1                   2                   3   
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Version|  IHL  |Type of Service|          Total Length         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

IPv6 Header Format (RFC2460)

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Version| Traffic Class |           Flow Label                  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

IPv4 Header で Total Length が格納されているところは IPv6 Heaer だと Flow Label となっている。 PPP は Flow Label のデータを IP パケット長 と勘違いし、巨大な IP パケットを送り出そうとしているらしい。でも、 PPPoE では MTU 以上の大きさは送れないので write が失敗している。

physical.c の physical_Write() の引数 nbytes には Flow Label から計算される 値が入っているのを確認できた。

_ とりあえずの対策

tun0 から IPv6 パケットが出ていこうとするのが原因なので、これをフィルター すれば良い。

# ip6fw add deny log all from any to any via tun0

を行えばよい。10 時間ほどテストしたがこれで大丈夫みたい。

状態が悪いときには 2 〜 3 分に 1 回 ppp がエラー終了していたので、 対策できてよかった。

同じ例が報告されてないのが不思議だった点も納得。 12 月下旬以降の 4-STABLE kernel なマシンを PPPoE な IPv6 ルータとして使っている人が非常に少数派という だけなのだろう :-)。

_

kernel 内部のコード *1のどの変更が原因かはまだ調べてない。

謎は、なぜ tun0 から IPv6 パケットが出ていこうとするのかということ。 IPv6 の default route は gif0 に向いているので tun0 から出るのは明らかに変。 ip6fw でフィルターしたログを調べてみても gif0 から出ていくべきパケット ばかり。


*1:に書いたが、問題が発生するようになったのは去年の 12/12 と 12/23 の間。 /usr/sbin/ppp のコードは変化してない。

最近の出来事

_ 買ったもの


2002年 1月 18日 (金)

今日の出来事

_ 買い物

SD は龍池さんと波田野さんが記事書いてる。浅見さんは多忙で core を辞任したことを自分で書いてる。 SD の連載も近くやめるみたい。

(1/19 追加: typo 修正しました。指摘ありがとうございました)

_ ビデオ

録画していたビデオを鑑賞。主題歌が KEY の折戸氏作曲, I've アレンジだというので おねがいティーチャーを見てみたんだけど、うーんこういう話ですか (^_^;;。

FreeBSD

_ IPv6, ppp

問題は二つ。

  1. (default route が向いている) gif0 ではなく tun0 から IPv6 パケットが が出ていこうとする。
  2. その IPv6 パケットが原因で ppp が即死する。

某所の IRC で聞いてみた結果、前者は以前から発生していた模様。 12/12 から 12/23 の間に 4-STABLE に加えられた変更で後者が発生するように なったみたい。


以上、3日分です。