朝日ネット 技術者ブログ

朝日ネットのエンジニアによるリレーブログ。今、自分が一番気になるテーマで書きます。

インフラエンジニアを目指す学生のためのインターンメニュー! pfSense で PPPoE サーバーを構築してみる

朝日ネットのthrkrpです。 社会人としてもまだまだ勉強中のピヨピヨ技術者ですが、ブログを初めて書いてみます。

この記事では、pfSense 上で PPPoE サーバーを構築し、クライアントとの間に PPPoE セッションを張ってみた様子を紹介します。 学生向けのインターンメニューとして検討中のものですので、比較的初心者にもわかりやすい内容かと思います。

ぜひご覧ください。

背景と目的

当社では高専生や大学生を対象としたインフラ系インターンを2024年度に実施予定です。 ISP事業に関係のある技術を学習してもらいたという思いの下、主に情報工学系の学生を念頭に置きインターンで実施するメニューの検討が進んでいます。

今回取り上げるのは、メニュー候補の「pfSense というソフトウエア上で PPPoE サービスを提供するサーバーを構築する」というものです。 pfSense の PPPoE サーバーの機能はこれまで使用した例が無く、社内にノウハウがないため、この構築が実際にできるのかを検証してみました。

pfSense とは

pfSense はネットワーク関連のいろいろな機能を実装することができるオープンソースのソフトウエアです。 以下の記事で既に紹介されているとおり、当社ではロードバランサーとして pfSense 内の HAProxy という機能を導入しています。1 techblog.asahi-net.co.jp

各種機能は Debian などにインストールして使うことはもちろんできますが、Web GUI で設定できることや、複数の機能を一元的に管理できる、という点がこのソフトウエアを使う大きなメリットです。 私も初めて設定画面を見たときは、様々な機能が使えることに驚きました。 また、設定コマンドを覚えていなくても、ボタンをポチポチと押していくだけで設定ができてしまうのは、分かりやすいなと思いました。

pfSenseの管理画面:上の赤枠は設定メニュー、下の赤枠は「Services」の一覧

インターンでは、PPPoE、DHCP、DNSキャッシュ、NTP、SNMP、ロードバランサー などのサーバーを構築してもらう、というメニューを考えています。 ISP事業者として理解しておきたい機能がたくさん用意されていることも含めると、pfSense は検証にもってこいのソフトウエアです。 今回はその機能の中でも PPPoE サーバーを作ってみます!

PPPoE とは

PPPoE(Point-to-Point Protocol over Ethernet)とは、PPP という通信を、イーサネット上で利用するために作られたプロトコルです。 PPPoE プロトコルを用いた接続を提供するサーバーはNTT東日本/西日本などのアクセス事業者の管轄内に置かれており、クライアントはユーザー宅のルーターなどが該当します。 アクセス事業者の PPPoE サーバーではIPアドレスの払い出しやクライアントとのセッションの確立などを行い、ISP事業者はユーザー認証やインターネット接続を行います。2

pfSenseでは、ユーザー認証を外部のサーバー 3 へ問い合わせる形での実装も可能です。 こちらの方が実際の状況に近いのですが、今回の検証では、認証を PPPoE サーバー内のユーザーリストを用いて行ってみます。

また、PPPoE での通信ができるようになることを、「セッションを張る」や「トンネルをつくる」などと言うことがあります。通信を通す道を作る、というイメージですね。

構築

では、検証環境をつくっていきましょう。

サーバー・ネットワーク構成図

ホストは手元のPC(Windows)のほか、仮想マシンとして2台(pfSense、Debian)を構築します。 仮想化には VirtualBox というソフトウエアを用います。 ネットワークは3つ用意し、設定はそれぞれのホストやソフトウエア(VirtualBox、 pfSense 、Debian)で行う必要があります。

このネットワークの設計が、今回一番苦労しました。 というのも、初めは2つのネットワークのみで構築しており、PPPoE サーバーとクライアント間の環境は整って検証もうまくいっていたのですが、、

「外部接続を試したときに、pingが飛ばない?」 だったり、

「Timezoneを日本にしているのに時刻が合っていない?」 という事態に。

いろいろと調べて設計しなおした結果、

  • PPPoE接続提供用と外部アクセス用を切り分けたこと
  • ゲートウェイの設定を入れたこと
  • pingコマンドが通るようなルールを入れたこと

を行うことで解決しました。 (詳しくは後述します。)

試行錯誤した後の完成形がこちらの図です!

構築のイメージ:黒枠四角はホスト、青線はネットワークを表す

初めからにここまで設計するのはなかなか難しいですが、この図があれば、あとは簡単! この通りになるようにマシンを設定していくのみです。

VirtualBox の設定

ネットワークの作成

ツールからネットワークの設定画面にいき、設定タブから以下の2つを新規で作成します。

  • Host-only Networks 4
  • NATネットワーク

IPv4アドレスは構成図の通りに設定します。Host-only Networks は既存のものがある場合はそちらを使ってもよいです。 これで各仮想マシンへ割り当てることができるようになります。

pfSense の起動と初期設定

仮想マシンを新規作成します。 まずpfSenseのダウンロードページ からISOイメージファイルを入手します。 次に以下の値を設定し、ネットワークアダプターを3つ有効化したのち、起動させます。5

  • タイプ : BSD
  • バージョン : FreeBSD(64-bit)
  • メモリー : 1024MB

VirtualBox での仮想マシン新規作成
ここでもひと苦労しました。 タイプやバージョンはISOイメージを選択した時点で自動で入力されることが多いのですが、今回自動で入力されたのは 「Other」 。 また、メモリ容量が小さすぎるとインストールが進まない、というエラーにも出会いました。 起動後はいろいろと聞かれますが、Yesを選択して設定を進めます。 Reboot 後に再びインストーラーが起動してしまう場合は、一旦シャットダウンをしてストレージメニューからインストーラーディスクを外して起動しなおすとよいです。

Debian の起動と初期設定

こちらも同じように仮想マシンを新規作成します。 Debianの公式サイト からISOイメージファイルを入手し、ネットワークアダプターを1つ有効化したのち、起動させます。

pfSense の設定

pfSense を起動させると、CLIの画面に「*** Welcome to pfSense ....」という文字が出てきます。 このままCLIで設定を続けることもできますが、LANの設定のみをCLIで済ませたあと、ホストPCのWebブラウザからGUIの管理設定画面に移ると操作がしやすいのでおすすめです。 設定画面へは、ユーザー名 admin、初期パスワード pfsense でログインできます。

Interface

仮想マシンの立ち上げの際に、VirtualBox 上で3つのインターフェースを有効化しているので、ここで pfSense でのインターフェースにどれを割り当てるかを選択します。

Gateway

System/Routing/Gateways で設定します。 WANのゲートウェイがデフォルトになるようにします。

私はこの設定を後回しにしてしまい、pfSense からインターネットにつながらず、時刻設定などが反映されないことがありました。 PPPoE のログを見ても時刻が9時間進んでいて、その都度引き算する羽目に。。

Firewall

Firewall/Rules/PPPoE Server で設定します。 「ICMP プロトコルを PPPoE Server インターフェースで Pass する」 ようなルールを作ります。

これは ping コマンドなどの到達性確認の操作のためです。 PPPoE サーバーのアドレスに ping を打っても応答がなかったのですが、この設定を入れた後は応答がくるようになりました。 デフォルトでは返さないようになっていたようですね。

PPPoE Server

Services の PPPoE Server で設定します。 それぞれのパラメータの説明が割と詳しく書いてあるので、その通りに値を入れていけば問題なく進みました。(英語ですが頑張ってください。)

PPPoE Server の設定

サーバー自身を表すアドレスの指定、ユーザーに割り当てるアドレスの範囲指定は、このサーバーに割り当てた Interface のネットワークに所属させる必要があります。 検証のために、ユーザーは動的IPと固定IPの場合で2つ登録しておきます。

ユーザーテーブルの登録

Debian の設定

Debian はOSのソフトウエアなので、起動するとWindowsの操作画面と同じようにGUIで操作ができます。 Terminal というアプリケーションを起動してCLIで設定を進めます。

Debian の操作画面:Files を開いた状態
アプリケーションの検索

Interface

/etc/network/interfaces に以下を追記します。

auto enp0s3
iface enp0s3 inet manual

auto dsl-provider
iface dsl-provider inet ppp
pre-up /bin/ip link set enp0s3 up
provider dsl-provider

enp0s3 を別の用途で使っている場合は他のインターフェース(enp0s8など)にて設定します。 これでOS起動時のインターフェース自動立ち上げが有効になります。

pppoeconf

PPPoE 接続のために pppoeconf というパッケージが必要なので、apt-get コマンドなどを用いてインストールします(参考サイト)。 インストールするデータはインターネット経由で入手するので、この時だけ VirtualBox で NAT のアダプターをつけて、終わったら外します。

検証

さて、環境が整った(はず)なので、実際に PPPoE 接続をしてみます。

クライアントである Debian ホストは、内部ネットワークにしか所属していない状態です。 PPPoE サーバーに接続して、IPアドレスをもらい、それを用いることで外部のインターネットなどにアクセスすることが可能になります。 これで普段私たちは自宅からインターネット上のコンテンツを見ることができるのですね。

PPPoE セッションを確立させる

pppoeconf コマンドを用います。

PPPoE接続中

インターフェースの情報を自動で探索し、PPPoE 接続の設定がどこに入っているのかを特定するようなプログラムが動いているようですね。 続いて質問に答える形の設定プログラムが動くので、PPPoE サーバー の設定時に登録したユーザー情報を入力します。

まずは動的IPアドレスのユーザー「test1」で試します。

IPアドレスを確認する

設定ウインドウが閉じたので、認証が通ってIPアドレスがもらえたかを確認します。 「ppp0」や「ppp1」などと表記されたインターフェースがあれば PPPoE セッションが張れたことになります。

動的IPアドレスの確認

お!

10.0.3.32 のアドレスがもらえていますね。 アドレスプールは 10.0.3.32 ~ 10.0.3.63 に設定したので、ここから正常に払い出されたことが分かります。

固定IPの場合を試してみます。 もう一度 pppoeconf を実行 6 してユーザーを切り替えて、、

固定IPアドレスの確認

おお!

10.0.3.40 のアドレスがもらえました。これは、ユーザー「test2」で登録した固定IPアドレスに一致しています。

これが PPPoE でアドレスをもらうってことなんですね。

pfSense で接続状況を確認する

サーバー側でも確認してみましょう。 pfSense で PPPoE サーバーに関連したログを確認します。

ログイン履歴

いつ、どのユーザーがログイン(ログアウト)したか、どのIPアドレスを割り振ったか、を確認できるようになっていますね。

外部接続ができるかを確認する

外部サイトへの疎通確認をします。 今回は Google DNS のIPアドレス(8.8.8.8)に ping が飛ぶかを見てみます。

pingテスト

無事、到達できました。

私はここでもうまくいかず苦戦しました。前述の通り、ゲートウェイの設定ができていなかったので、ping が全く返ってきませんでした。(今振り返れば当たり前ですが) このような時は、内部のいろいろなアドレスにも ping を打ち疎通確認をしてみると問題の場所が見つかります。 今回は PPPoE サーバーのアドレスからも応答がないので驚きましたが、こちらはルールで許可することで解決しました。

ユーザー認証のパケットを確認する

pfSense はパケットキャプチャの機能があります。キャプチャしたデータはダウンロードできるので、Wireshark などのソフトウエアで開くこともできます。 様々なプロトコルのパケットが流れているので、適宜絞り込んで表示させるとよいかもしれません。 認証手続きのパケットにはユーザー名などが格納されるはずなので、それを見つけます。 キャプチャを開始したうえで、もう一度 PPPoE 接続を試します。

PAPパケットキャプチャ

パケットを見るとたくさんのことが分かりました。

  • ユーザー名「test1」、PW「test1pw」、返答「Welcome」の文字列がある
  • 2 ウェイハンドシェイクである
  • IPアドレス「10.0.3.3」を新たにもらっている
  • 接続を切ったときの「session closed」 の文字列がある

認証方法の違いを確認する

PPPoE サーバーの設定で認証方法をPAP方式とCHAP方式の2つから選ぶことができます。(デフォルトではPAP方式です。) CHAP方式に設定を変更し再度 PPPoE 接続、そして認証時のパケットを確認します。

CHAPパケットキャプチャ

さあ、間違いさがしゲームスタートです。 皆さんはPAP方式とCHAP方式の違い、分かりましたか? (ヒントはこちら→ 7

パケットキャプチャ面白い!

まとめ

この記事では「pfSense というソフトウエア上で PPPoE サービスを提供するサーバーを構築」してみました。 ネットワーク設計で苦戦しましたが、pfSense の扱い方や VirtualBox を用いた仮想マシンの設定方法などにだいぶ慣れることができ、PPPoE 接続の仕組みについても理解を深めることができました。 また、パケットの中身を見ることで、認証プロトコルの違いを目で見て確認することができました。文字情報のみで勉強するのはもちろん必要ですが、手を動かしてみると記憶に残りやすいですね。

今回は PPPoE サーバーをつくってみましたが、他の機能についてもサーバー構築と検証をしたくなってきました。

ここまで読んでいただいた皆さんも、ぜひ手を動かして何かをつくってみてください。

採用情報

朝日ネットでは新卒採用・キャリア採用を行っております。

新卒採用 キャリア採用|株式会社朝日ネット


  1. pfSense のデフォルト機能としては用意されていないのですが、HAProxy プラグインというものをインストールすると使うことができます。
  2. PPPoE を提供する事業者が限られているので、日本ではあまり使われることがない機能のように思いますが、他の国では回線事業者とISP事業者が同じ場合があり、pfSense を用いて PPPoE サービスを提供している事業者がもっと多いのかもしれないですね。
  3. RADIUS サーバーと呼ばれるものです。
  4. 「Host-only Networks」 と 「ホストオンリーアダプター」 という表記があってわかりにくいてすが、同じものという認識でよいかと思います。以前のバージョンでは「ホストオンリーネットワーク」という表記もあったようで、これはまた別物だったようです。(英語とカタカナが混在しているのも少しわかりにくいですね。。)
  5. pfSense に3つ(以上)のインターフェースをつけることで、デフォルトのWAN、LANに加えてOPT1(、OPT2、...)というLANタイプの追加インターフェースが利用可能になります。
  6. ユーザー認証が必要ない場合は pon dsl-provider や poff dsl-provider で接続と切断を行うことができます。
  7. パスワードの表示の仕方やサーバー・クライアント間のやり取りの回数などに違いがあります。"Peer"、"Value"、"Name" が指すものも違うようですね。