GNS3 + VirtualBox + BSDRP で PPPoE + L2TP を手元でこねくり回す

Posted on 2013/08/14(Wed) 03:38 in technical

新しいルータを買った時、新しいルータの代わりになる仮想マシンを試したい時、ISPの回線がもう少しあればいいのに。そう思うときがあります。

※この文脈で言う「ルータ」とは、PPPoEクライアントとNAPTを行う家庭用ブロードバンドルータの意味です。

それを視覚的に分かりやすく手元に置くことが出来たら、ふと試そうと思い立った時に使うことが出来てとても便利ですよね!(裏声)

僕もそう思います。

そこで、VirtualBoxを使った仮想マシン間のネットワークを作り、視覚分野をGNS3で補う形で、簡単なISP接続検証を行えるようにしたいと思います。

構成図

今回作成しようとしているトポロジは次のようになります。小規模構成ですね。

topology

ISP接続と言っておきながら、本来ISPの設備管理と思われる部分については再現しないことにしました。

だったらL2TP区間も要らないじゃねぇかという意見は黙殺します。

BSDRPの入手と準備

BSDRPってのは、NanoBSDをベースにしたルータディストリビューション。

BSDRP : http://bsdrp.net/

と言っても、Vyatta程完全なルータCLIを備えてるわけではないので、必要なパッケージが入ったFreeBSDにsshでログインしてあれこれするのを想像してもらうのが近いと思います。

ダウンロードページはこちら : http://bsdrp.net/downloads?DokuWiki=c72a0692697f7a81efb627a081da55d6

(2013/07/31時点の最新バージョンは1.4なので、ここから先はBSDRP-1.4-full-amd64-vga.img.xzを使用します)

xz形式を解凍すると、250MB程度のイメージファイルが出力されるので、これをVirtualBoxのVDI形式に変換してしまいます。

C:\iso\BSDRP-1.4-full-amd64-vga.imgにあると仮定すると、

C:\iso>"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" convertdd BSDRP-1.4-full-amd64-vga.img BSDRP-1.4-full-amd64-vga.vdi
Converting from raw image file="BSDRP-1.4-full-amd64-vga.img" to file="BSDRP-1.4-full-amd64-vga.vdi"...
Creating dynamic image with size 256000000 bytes (245MB)...

とすると、 BSDRP-1.4-full-amd64-vga.vdi が出来上がる。

VirtualBoxの設定

次に、仮想マシンを作成します。(ここでのパラメータはホストマシンの性能と照らして適宜決めれば良いです) ※VirtualBoxのインストールは飛ばすけどいいよね。

新規で新しく仮想マシンを作りましょう。

vbox_001

名前とオペレーティングシステム

vbox_002

メモリーサイズ

vbox_003

ハードドライブ(ここで、先程作ったBSDRP-1.4-full-amd64-vga.vdiを指定する)

vbox_004

vbox_005

NICの本数はGNS3側で設定できるかので、増やさないで放置。

BSDRPの仮想マシン用設定

BSDRPは仮想マシンとして動かすときは、"# system virtualized"しようね、と User Guide に書いてあるので、とりあえずその通りにする。

起動して、"# system virtualized"と入力して、"# reboot"として再起動。

初回起動時にSSHキーが生成され、それを保存されるか聞かれるので、yesと回答。

再起動後は、仮想マシンの電源を切る。

構成に必要なマシンの増殖

Vagrantの方が良いのかもしれないけど、全部で数台なので手作業でやっちゃうよ。

さっきのマシンを選択してクローン。名前はPPPoE Serverとか何でも。MACアドレスは一応つけ直します。

vbox_006

vbox_007

リンクしているクローンを作れば、容量も少なくて済む。

vbox_008

vbox_009

もう1台も同じようにクローンします。

これで、BBR、BAS_LAC、LNSの3台が作成されるわけだね。

vbox_010

備考

  • BAS(Broadband Access Service) : PPPoE Serverのこと
  • LAC(L2TP Access Concentrator) : L2TP Clientのこと
  • LNS(L2TP Network Server) : L2TP Serverのこと

GNS3の設定(ノードの登録)

まず、GNS3にVirtualBoxの各ノードを登録します。

編集→設定でVirtualBoxの項目に移動して、「設定をテスト」する

gns3_001

VirtualBox ゲストの設定で、VM Listからさっき作ったVMを指定して保存していく。

gns3_002

  • ここで、 "Reserve first NIC for VirtualBox NAT to host OS" にチェックを入れておくと、GNS3で実施する配線前にe0(OSから見るとeth0とかem0とかそういう部分)は配線が予約される。

3台とも登録する。

gns3_003

GNS3の設定(トポロジ構成)

VirtualBox ゲストをドラッグして乗っけていく。

gns3_004

この時、未設置のVirtualBox ゲストを選択できるので順次置いていく。

gns3_005

とりあえず3台。

gns3_006

配線をする。

VirtualBox側で仮想マシンを作った時にはNICは1個しかなくても、GNS3側でNICの数を増やしていれば(今回の例ではとりあえず4つ)、GNS3側から起動する時は増やした設定になっている。

更に、e0は既にVirtualBoxのNAT IFに配線済みなので選択できない。

gns3_007

とりあえず横につなぐ。(名前だけなので、現時点で中身の設定は全て一緒なわけだが)

gns3_008

普通に起動する。

gns3_009

起動後。

gns3_010

各ノードの設定

とりあえず全ノードのコンソールを開く。

gns3_011

こうなる。

gns3_012

ログインはrootでOK。

bbr_001

設定は流しで。仮想自宅に遠いところから。

LNS

[root@router]~# ifconfig em1 192.168.1.3/24
[root@router]~# vi /usr/local/etc/mpd5/mpd.conf
default:
    set ippool add pool1 203.0.113.1 203.0.113.127
    create bundle template B
    set ipcp ranges 192.0.2.1/32 ippool pool1
    set ipcp dns 8.8.8.8
    create link template L l2tp
    set l2tp enable length
    set l2tp self 192.168.1.3
    set link action bundle B
    set link enable chap
    set auth authname user1
    set link enable incoming
[root@router]~# echo 'user1 pass1' >> /usr/local/etc/mpd5/mpd.secret
[root@router]~# echo 'mpd_enable="YES"' >> /etc/rc.conf
[root@router]~# echo 'mpd_flags="-b -s ppp"' >> /etc/rc.conf
[root@router]~# /usr/local/etc/rc.d/mpd5 start

BAS_LAC

[root@router]~# ifconfig em2 192.168.1.2/24
[root@router]~# vi /usr/local/etc/mpd5/mpd.conf
default:
    create link template L1 pppoe
    set pppoe iface em1
    set link action forward L2
    set link enable incoming
    create link template L2 l2tp
    set l2tp peer 192.168.1.3
[root@router]~# echo 'mpd_enable="YES"' >> /etc/rc.conf
[root@router]~# echo 'mpd_flags="-b -s ppp"' >> /etc/rc.conf
[root@router]~# /usr/local/etc/rc.d/mpd5 start

BBR

[root@router]~# vi /usr/local/etc/mpd5/mpd.conf
default:
    create bundle static B1
    set ipcp enable req-pri-dns
    set ipcp enable req-sec-dns
    set iface route default
    create link static L1 pppoe
    set link action bundle B1
    set auth authname user1
    set auth password pass1
    set pppoe iface em1
    open
[root@router]~# echo 'mpd_enable="YES"' >> /etc/rc.conf
[root@router]~# echo 'mpd_flags="-b -s ppp"' >> /etc/rc.conf
[root@router]~# /usr/local/etc/rc.d/mpd5 start

動作確認

LNS

LNSではちゃんと経路ができている。

[root@router]~# netstat -rn -f inet
Routing tables

Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
10.0.0.0/24        link#1             U           0        0    em0
10.0.0.2           link#1             UHS         0        0    lo0
127.0.0.1          link#5             UH          0      260    lo0
192.0.2.1          link#7             UHS         0        0    lo0
192.168.1.0/24     link#2             U           0      170    em1
192.168.1.3        link#2             UHS         0        0    lo0
203.0.113.1        link#7             UH          0        0    ng0
[root@router]~# ifconfig ng0
ng0: flags=88d1 metric 0 mtu 1492
        inet 192.0.2.1 --> 203.0.113.1 netmask 0xffffffff
        inet6 fe80::a00:27ff:fea4:5ad6%ng0 prefixlen 64 scopeid 0x7
        nd6 options=21

BAS_LAC

中間に位置するBASではL3の変化はないし、新しい仮想IFも出来ないよ。

[root@router]~# ifconfig grep UP
em0: flags=8843 metric 0 mtu 1500
em1: flags=8843 metric 0 mtu 1500
em2: flags=8843 metric 0 mtu 1500
lo0: flags=8049 metric 0 mtu 16384
[root@router]~# netstat -rn -f inet
Routing tables
Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
10.0.0.0/24        link#1             U           0        0    em0
10.0.0.2           link#1             UHS         0        0    lo0
127.0.0.1          link#5             UH          0      211    lo0
192.168.1.0/24     link#3             U           0      137    em2
192.168.1.2        link#3             UHS         0        0    lo0

BBR

BBRにアドレスが割り当てられて、経路も追加されている。

(PPP接続した時にDNSのアドレスも降ってきているけど、それをホストに設定するには別途スクリプトが必要なので今回は割愛)

[root@router]~# ifconfig ng0
ng0: flags=88d1 metric 0 mtu 1492
        inet 203.0.113.1 --> 192.0.2.1 netmask 0xffffffff
        inet6 fe80::a00:27ff:fe44:b4da%ng0 prefixlen 64 scopeid 0x7
        nd6 options=21
[root@router]~# netstat -rn -f inet
Routing tables

Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            192.0.2.1          UGS         0        0    ng0
10.0.0.0/24        link#1             U           0        0    em0
10.0.0.2           link#1             UHS         0        0    lo0
127.0.0.1          link#5             UH          0      334    lo0
192.0.2.1          link#7             UH          0        0    ng0
203.0.113.1        link#7             UHS         0        0    lo0

おしまい

まぁ今日の話はBSDRPのページにある pppoe_and_l2tp_lab の焼き直しなんですけどね。

色々話が広がるのでベースパターンとしてこういう環境を作れると良いです。

BASの下に複数台のBBRをぶら下げようとするとどうすべきか、とか。

それにしても、無駄に画像をふんだんに使ってしまった...くどい...