GNS3 + VirtualBox + BSDRP で PPPoE + L2TP を手元でこねくり回す
Posted on 2013/08/14(Wed) 03:38 in technical
新しいルータを買った時、新しいルータの代わりになる仮想マシンを試したい時、ISPの回線がもう少しあればいいのに。そう思うときがあります。
※この文脈で言う「ルータ」とは、PPPoEクライアントとNAPTを行う家庭用ブロードバンドルータの意味です。
それを視覚的に分かりやすく手元に置くことが出来たら、ふと試そうと思い立った時に使うことが出来てとても便利ですよね!(裏声)
僕もそう思います。
そこで、VirtualBoxを使った仮想マシン間のネットワークを作り、視覚分野をGNS3で補う形で、簡単なISP接続検証を行えるようにしたいと思います。
構成図
今回作成しようとしているトポロジは次のようになります。小規模構成ですね。
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のインストールは飛ばすけどいいよね。
新規で新しく仮想マシンを作りましょう。
名前とオペレーティングシステム
メモリーサイズ
ハードドライブ(ここで、先程作ったBSDRP-1.4-full-amd64-vga.vdiを指定する)
NICの本数はGNS3側で設定できるかので、増やさないで放置。
BSDRPの仮想マシン用設定
BSDRPは仮想マシンとして動かすときは、"# system virtualized"しようね、と User Guide に書いてあるので、とりあえずその通りにする。
起動して、"# system virtualized"と入力して、"# reboot"として再起動。
初回起動時にSSHキーが生成され、それを保存されるか聞かれるので、yesと回答。
再起動後は、仮想マシンの電源を切る。
構成に必要なマシンの増殖
Vagrantの方が良いのかもしれないけど、全部で数台なので手作業でやっちゃうよ。
さっきのマシンを選択してクローン。名前はPPPoE Serverとか何でも。MACアドレスは一応つけ直します。
リンクしているクローンを作れば、容量も少なくて済む。
もう1台も同じようにクローンします。
これで、BBR、BAS_LAC、LNSの3台が作成されるわけだね。
備考
- BAS(Broadband Access Service) : PPPoE Serverのこと
- LAC(L2TP Access Concentrator) : L2TP Clientのこと
- LNS(L2TP Network Server) : L2TP Serverのこと
GNS3の設定(ノードの登録)
まず、GNS3にVirtualBoxの各ノードを登録します。
編集→設定でVirtualBoxの項目に移動して、「設定をテスト」する
VirtualBox ゲストの設定で、VM Listからさっき作ったVMを指定して保存していく。
- ここで、 "Reserve first NIC for VirtualBox NAT to host OS" にチェックを入れておくと、GNS3で実施する配線前にe0(OSから見るとeth0とかem0とかそういう部分)は配線が予約される。
3台とも登録する。
GNS3の設定(トポロジ構成)
VirtualBox ゲストをドラッグして乗っけていく。
この時、未設置のVirtualBox ゲストを選択できるので順次置いていく。
とりあえず3台。
配線をする。
VirtualBox側で仮想マシンを作った時にはNICは1個しかなくても、GNS3側でNICの数を増やしていれば(今回の例ではとりあえず4つ)、GNS3側から起動する時は増やした設定になっている。
更に、e0は既にVirtualBoxのNAT IFに配線済みなので選択できない。
とりあえず横につなぐ。(名前だけなので、現時点で中身の設定は全て一緒なわけだが)
普通に起動する。
起動後。
各ノードの設定
とりあえず全ノードのコンソールを開く。
こうなる。
ログインはrootでOK。
設定は流しで。仮想自宅に遠いところから。
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をぶら下げようとするとどうすべきか、とか。
それにしても、無駄に画像をふんだんに使ってしまった...くどい...