home / vps / servers VPS / サーバー類のインストール

サービス選定〜OSのインストール
>>> サーバー類のインストール
nginx
さくら de Ubuntu
サーバーの引越
バックアップ
Let's Encrypt

 次に必要なサーバー類を入れていきます。

home / vps / servers DNS

 openSUSE13.2はsystemdによる制御なので、BINDをソースからインストールすると起動が面倒なことになりそう(とりあえずsysvinit形式のスクリプトを書けばいいみたいですが)。 逆に、パッケージから入れると、既にnamed.confとゾーンファイルを持っているため、設定ファイルが面倒なことになりそう。 ソースから入れた場合、ICSからパッチが出た時点ですぐにパッチを当てることができますが、自分でやらないといけません。 パッケージを使った場合、パッケージが更新されるまで待たなければいけませんが、更新はzypper upで終わります。 とりあえずパッケージからインストールしてみますか。

 やり方はマニュアルに書いてあります(Reference Guide / Part IV / Chapter 15)。 日本語はリンクたどってもなかなかたどりつけないので、サーチエンジンに聞いたほうが早いです。 この記事を書いている時点では13.1のものが見つかりますが、13.2でもほとんど変わりません。 yast立ち上げてSoftware Managementへ行き、FilterをPatternsにして、DHCP and DNS Serverをインストールします。 dhcpdはいらないので、一応Service Managerに行って動いていないことを確認します。

 問題はここから。 一度yastを終了してもう一度立ち上げると、Network ServicesにDNS Serverというのができているので、一応設定をのぞいてみます。 ここでファイアウォールもあけられる模様。 このDNSはコンテンツサーバーとしてだけ使うので、ForwardersのポリシーはMerging forwarders is disabledにします。 実は何を言っているかよく分かりませんが。 その下にもぐちゃぐちゃと設定が書いてありますが、どうせ自分で設定ファイル持っているので、適当に確認してOKを押すと、設定ががちゃっと書き出されます。

 どれどれ。 named.conf は/etc/named.confにできます。 サーバールートは/var/lib/namedのようです。 chrootするとこのディレクトリがルートになります。 他にも、/etc/sysconfig/namedという設定ファイルがあります。 これはyastの/etc/sysconfig Editorである程度編集できます。 起動スクリプトは/usr/sbin/rcnamedです。 これは/etc/init.d/namedへのシンボリックリンクです。 ちょっと覗いてみると起動時に

/usr/share/bind/createNamedConfInclude
というファイルを実行するようです。 これは/etc/sysconfig/namedNAMED_INITIALIZE_SCRIPTSで変更できます。 これもちょっと覗いてみると、このシェルスクリプトでchrootに必要なファイルをコピーしているようです。

 これらを元に設定ファイルは全部書き直します。 既に持ってるから。 その前に管理のポリシーを決めておく必要があります。 設定ファイルのバックアップのことを考えると、設定ファイルがあっちこっちに散らばっていると面倒です。 /usr/local/etcあたりに全部まとめた方が楽です。 すると、ここをソース管理ツールで管理しておくと、変な設定をしてしまったときに簡単に元に戻せますし、何が悪かったかも調べることができます。 yastが設定をぐっちゃり書き換えてしまった場合もさっくり元に戻せます。 ソース管理ツールを使うときはパーミッションだけ気をつける必要がありますが。 root:root 644/755 でよければ何も考えることはありません。 それ以外の場合はちょっと注意が必要です。

 ソース管理ツールは何でも構わないと思います。 以前はCVSを使っていました。 最近はSubversionが多いです。 が、gitはその場にリポジトリを作れるので、ちょっと管理してみよう、という向きには最高です。 ディレクトリ壊れるとリポジトリもさようならですけど。 バックアップする場合、別途どこかにベアリポジトリを作ってpushするか、他のマシンからpullする必要があります。 サイトで共通な設定はmasterに、ホストによって異なる設定は適当なブランチに置けば、masterを更新したらぐるっと一周pullして回れば、とりあえず全滅しない限りバックアップは必要なくなります。 ブランチは気をつけないと死んじゃいますが。

 namedの場合、ゾーンファイルを編集したら全サーバーで同期する必要があります。 普通はマスターで編集してスレーブにゾーン転送するのですが、お互いのホストがsshで行き来できて、なおかつソース管理ツールを使ってゾーンファイルを管理していれば、どこかでゾーンファイルをチェックインしたら、残りのサーバーでアップデートしてリロードすればOKです。 ゾーン転送の設定をする手間が省けます。

 とりあえず今まで使っていた設定をSubversionで持ってきて、gitのリポジトリをgit initでその場につくり、namedの設定だけ登録します。 /usr/local/etc/named以下に設定を固めて置くことにして、まず、named.confを見直します。 直さなければいけないところがあるなら、コピーするかブランチ切るかして直します。 できたら、openSUSEのデフォルト設定では/etc/named.confになるので、シンボリックリンクを張ってしまいます。 次にゾーンファイルですが、ADSL導入日誌で作ったファイルがなるべくそのまま使えるように、dbサブディレクトリ以下に置くことにします。 すると、サーバールートは/var/lib/namedなので、この下にdbという名前でゾーンファイルディレクトリへのシンボリックリンクを張ってしまいます。

 最後にchrootを考慮する必要があります。 named.confとそこからincludeされているものは先ほどのcreateNamedConfIncludeが勝手にコピーしてくれます。 ゾーンファイルは勝手にコピーしてくれないので、/etc/sysconfig/namedファイルのNAMED_CONF_INCLUDE_FILESにゾーンファイル名をフルパスで書いておきます。 コピーしているのがシェルスクリプトで、ファイル列挙はシェルパターン+forなので、普通にシェルのワイルドカードが使えます。

 これで準備完了なので、rcnamed startとやると動き出すでしょう。 あとはnslookupできちんと動いているか調べます。 うまく動いているようならyastからブート時に起動するように設定しますが、このときに設定ファイルを壊してくれるので、git checkoutなりsvn revertなりして元に戻しておきましょう。 リブートしてきちんと動いているかどうかを確認。 設定ファイルを変更した場合、rcnamed restartしないと設定ファイル類がコピーされないようなので注意。

 もしかするとネームサーバー(コンテンツサーバーではなく、プロバイダから指定されるサーバー、resolv.confに書くやつ)が書き換わってるかもしれないので、確認しておいたほうがいいです。 yastのネットワーク設定のページにあります。 とりあえずこれでDNSは一段落。 あとで少し設定を変える必要がありますが。

home / vps / servers Apache HTTPD

 とりあえず、Google Analyticsに対応させてみたので。 Google Analyticsは各ページにトラッキングコードを埋めなければいけませんが、そんなの手作業でやってたら面倒なわけです。 サイト内のすべてのHTMLファイルに付加するのですから、HTTPサーバーにやらせた方が楽です。

 定番はmod_ext_filterを使ってsedを動かす方法のようです。 他に、mod_google_analyticsというモジュールもあります。 ちょっと調べると、Apache httpd-2.3以降では実験的なモジュールですがmod_sedというのが使えるようになっているので、これを使うことにします。 性能がどうなるかは知らんです。

 マニュアルを見るとmod_sedのディレクティブOutputSedは.htaccessにも書けるように見えますが、実際にやってみると書けません。 トラッキングコードはユーザーごとにIDが違うので、.htaccessで書けるとよかったのに。 仕方がないので、httpd.confの適当なところに、

<IfModule mod_sed.c>
IncludeOptional /usr/local/etc/httpd/google_analytics/*.conf
</IfModule>

と書いて、ユーザーごとの設定はここに書くことにします。 ユーザーのホームディレクトリ以下から設定を拾ってくる方法もないことはないですが、そうするとhttpd.confに任意の設定を突っ込めてしまうのでマズいでしょう。 実際の設定ファイル(google_analyticsディレクトリ以下に置くファイル)はこんな感じ。

<Directory "/home/user/public_html">
AddOutputFilter SED html htm
OutputSed "s%</BODY>%</body>%"
OutputSed "s%</body>%<script> ...延々とGoogleに言われたコードを入れる... </script></body>%"
</Directory>

 作者のチュートリアルを見ると、OutputSedで指定したコマンドは、全部まとめてひとつのsed処理に使われるようです。 ディレクトリを分けていればおそらく問題はないでしょうが、あちこちにOutputSedがあったらどうなるんだろう? sedのコマンドはバックスラッシュやクオートが登場する可能性がありますが、Apacheのソース(server/util.cあたり)を見ると、

  1. 文字列を開始するクオートはシングルクオートかダブルクオートが使える。
  2. 文字列の開始時に使ったクオート文字を文字列内で使う場合、バックスラッシュでエスケープする。
  3. バックスラッシュもバックスラッシュでエスケープする。
  4. バックスラッシュの次の文字がバックスラッシュか開始クオート文字ではない場合、バックスラッシュはそのまま(ありのまま)使用される。

となっている模様。 今回指定されたコードはシングルクオートしか使われていなかったので、HTTPDの設定ファイル側ではダブルクオートでくくっておきました。 あと、sedのsコマンドは普通はスラッシュをデリミタとして使いますが、HTMLの閉じタグにスラッシュが出てきてしまいますので、適当なものに変更する必要があります。 ここではパーセントを使っています。

 ひとつ目のOutputSedは、昔はbodyを大文字で書いていたので、それを小文字にするためのものです。 ふたつ目のOutputSed</body>をごっそり入れ替えます。 ということは、</body>を書いてないページにはトラッキングコードは入らない、ということです。 HTMLのDTDでは</body>の省略が許されていたはずなので、トラッキングコードを入れたくないページは</body>を削除してしまえばOK。

 あとはsystemctl restart apache2.serviceとすれば、勝手に<body>のところにトラッキングコードが入るはずです。 トラッキングコードを外したければ、google_analyticsディレクトリ以下のファイルをmvしてしまえばOK。 ユーザーごとに設定ファイルを分けておけば、ユーザー単位で入れたり外したりを制御できます。 シンボリックリンクにしておくといいのかも。

home / vps / servers ファイアウォールで変なホストを蹴る

 qmail-smtpdサービスが

Jun 13 19:44:19 hostname systemd[1]: qmail-smtpd@14-192.0.2.25:25-193.189.117.230:61483.service: main process exited, code=exited, status=1/FAILURE
Jun 13 19:44:19 hostname systemd[1]: Unit qmail-smtpd@14-192.0.2.25:25-193.189.117.230:61483.service entered failed state.

というログを吐いて死んでることがあって。 tcpdumpしてみると、コネクションを張ってすぐ切っているみたいな感じで。 他にも、AUTHだけ送ってきて、対応してないからエラーになるけど、それ見てQUITしてる.cnなサイトもあった。 qmail-smtpdってエラーログ吐かないからこういうのって簡単には見つけられないんですよね。

 で、特定のIPアドレスのホストを蹴るには、/etc/sysconfig/SuSEfirewall2FW_SERVICES_DROP_EXTという変数があるので、ここにホスト名をスペースで区切ってずらずら書いておきます。

FW_SERVICES_DROP_EXT="121.30.225.150 193.189.117.230"
sysconfig/SuSEfirewall2のコメントを見れば分かるとおり、ネット指定で一網打尽にもできます。 コメントではプロトコルが必要に見えますが、なくても平気です。 スクリプト/usr/sbin/SuSEfirewall2を確認すると、プロトコルが空の場合はポート・ソースポートも空にしておかないとエラーになります。

これでyastを立ち上げ、Security and Users → Firewall から、「Save Settings and Restart Firewall Now」を選べばOKです。 ファイアウオール再起動後、iptables -Lで確認すると、

# iptables -L -n
...
Chain input_ext (1 references)
target     prot opt source               destination
DROP       all  --  0.0.0.0/0            0.0.0.0/0            PKTTYPE = broadcast
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0            icmptype 4
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0            icmptype 8
DROP       all  --  121.30.225.150       0.0.0.0/0            ctstate NEW
DROP       all  --  193.189.117.230      0.0.0.0/0            ctstate NEW
reject_func  tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:113 ctstate NEW

というような感じでDROPが入っていることが分かるでしょう。 -nを指定しておかないとDNSの逆引きに時間がかかるので注意。 /etc/hostsで適当に指定しとくといいです。


Copyright (C) 2016 akamoz.jp

$Id: servers.htm,v 1.6 2019/05/24 15:20:20 you Exp $