サービス選定〜OSのインストール | |
>>> | サーバー類のインストール |
nginx | |
さくら de Ubuntu | |
サーバーの引越 | |
バックアップ | |
Let's Encrypt |
次に必要なサーバー類を入れていきます。
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/named
のNAMED_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は一段落。
あとで少し設定を変える必要がありますが。
とりあえず、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
あたり)を見ると、
となっている模様。 今回指定されたコードはシングルクオートしか使われていなかったので、HTTPDの設定ファイル側ではダブルクオートでくくっておきました。 あと、sedのsコマンドは普通はスラッシュをデリミタとして使いますが、HTMLの閉じタグにスラッシュが出てきてしまいますので、適当なものに変更する必要があります。 ここではパーセントを使っています。
ひとつ目のOutputSed
は、昔はbodyを大文字で書いていたので、それを小文字にするためのものです。
ふたつ目のOutputSed
で</body>
をごっそり入れ替えます。
ということは、</body>
を書いてないページにはトラッキングコードは入らない、ということです。
HTMLのDTDでは</body>
の省略が許されていたはずなので、トラッキングコードを入れたくないページは</body>
を削除してしまえばOK。
あとはsystemctl restart apache2.service
とすれば、勝手に<body>のところにトラッキングコードが入るはずです。
トラッキングコードを外したければ、google_analyticsディレクトリ以下のファイルをmvしてしまえばOK。
ユーザーごとに設定ファイルを分けておけば、ユーザー単位で入れたり外したりを制御できます。
シンボリックリンクにしておくといいのかも。
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/SuSEfirewall2
にFW_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 $