ADSL(kernel mode pppoe)とIP Masquerade



ADSL接続について
PPPoE接続
kernel再構築
pppの設定
iptablesの設定


2004/11/06 追記
pppd-2.4.2へのアップグレードに伴って、/etc/ppp/peer/zeroの内容を変更。
plugin pppoe.so から plugin rp-pppoe.soへ名前が変わりました。



ADSL接続について

現在ADSL接続はNTT のFlet's ADSLやYahoo BB! などがありますが、Yahoo BB! 以外はPPPoE( Point to Point Protocol over Ethernet) を用いてADSL接続を実現しています。Yahoo BB! はPPPoAという別技術を使用しているため、ここでの設定は利用できません。あしからず。

この設定は、私がNTT Flet's ADSLとISPにZEROを使用しているため、それに依存した設定になっている可能性もあります。接続できなかった場合はお知らせいただければと思いま す。


PPPoE接続 

PPP接続は、以前ダイヤルアップ接続が主流であったときも用いられていたものです。Point to Point Protocolの名称通り、2点間を繋ぐためのプロトコルです。接続に認証が使用できるため、ダイヤルアップで会社のネットワークや自宅ネットワークに 接続する際に用いられたりもします。

ダイヤルアップではPPPを通すために電話回線を用いて行なっていましたが、ADSLでは電話回線の上にADSL接続を確立し、その上のethernet のさらに上でPPPoEによる接続を行ないます。ちなみにADSL接続はATM ( Asynchronous Transer Mode)という技術を用いて実現されています(確か)。

Linux でPPPoE接続を行なうためには色々方法がありますが、最も簡単に接続する方法はrp-pppoeというプログラムを利用することでしょう。rp- pppoeとpppdがあれば、ADSL接続を行なえます。
adsl-setup
adsl-start
でADSL接続が可能なため、非常に多くの方に利用されてるようです。

ただ、この接続方法はLinux kernel のuser mode で実行されているそうで、性能的に見ればまだまだ改善の余地があるというこ とです。
2004/11/6 追記
最近のrp-pppoeはkernel-modeも未保証ながらサポートしてるみたいですね。 rp-pppoeをビルドするときにpppdのソースコードが必要みたいです。


そこでこのページでは、もうひとつの方法であるkernel mode でのADSL接続を行な うことにします。
この方法であれば、rp-pppoeいらずでADSLに接続できますからね。

kernel 再構築

kernel mode でのPPPoE 接続には、当然kernelがPPPoE機能をサポートしている必要があります。
kernel 2.4.20 (2003.8月現在)はexperimental ながら標準でサポートされています。
( network device support -> ppp -> ppp over ethernet support )

pppをMかYにすることでこの機能を利用できます。
モジュールにするか静的に組み込むかで考えるところがありますが、カーネルモードで接続できたか目で確認しやすくするために、lsmodでpppoe.o が組み込まれたか確認できる、モジュールの方をお勧めします。



pppの設定
pppd は予めインストールしておいてください。pppd-2.4.2以降ではパッチを当てな くてもkernel-mode pppoe用のモジュール(rp-pppoe.so)がビルドされるはずで す。
pppd-2.4.1にpppoeパッチを当ててビルドした場合はpppoe.soという名前でモ ジュールができます。この名前は後で/etc/ppp/peer/zeroの設定に影響します。
さて、ここではインストールは終了したものとして設定のみを記述します。


/etc/ppp/ 以下にある chap-secrets or pap-secretsを書きます。

-----/etc/ppp/chap-secrets---
"your acount" zero "your password"
"your acount" * "your password"
----------------------------

一行目と2行目はどちらかを書けば大丈夫です。一行目は、後に/etc/ppp/peers/zeroを作成した場合の例です。



次にoptions ファイルを変更します。

-----/etc/ppp/options------
defaultroute
name "your account name"
lcp-echo-interval 20
lcp-echo-failure 3
persist
---------------------------

次に /etc/ppp/peers/ 以下に自分の接続専用の設定を書きます。私の場合はzeroという名前にしています(ISPの名前)。

----/etc/ppp/peers/zero------------
plugin rp-pppoe.so
eth0
------------------------------------


これらのファイルは、chap-secrets, pap-secrets以外は、特に/etc/ppp/peers以下のものについては作成する必要はありません。
スクリプトで接続を変更しやすくするようにファイルに記録しているだけで、実際はpppd のオプションとして書いてしまえば良いのです。

さて、ここまで来たら、最後にpppdを実行するだけです。
ここでは実際に私が使っている pppd 実行オプションを書きます。

/usr/sbin/pppd lock persist holdoff 60 peerdns mru 1412 mtu 1454 user (your account) remotename zero \
ipparam ppp0 linkname ppp0 call zero noauth hide-password

\は改行をエスケープするためで、実際は\を除いて一行で書くのが良いでしょう。
(※注 mru, mtuの値については、各ISPで推奨値 が指定されていると思いますので、それを設定してください)

これを行なえばPPPoE接続は完了しているはずです。
/sbin/ifconfig
を行ない、ppp0が現れているか確認してください。
ppp0が現れていたら、適当なア ドレス(googleなど)にpingを送り、接続がきちんと行なえているかどうか確認しましょう。

また、lsmodpppoeモジュールが読み込まれており、ps ax |grep pppoeでプロセスにpppoeがなければkernel modeでPPPoE接続が行なわれていると考えて良いと思います。



iptablesの設定(IP Masquerade)

家庭内LANなど、あまりセキュリティに気を配りすぎる必要のない場合は、iptablesを

iptables -A POSTROUTING -s 192.168.0.0/255.255.255.0 -o ppp0 -j MASQUERADE
iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

このように実行すれば、NATを実現することができます。
一行目が実際のNATを実現するところです。192.168.0.0/255.255.255.0 は各自の環境に併せて変更してください。
二行目は、MTU等の違いによって外部との接続にエラーが起こることがあるため、それを防ぐ目的で設定されています。
kernel mode PPPoEで接続したあと、上記iptablesの一行目だけを実行した場合、見ることのできないページが出てきた場合は2行目を実行してみてください。



戻る
Top Pageへ