- PPPoEの基本
-
2019-02-07
接続構成
PPPoE(PPP over Ethernet)は、ADSLやFTTH環境等に使用されるネットワーク接続用プロトコルである。従来のPPPは、アナログ回線やISDN等のWAN環境で使用され、通常のEthernet環境では使用できなかった(図1)。そこで、PPPをEthernet上で使用可能にしたものが、PPPoE(PPPパケットをPPPoEヘッダで包み、ネットワーク機器が、PPPパケットをEthernetパケットして取り扱うことができるようにする)である(図2)。PPPoEを使用するには専用のクライアント(ソフトウェア)が必要で、使用するパソコンにインストールしなければならない(Windows XPではPPPoEクライアントが標準で装備)。
そこで、図3のようなBroadband Router(PPPoEクライアント機能およびIPマスカレード機能を装備)使用すると、複数台のPCを同時にInternetへ接続することが可能になる。
また、NTT東西のフレッツサービスでは複数のISPに接続先を切り替えられることができる。この切り替えはプロバイダから与えられるユーザIDの「@」以降の文字を利用してプロバイダの切り替えを行う。
ISPから与えられたユーザ名が"abcde@isp1"の場合、電話局のPPPoEアクセスサーバは「@」以降の文字を確認し、ISP1のユーザと判断できる。その後、「@」の前の部分をISP1の認証サーバに送信し、通信の確立を行う。PPPoEの手順
PPPoEは、PPPをEthernet上で使用可能にしたもので、大きく分けてPPPoE Discovery StageとPPP Session Stage の2つのステージがある(図5参照)。PPPoE Discovery Stageは、PPPをEthernet上で使用するために、「PPPoEアクセスサーバ」のMACアドレスおよびセッションIDを取得する(下記(1)~(4)、(9)参照)。PPP Session Stageは、実際にPPPをEthernet上で使用し、認証、データ通信を行う(下記(5)~(8)参照)。以下にPPPoEを使用して通信を行う手順を説明する。
(1) 「PPPoEアクセスサーバ」の MAC アドレスを探索
PPPoE Active Discovery Initiation (PADI)パケットにて、「PPPoEアクセスサーバ」の存在を確認するために、ネットワーク全体に対してブロードキャストする。(2) Broadband Routerへ応答
PPPoEアクセスサーバ」がBroadband RouterからPADI パケットを受信後、PPPoE Active Discovery Offer (PADO) パケットを、Broadband Routerへ送信する。これは、「PPPoEアクセスサーバ」のMAC AddressをBroadband Routerに対して通知するものである。(3) セッションの開始を要求
Broadband Routerが「PPPoEアクセスサーバ」のPADOパケットを受信後、PPPoE Active Discovery Request (PADR) パケットを「PPPoEアクセスサーバ」へ送信する。これは、Broadband Routerから「PPPoEアクセスサーバ」に対して、PPPoEのセッションIDを要求するものである。(4) セッションIDを通知
「PPPoEアクセスサーバ」がPADRパケットを受信後、PPPoE Active Discovery Session-confirmation (PADS) パケットを送信する。これは、「PPPoEアクセスサーバ」からBroadband Routerに対して、セッションID(ユニークな値)を通知するためである。これ以降は、ここで取得したセッションIDを使用し通信を行う。(5) ~(8)
(5)~(8)はPPP Session Stageとなり、LCPネゴシエーション、認証、IPCPネゴシエーション、PPP通信(実際のデータ)を行う(用語:LCP、IPCPは図5中にて説明)。(9) 通信終了要求
PPPoEセッションの終了を要求するPPPoE Active Discovery Terminate (PADT) パケットを送信する。PPPoEセッション終了要求(PADTパケット)は、Broadband Routerまたは「PPPoEアクセスサーバ」どちらからでも要求できる。
- PPPoEパケット
-
2019-02-07
PPPoEはEthernet上でも通信可能であるため、通常のEthernetパケットを使用する。そのフォーマットを下記に以降に示す。
Ethernetパケット
PPPoE Discovery Stage及びPPP Session Stageで使用する、Ethernet パケットのフォーマットを図6に示す。
- Destination Address:宛先MACアドレス。PPPoE Active Discovery Initiation(PADI)では、ブロードキャスト(FF-FF-FF-FF-FF-FF)となる。
- Source Address:発信元MACアドレス。
- Ether Type:PPPoE Discovery StageとPPP Session Stageを識別するための値。
0x8863 :PPPoE Discovery Stage
0x8864 :PPP Session Stage - Ethernet Payload:PPPoEヘッダ、PPPoE Payload(データ)、PPPプロトコル識別、PPP Payload(データ)等が入る(2-2項参照)。
- Checksum:EthernetパケットのFCS。
Ethernet Payload
thernet Payloadのフォーマットを図7に示す。図7のVer、Type Code、Session ID、LengthがPPPoEヘッダとなる。
- Ver:Ver(PPPoEバージョン)フィールドは4ビット長で、0x1に設定される。
- Type:Typeフィールドは4ビット長で、0x1に設定される。
- Code:CODEフィールドは8ビット長で、PPPoE Discovery Stage及びPPP Session Stageのパケットを識別する。0x09:PPPoE Active Discovery Initiation (PADI)
0x07:PPPoE Active Discovery Offer (PADO)
0x19:PPPoE Active Discovery Request (PADR)
0x65:PPPoE Active Discovery Session-confirmation (PADS)
0xa7:PPPoE Active Discovery Terminate (PADT)
0x00:PPP Session Stage - Session ID:Session IDフィールドは16ビット長で、PPPoE Sessionの識別子として、ユニークな値を設定する。但し、PADI、PADO及びPADRパケットの場合は0x0000が設定される。また、0xffffは未定義で使用することはできない。
- Length:Lengthフィールドは16ビット長で、PPPoEのPayload長をOctetで設定し、Ethernetヘッダ及びPPPoEヘッダ長は含まない。
- PPPoE Payload:PPPoE Payloadは可変長で、PPPoE Discovery StageのTAGタイプ(2-3-1項参照)及びPPP Session Stage(2-3-2項参照)を設定する。
PPPoE Payload
PPPoE Discovery Stage(図6 Ether Typeが0x8863に設定された場合)とPPPoE Session Stage(図6 のEther Typeが0x8864に設定された場合)では、PPPoE Payloadの内容が下記のように変わる。
2.3.1.PPPoE Discovery Stage
Ether Type が0x8863に設定された場合、図8のTAGタイプが設定される。なお、TAGは、PPPoE Payloadに複数設定可能。
- TAG Type:TAG タイプフィールドは16ビット長で、TAG VALUEの種別を設定する。
- 0x0000:End of List
このパケットにこれ以上のTAGが存在しないことを表す。このフィールドに0x0000が設定された場合は、TAG Lengthの値が0x0000となるが、現在は未使用。 - 0x0101:Service Name
次に続くサービス名を表し、TAG_VALUEは、NULLで終了しないUTF-8のキャ ラクターセットを用いる。TAG_LENGTHがゼロの場合、このTAGは全てのサービスを受け入れられることを示す。Service-Name TAGの使用例として、ISP名、サービスのクラスもしくは質の表示がある。 - 0x0102:AC Name
特定のPPPoE アクセスサーバを、識別する文字列が次に続くことを示す。トレードマーク、モデル名、シリアル番号情報などの組み合わせ、もしくはMACアドレスのUTF-8表記で表される場合があり、NULLで区切られることはない。 - 0x0103:Host Uniq
特定のホスト(例:Broadband Router)からのリクエストに対して応答(PADOもしくはPADS)を行うユニークな値。TAG_VALUEはバイナリーデータで データ長はホストが選択する。PPPoE アクセスサーバがこのTAGを受け取った場合、関連するPADOもしくはPADSレスポンスパケットに このTAGを変更することなく含めなければならない。 - 0x0104:AC Cookie
外部からのアタックに対してPPPoEアクセスサーバを防御するために使用される。 - 0x0105:Vender Specific
ベンダー固有の情報を伝える場合に使用される。 - 0x0110:Relay Session ID
PPPoEパケットの中継を行う場合に使用する。 - 0x0201:Service Name Error
要求されたService-Name リクエストが受け入れられなかったことを表す。 - 0x0202:AC System Error
PPPoEアクセスサーバがホストのリクエストを実行する際にエラーを検出したことを表す。 - 0x0203:Generic Error
致命的なエラーを表す。
- 0x0000:End of List
- TAG Length:TAG Lengthは16ビット長のフィールドで、TAG VALUEの長さをOctetで示す。
- TAG VALUE:TAG Typeの実際の値を設定する(可変長)。
2.3.2.PPPoE Session Stage
Ether Type が0x8864に設定された場合、PPP Session Stageが開始される。図9にそのフレームフォーマットを示す。
PPP Protocol:PPPプロトコルの識別子
0xc021:LCP(Link Control Protocol)
Link制御プロトコル。通信設定要求、通信設定肯定応答、通信設定否定応答、通信設定拒否等をコントロールする。0xc023:PAP(Password Authentication Protocol)
パスワード認証用プロトコル。0xc223:CHAP(Challenge Handshake Authentication Protocol)
パスワード認証用プロトコル。0xc8021:IPCP(Internet Protocol Control Protocol)
接続を行う双方が互いに使用するIPアドレスと、TCPのヘッダ圧縮(Van jakobson圧縮RFC1144)を行うかどうかを決める。0x0021:Internet Protocol(IP)
PPPにおいて、IPパケットを取り扱うことを表す。
- PPPoEパケットのキャプチャ結果
-
2019-02-07
PPPoEの動作を確認するために、図10の環境を構築し、実際のPPPoEパケットをキャプチャして、各Session開始から終了までを確認する。
PADIパケットのキャプチャ結果(Broadband Router → PPPoEアクセスサーバ)
「PPPoEアクセスサーバ」の存在を確認するために(「PPPoEアクセスサーバ」のMACアドレスを知るため」、Broadband Routerからネットワーク全体に対してブロードキャストする。
- Session IDは、PADIパケットであるため0x0000となる。
- Host-Uniqは、他のPPPoEホストと識別するために、ユニークなバイナリデータが設定される。
- Service-NameはLengthが0bytesであるため、設定されていない。
PADOパケットのキャプチャ結果(Broadband Router ← PPPoEアクセスサーバ)
「PPPoEアクセスサーバ」のMAC AddressをBroadband Routerに対して通知する。
- 「PPPoEアクセスサーバ」のMAC AddressをSource Addressに設定する。
- Session IDは、PADOパケットであるため0x0000となる。
- AC-Nameは「PPPoEアクセスサーバ」のホスト名「flets」が設定される。
- Service-NameはLengthが0bytesであるため、設定されていない。
AC-Cookieは、PPPoEホストのセッションを識別するために、ユニー - クなバイナリデータが設定される。
- Host-Uniqは、他のPPPoEホストと識別するために、ユニークなバイナリデータが設定される。
PADRパケットのキャプチャ結果(Broadband Router → PPPoEアクセスサーバ)
Broadband Routerから「PPPoEアクセスサーバ」に対して、PPPoEのセッションIDを要求する。
- Session IDは、PADRパケットであるため0x0000となる。
- Host-Uniqは、他のPPPoEホストと識別するために、ユニークなバイナリデータが設定される。
- Service-NameはLengthが0bytesであるため、設定されていない。
- AC-Cookieは、PPPoEホストのセッションを識別するために、ユニークなバイナリデータが設定される。
PADSパケットのキャプチャ結果(Broadband Router ← PPPoEアクセスサーバ)
「PPPoEアクセスサーバ」からBroadband Routerに対して、セッションID(ユニークな値)を通知する。
- Session IDを0x0001に設定する。
- Service-NameはLengthが0bytesであるため、設定されていない。
- Host-Uniqは、他のPPPoEホストと識別するために、ユニークなバイナリデータが設定される。
LCPネゴシエーションパケットのキャプチャ結果 (Broadband Router ⇔ PPPoEアクセスサーバ)
- Broadband Router、PPPoEアクセスサーバ間で、LCPネゴシエーションを行う。右図はLCP Configure-Request。
PAPネゴシエーションパケットのキャプチャ結果(Broadband Router ⇔ PPPoEアクセスサーバ)
- Broadband Router、PPPoEアクセスサーバ間で、PAP認証を行う。右図はPAP認証のパケット。
IPCPネゴシエーションパケットのキャプチャ結果 (Broadband Router ⇔ PPPoEアクセスサーバ)
- Broadband Router、PPPoEアクセスサーバ間で、IPCPネゴシエーションを行う。右図はIPCP Configure-Request。
PADTパケットのキャプチャ結果 (Broadband Router ⇔ PPPoEアクセスサーバ)
PPPoEアクセスサーバ」からBroadband Routerに対して、セッション(ID=1)を終了するためにPADTを通知する。
- Session IDを0x0001に設定する。