Just MyShopへ
Princo.org は Justsystem を応援します
技術関連情報サイト http://wiki.princo.org/ をオープンしました.
dum
logo01 logo02
Linux Tips
TOP > tips > kpppoe.html
メニュー

Just MyShopへ
Justsystem
応援します!
border01 border02 border03
border04

カーネルモードでPPPoEを動かす方法

はじめに

RedHat Linux 7.3にてADSL,SDSL,FLETS接続のPPPoEを動作させる方法はいくつかあります。 代表的なものでは、標準インストールされているrp-pppoeなどがありますが、 ユーザーモード(標準設定)でのpppoe接続では回線パフォーマンスを最大限に引き出す事は出来ません。

カーネルモードでPPPoE接続を行うと、ユーザーモードと比較して130%〜300%の パフォーマンス向上を実現することができます。(CPU速度に依存します)

私が行った実験では 28Mbps -> 76Mbps への向上を実現しました。 ここで行うのは、Bフレッツ(光ファイバ)などの高速接続で、 回線のパフォーマンスを最大限に引き出すために、カーネルモード でのPPPoE接続を実装してみます。

実験環境

  • OS: RedHat Linux 7.3
  • PPPoE接続環境: xDSL/Bフレッツ/その他速い回線(私の環境はBフレッツベーシックタイプです)
  • 接続先: テストなのでフレッツスクウェアを利用させて貰います。 id:guest@flets passwd:guest で接続可能です。 Fletsではない人もプロバイダに接続する事で代用可能です。
  • カーネル,CPU: 今回はKernel2.4.19を使用します。 このサイトに掲載してあるカーネル設定ファイルはi686用です。
  • pppd+patch: ppp-2.4.1のsrcにpppoeパッチをあてて実装します。rp-pppoeは使用しません。

手順

  • カーネルを再構築する
  • pppにパッチを当てインストールする
  • ppp設定ファイルを作成する
  • テスト接続

手順1 カーネルを再構築する

カーネルの入手

http://www.kernel.org/ から kernel2.4.19をダウンロードします。

# cd /usr/local/src/
# wget http://www.kernel.org/pub/linux/kernel/v2.4/linux-2.4.19.tar.gz
# cd /usr/src
# tar xfvz /usr/local/src/linux-2.4.19.tar.gz

.configを準備

.config ファイルはカーネルをコンパイルする際の設定ファイルです。 現在のカーネルが使っているCPUがi686ならば、 (CPUの情報は # uname -a で確認) 私がコンパイル時に使った .configをそのまま使えます。

# cd /usr/src/linux-2.4.19
# wget http://princo.org/tips/kpppoe-files/kpppoe.dotconf.txt -O ./.config

そのままではコンパイル出来ないので、 一度 make menuconfig を実行し、そのまま何もしないで終了します。終了時に 設定を保存してください。

# make menuconfig

i686以外のCPUの場合は、カーネルソースをRPMからインストールし、 .configファイルを手動で設定する必要があります。

カーネルソースをインストールし、make menuconfigで 下記項目を設定します。

CONFIG_PPP=m or CONFIG_PPP=y
CONFIG_PPP_ASYNC=m or CONFIG_PPP_ASYNC=y
CONFIG_PPP_SYNC_TTY=m or CONFIG_PPP_SYNC_TTY=y
CONFIG_PPP_DEFLATE=m or CONFIG_PPP_DEFLATE=y
CONFIG_PPP_BSDCOMP=m or CONFIG_PPP_BSDCOMP=y
CONFIG_PPPOE=m or CONFIG_PPPOE=y
CONFIG_N_HDLC=m or CONFIG_N_HDLC=y
CONFIG_UNIX98_PTYS=y

#make menuconfig(#make config or #make xconfig) が完了したら、 .configファイルをKernel-2.4.19のディレクトリにコピーしてください。

# cp .config /usr/src/linux-2.4.19

そのままではコンパイル出来ないので、 一度 make menuconfig を実行し、そのまま何もしないで終了します。終了時に 設定を保存してください。

# make menuconfig

カーネルをコンパイルする

準備ができたらコンパイルです。まず、依存性テストとごみ掃除を行います。

# make dep
# make clean

現在インストールされているカーネルとバージョンが混在出来るように カーネルリビジョンを書き加えます。

# vi Makefile

フィアル先頭部分の EXTRAVERSION に書き加えます。 下記のように記述すると、カーネルバージョンは Kernel-2.4.19-PPPoE1.0 として構築されます。

VERSION = 2
PATCHLEVEL = 4
SUBLEVEL = 19
EXTRAVERSION = -PPPoE1.0

コンパイルを開始します。 かなり時間がかかるので気長に・・・

bzImageを作成
# make bzImage

モジュールをコンパイル
# make modules

モジュールをインストール。"_"の付け忘れに注意。
# make modules_install

initrd イメージの作成。
リビジョンの部分がMakefileと同じになるように注意。
# mkinitrd /boot/initrd-2.4.19-PPPoE1.0.img 2.4.19-PPPoE1.0

インストール!
# make install

ブートローダー(lilo)の設定

lilo.confを設定します。 GRUBの人は別の資料を参考にしてください。

# vi /etc/lilo.conf

赤字部分が変更/追加した部分です。

prompt
timeout=50
default=PPPoE
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
message=/boot/message
lba32

image=/boot/vmlinuz-2.4.18-3
  label=linux-old
  initrd=/boot/initrd-2.4.18-3.img
  read-only
  root=/dev/hda3

image=/boot/vmlinuz-2.4.19-PPPoE1.0
  label=PPPoE
  initrd=/boot/initrd-2.4.19-PPPoE1.0.img
  read-only
  root=/dev/hda3

ブートローダを反映

# lilo -v

実行後に Writing boot sector. と表示されていればOKです。 その後、リブートしてみて、ちゃんと起動されればカーネルの再構築は完了です。

手順2 pppにパッチを当てインストールする

RPMパッケージのアンインストール

rpmでpppがインストールされていると、ソースでのインストールに 失敗してしまうので、まずアンインストールします。

# rpm -q ppp

上記コマンドでrpmパッケージがインストールされているかを調べることができます。 インストールされてる場合は、下記コマンドでアンインストールします。

# rpm -e ppp

rp-pppoe等がインストールされている場合は、同様の方法で rp-pppoe等をアンインストールし、最後にpppをアンインストールして下さい。

pppの入手

ppp-2.4.1のソースパッケージとpppoeパッチを入手

# cd /usr/local/src
# wget http://princo.org/tips/kpppoe-files/ppp-2.4.1.tar.gz
# wget http://princo.org/tips/kpppoe-files/ppp-2.4.1-pppoe.patch4.txt -O ppp-2.4.1-pppoe.patch4
# tar xfvz ppp-2.4.1.tar.gz

pppのインストール

パッチをあててインストール

# patch -Np1 -i /patch/put/dir/ppp-2.4.1-pppoe.patch4
# ./configure
# make
# make install

手順3 ppp設定ファイルを作成する

PPPoE接続に必要な設定を実施します。 ここでは、フレッツスクウェアに接続する設定になっています。

/etc/ppp/chap-secrets ファイル

"guest@flets" * "guest"

/etc/ppp/pap-secrets ファイル

"guest@flets" * "guest"

/etc/ppp/options ファイル

plugin pppoe.so
defaultroute
name "guest@flets"
lcp-echo-interval 20
lcp-echo-failure 3
usepeerdns
persist

手順4 テスト接続

ひと通りの設定が終わったので、テスト接続してみます。 ここでは、 eth0 にFlets側の回線が繋がっていると仮定します。 /var/log/messages を見ながら行うのが良いでしょう。

# pppd eth0

正常に接続されれば、/var/log/messages に下記のようなログが吐かれるはずです。

Sep 25 00:24:33 gw pppd[843]: Plugin pppoe.so loaded.
Sep 25 00:24:33 gw pppd[843]: PPPoE Plugin Initialized
Sep 25 00:24:34 gw pppd[866]: pppd 2.4.1 started by root, uid 0
Sep 25 00:24:34 gw pppd[866]: Sending PADI
Sep 25 00:24:34 gw pppd[866]: HOST_UNIQ successful match
Sep 25 00:24:34 gw pppd[866]: HOST_UNIQ successful match
Sep 25 00:24:34 gw pppd[866]: Got connection: 1836
Sep 25 00:24:34 gw pppd[866]: Connecting PPPoE socket: 00:00:00:00:00:00 3618 eth0 0x807cae0
Sep 25 00:24:34 gw pppd[866]: Using interface ppp0
Sep 25 00:24:34 gw pppd[866]: Connect: ppp0 <--> eth0
Sep 25 00:24:34 gw pppd[866]: Couldn't increase MTU to 1500.
Sep 25 00:24:34 gw pppd[866]: Couldn't increase MRU to 1500
Sep 25 00:24:34 gw pppd[866]: Couldn't increase MRU to 1500
Sep 25 00:24:34 gw pppd[866]: local IP address 3.2.1.10
Sep 25 00:24:34 gw pppd[866]: remote IP address 3.2.1.1
Sep 25 00:24:34 gw pppd[866]: primary DNS address 1.2.3.4
Sep 25 00:24:34 gw pppd[866]: secondary DNS address 5.6.7.8

下記コマンドを実行して、インターフェイスが存在すれば成功です。

# ifconfig

補足

Path MTU Discovery Black Hole の問題と対処

pppoeルーターでIPマスカレードを行っている場合、 ルーター以下のクライアントPCから外部に接続した時に 特定なホストにだけ接続出来ない状態に陥る事があります。

これは、クライアントPCのMTU値がルーターのMTU値と違っている為 発生する問題です。大規模ネットワークでは、全てのクライアントPCの MTUを設定し直す 事はほぼ不可能です。

この場合、netfilterの設定(マスカレード機能)で 通過するパケットのMTUを修正しながら Forwardする事が出来ます。

# iptables -A FORWARD \
  -p tcp --tcp-flags SYN,RST SYN \
  -j TCPMSS --clamp-mss-to-pmtu

追記

2006/10/27時点のパフォーマンス測定結果

測定環境:

  • 回線: DTI via TEPCOひかりホームプラン(PPPoE) 100Mbps
  • Software: Linux 2.4 + ppp-2.4.1-pppoe.pl4
  • CPU: Pentium2 400Mhz
  • MTU値: ppp0(eth0)=1492 eth1=1492
  • NIC: e100 * 2
  • 方法: DMZホスト2台から3セッションづつ合計6セッションで巨大なファイルをwget(http)する

測定結果:

  • 平均速度 12.20MB/s ≒ 97.6Mbps
  • 最高速度 12.35MB/s ≒ 98.8Mbps
  • 平均CPU使用率 47.53%
  • 最近の回線はアホみたいに速い.
dum
border05 dum dum

(c) 2002 Princo.org