Webサーバの構築

今年の頭に用意していた KVM の入ったマシンを使って今回は Web サーバを構築しました。
現状予算的に i-revo の回線1本で構築することになったので、 nginx をつかって、ドメインで VM を切り替えて、サービスを分けることにしました。あとあとIPが必要になってきたらそれだけ分離して IP を割り振る方向で。
また、ルーターも無かったので、 VM ホストに直接フレッツをつないで、 PPPoE セッションを張っています。
今回やって結構、単純なことだけど Linux 触ってないと忘れるなぁと思うことが多かったので、簡単なことでも覚書として書いてます。

ネットワーク構成

とりあえずこんな感じの構成。 VM は増やせるなぁと思いつつ。
f:id:sora_sakaki:20130408192722p:plain

やったこと

モジュールの自動読み込み

まず、マシンを起動したら VM が立ち上がらなかったので、記事を参照したら kvm のモジュールが立ち上がってなかったことに気づきました。触ってないと駄目ですね。なので起動時に立ち上がるようにしました。 Ubuntu の場合 /etc/modules に起動時に自動読み込みするモジュールが一覧になっていたので、 kvm_amd を追加。

参考カーネルモジュールの起動時の自動読み込みについてとOpenRC - 試験運用中なLinux備忘録

PPPoE の設定

前回行わなかった PPPoE の設定を新規で行う必要があったので、やりました。ぱっと設定ファイルの書き方が分からなかったので pppoeconf を使って設定しました。
設定したあと、なぜかデフォルトの route だとデフォルトで br0 に流していたので、 /etc/ppp/ip-up.d/99route-add で ppp0 へ変更しています。

#!/bin/sh
/sbin/route del -net default br0
/sbin/route add -net default ppp0

参考UbuntuでPPPoE接続 - りょうのはてな
Linux(Ubuntu)でルーティングテーブルを変更する。: 麒麟一躍

iptables の設定

このサーバーが外部へのゲートウェイになることになったので、簡単に iptables を設定しました。

Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  192.168.0.0/16       anywhere
ACCEPT     udp  --  192.168.0.0/16       anywhere
ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain

ちょっと途中で失敗したのが、外から中に入る DNS をはじめ開くのを忘れていたので、それだけ注意でした。実際はこれにsshを追加であけています。
また、TCP/80 へのアクセスを内部のVMに転送するためと、外へアクセスするために次の設定をしています。

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       tcp  --  anywhere             anywhere             tcp dpt:http to:192.168.0.6

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  anywhere             anywhere

また、ubuntu では iptables が自動ロードされないので、自分でロードする必要があるので、 /etc/network/if-pre-up.d/iptables_start というスクリプトを用意しました。

参考Man page of IPTABLES
FORWARD と NAT のルール
知らなきゃ損するiptablesのTips(1/3) - @IT

guest をコピーする

guest をコピーしようとしたときにはまったことがありました。

MAC アドレスの変更

MAC アドレスを変更したところ、別のハードウェアとして認識されて、設定が適用されなく(当然だけど)なったので、あたらしいデバイスを eth0 として修正する必要がありました。 /etc/udev/rules.d/70-persistent-net.rules にその対応があったので、これを変更しました。

参考Ubuntuでネットワークカードを変更した時 - DB@WEB

host 名の変更

host 名を変更するのに、 /etc/hostname を変更しました。それに伴って、 /etc/hosts も変更する必要があります。

参考Ubuntu/インストール後の設定 - TOBY SOFT wiki

やってみて

ブリッジデバイス周りの知識が怪しかったのでその辺をちょっと調べるのに時間が若干かかったのと、最近Linux触ってなかったため忘れてることがわりとおおくて変に時間かかりました。br に tap がぶら下がって、その tap につながってパケットのやり取りをする、という構図なんですね。今回は br0 に対して、vm の数 tap を生成しています。
あと、ネットワークはぜんぜんやったことないので iptables でやっとくべき設定とかわからなくて、はじめ ssh のログインのレスポンスがなんかわるいとか(DNSがひけてなかった)で困ってましたが、 @akkiesoft にヒントもらって解決しました。なにかあればアドバイスください。