VPSでVineLinux6.1 / BIND / Postfix / courier-imapd(pop3d) / apache2 / Postgresql / Proftpd / iptable を動かしたメモ

最近VPS上で持ち込みisoができるようになったので、いろいろできますよね。
ってことで、構築メモ。久々にやると、物忘れが多くてホント困ります。頭腐ってきたなぁw

自前で、フレッツ回線と固定IP8のプランを使った運用をしているけれど、ちょっと料金も高いし、最近流行のVPSサーバーを借りて構築してみようというのが発端です。
サーバー移行の背景
・社内サーバ室にDNS/メール/Web等を構築している
費用対効果や管理コストを見直す必要がある
Bフレッツ回線費用
固定IPプロバイダ料金
サーバーの管理
構築した当時は、きめ細やかなサービスを行えるため 自社内で回線・プロバイダ・サーバーを用意していた。
しかし、回線、プロバイダ、サーバー(ハードウェア)の異常や不具合により、ランニングコスト・管理コストが増大する。
・現在は、外部にサーバーをまるごと1台レンタルできるようになった。
各社でVPSサービスと名乗るサービスが提供され始める。 OSや構築・使用方法に自由度がある。
ランニングコスト、ハードウェア管理コストが安いのであれば利用すべき。

 

まぁ、安いに越したことはないけれど、あとはメンテナンス性が重要視されますね。
幸い、リモートでの監視やOSの再起動などは、VPSサービス会社によって別途コントロールパネルなどが用意されているのが大半のようです。

VPSサーバーの構成
CPU:物理1コア 2.2GHz(相当)
MEM:2GB
HDD:100GB
IP:グローバルアドレス1個
ネットワーク:100Mbps共有回線
OS:VineLinux 6.1 x64 (isoイメージにてインストール)

もうね、これで月額980円とか十分すぎです。
OS(VineLinux6.1 x64)のインストールについては割愛して、各サービスの設定は下記のような感じで設定していきます。
(ほぼ個人的なメモなので、大まかなところのみ載せてます。)

DNSの設定(bind)設定ファイル保存場所
/etc/named.conf

ゾーンファイル保存場所
kenti.jp
/var/namedb/kenti.jp/kentijp.zone

named.conf(設定事項の抜粋)zone “kenti.jp” {
type master;
file “kenti.jp/kentijp.zone”;
allow-update { none; };
};

kenti.jpゾーンファイル$ORIGIN kenti.jp.
$TTL 3600
@ IN SOA ns.kenti.jp. info.kenti.jp. (
2013031002 ;serial
10800 ;Refresh
3600 ;Retry
604800 ;Expire
3600 ) ;Negative Cache TTL

IN NS ns.kenti.jp.
IN MX 10 mx.kenti.jp.

localhost IN A 127.0.0.1
;
; kentijp ZONE
;
ns IN A 59.106.182.x ;dns.kenti.jpのIPを指定
www IN A 59.106.182.x ;www.kenti.jpのIPを指定
mail IN A 59.106.182.x ;mail.kenti.jpのIPを指定

; CMAME
pop IN CNAME mail
smtp IN CNAME mail

メールの設定(SMTP:postfix)/etc/postfix 配下に下記設定ファイルがあります。
main.cf …主設定ファイル
pgsql_virtual_alias_map…エイリアス(転送)設定
pgsql_virtual_domain_map…メール受信するドメイン設定
pgsql_virtual_mailbox_map…メール受信するアドレス設定
⇒postgresqlのpostfixadminDBにて SMTPが外部から受信するドメイン、各アドレスが格納されていますので、それを参照する設定ファイル群。
pop_before_smtp
⇒pop-before-smtpdによって自動作成されるファイル

postfixのmain.cf(主設定ファイル)virtual_transport = virtual
virtual_mailbox_base = /var/mailbox ;メールボックス保存先ディレクトリ(pop3サービスが使用する)
virtual_alias_maps = hash:/etc/postfix/virtual , pgsql:/etc/postfix/pgsql_virtual_alias_maps.cf
virtual_alias_domains = $virtual_alias_maps
virtual_mailbox_domains = pgsql:/etc/postfix/pgsql_virtual_domains_maps.cf ;サーバが受信するドメイン
virtual_mailbox_maps = pgsql:/etc/postfix/pgsql_virtual_mailbox_maps.cf ;サーバーが受信するメールアドレス
virtual_minimum_uid = 10000
virtual_uid_maps = static:10000 ;メールボックスに保存するユーザーID(pop3サービスが使用する)
virtual_gid_maps = static:10000 ;メールボックスに保存するグループID(pop3サービスが使用する)
disable_vrfy_command = yes
allow_percent_hack = yes
swap_bangpath = yes
smtpd_recipient_restrictions = permit_mynetworks,check_relay_domains
local_transport = virtual
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
transport_maps = hash:/etc/postfix/transport
message_size_limit = 25600000 ;メール1件当たりの最大送受信制限サイズ(25MByetesに設定)
mailbox_size_limit = 0 ;各自のメールボックスの制限サイズ(現在は無限に設定)
############################################################
smtpd_recipient_restrictions =
permit_mynetworks
permit_sasl_authenticated ;SMTP認証をしたユーザーは送信可能
check_client_access hash:/etc/postfix/pop-before-smtp;POP受信成功したユーザーは送信可能
reject_unknown_sender_domain ;DNSが存在しないメールサーバーからのメールは拒否
reject_unauth_destination ;メールボックスが存在しないメールは拒否

smtpd_client_restrictions =
permit_mynetworks
check_client_access hash:/etc/postfix/reject_client; ;独自DBにマッチした宛先からのメールは拒否

smtpd_sender_restrictions =
reject_non_fqdn_sender hash:/etc/postfix/reject_mailaddress ;IPを逆引き出来ないメールサーバーからは拒否

メール設定(SMTP認証:CyrusSASL)/etc/sasl2 配下に下記の設定ファイルがあります。
smtpd.conf

SMTP認証をどのように行うのか記載します。
当サーバーではpostgresqlを使用した認証を行います。

CyrusSASLのsmtpd.conf(設定ファイル)### SMTP Auth setting
pwcheck_method: auxprop
auxprop_plugin: sql ;SMTP認証のDBに、SQLを使用する
allowanonymouslogin: no
allowplaintext: yes
mech_list: plain CRAM-MD5 DIGEST-MD5 ;SMTP認証で使用できるアルゴリズム
sql_engine: pgsql ;使用するSQL(この場合はpostgresql)
sql_hostnames: localhost ;DBの接続先IP(自身なのでlocalhostとする)
sql_user: postfix
sql_passwd: ***********
sql_database: postfix
sql_statement: SELECT password FROM mailbox WHERE username = ‘%u@%r’ AND active = ‘1’

メールの設定(POP3:courier-imapd)/etc/courier-imap 配下に設定ファイルがあります。
POP3(POP受信メールサービス)の設定
pop3d
imap(imap受信メールサービス)の設定
imapd
⇒当サーバーでimapは使用していない

courier-imapdのpop3d(設定ファイル)##VERSION: $Id: pop3d.dist.in 20 2011-04-04 02:50:13Z mrsam $
#
# pop3d created from pop3d.dist by sysconftool
#
# Do not alter lines that begin with ##, they are used when upgrading
# this configuration.
#
# Copyright 1998 – 2004 Double Precision, Inc. See COPYING for
# distribution information.
#
# Courier POP3 daemon configurationPIDFILE=/var/run/pop3d.pid
MAXDAEMONS=40
POP3AUTH=”LOGIN CRAM-MD5 CRAM-SHA1″
POP3AUTH_TLS=”LOGIN PLAIN”
PORT=51.106.182.x,127.0.0.1.110 ;どのIPでサービスを待ち受けるか
TCPDOPTS=”-nodnslookup -noidentlookup” ;セッション開始時のオプション(DNS逆引き等しない)
LOGGEROPTS=”-name=pop3d” ;ログの名称
POP3DSTART=YES ;POP3サービスを使用するかどうか
MAILDIRPATH=/var/mailbox’ ;各人の使用するメールボックスディレクトリ

メール設定(pop-before-smtp)・/etc/pop-before-smtp-conf.pl
READMEを参考に設定すること
当サーバーはSMTPにPostfix、POP3にcourier-imapdを使用しているので、該当箇所をコメントアウトし使用する設定とする。
・/etc/postfix/pop-before-smtp.db
POPが成功したIPを記録するDBファイル。 SMTPサーバーはこのDBをもとに、送信許可をする。

pop-before-smtp.pl(設定ファイル)# This config file is a perl library that can override various aspects of the
# pop-before-smtp script’s setup. Install it as /etc/pop-before-smtp-conf.pl

$logto = ‘/var/log/pop-before-smtp’; ;ログファイルの場所

# Override the DB hash file we will create/update (“.db” gets appended).
$dbfile = ‘/etc/postfix/pop-before-smtp’; ;Postfixに提供するDBファイル

# A 30-minute grace period before the IP address is expired.
$grace = 30*60; ;POP3が成功したIPから30分間、SMTPを許可する

# For Courier-POP3 and Courier-IMAP: ;courier-imapを使用する設定箇所
$pat = ‘^[LOGTIME] (?:\[|\S+ )(?:pop3|imap|couriertcp)(?:d|d-ssl|login)\]?: ‘ .
(省略)

#====================== Postfix BerkeleyDB =======================START=
sub tie_BerkeleyDB
{
$dbh = tie %db,’BerkeleyDB::Hash’,-Filename=>”$dbfile.db”,-Flags=>DB_CREATE
or die “$0: cannot dbopen $dbfile: $!\n”;
}
(省略) ;Postfixを使用する設定箇所

#====================== Postfix BerkeleyDB =========================END=

Webサーバー設定(Apache2)MPMの切替(prefork or worker)
update-alternatives –config apache2
今回postfixadminでPHPを使用するため、preforkへ 切り替える必要がある。
workerは大量のhttpアクセスサービスするサイト向き
preforkは安定性やCGIとの互換性を必要とするサイト向き
バーチャルサーバーの設定
/etc/apache2/conf/apache2.conf
ns.kenti.jp (実名のWebServer)
www.kenti.jp (Virtual)

Multi-Processing Modulesの設定方法# update-alternatives –config apache2

2 プログラムがあり ‘apache2’ を提供します。

選択 コマンド
———————————————–
1 /usr/sbin/apache2.worker
*+ 2 /usr/sbin/apache2.prefork ;現在設定値

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:

apache2.conf(設定ファイルの抜粋)ServerName ns.kenti.jp:80 ;実サーバ名と使用ポート
DocumentRoot “/var/www/html” ;サーバー上でhtmlファイルの置き場所

<VirtualHost *:80> ;バーチャルサーバー www.kenti.jp
ServerName www.kenti.jp
DocumentRoot /home/webdata/html ;htmlの置き場所
</VirtualHost>

FTP設定(proftpd)/etc/proftpd.conf
FTPサービスの挙動を決めます。
アクセス制限には、後述するxinetdのhostsにて行います。
設定ファイルの記述は、次の通り。

proftpd.conf(設定ファイルの抜粋)# This is a basic ProFTPD configuration file (rename it to
# ‘proftpd.conf’ for actual use. It establishes a single server
# and a single anonymous login. It assumes that you have a user/group
# “nobody” and “ftp” for normal operation and anon.

ServerName “ns.kenti.jp” ;サーバー名の設定
ServerType inetd ;サービスの起動にxinetdを使用する
DefaultServer on

DefaultRoot ~/ ;カレントディレクトリより上位を見れない設定

# Port 21 is the standard FTP port.
Port 21 ;サービス起動ポート

# Umask 022 is a good standard umask to prevent new dirs and files
# from being group and world writable.
Umask 022

# Use localtime
TimesGMT FALSE

UseReverseDNS on ;接続元のDNS逆引き設定
IdentLookups off ;identを返さない

DB(postgresql)/var/lib/pgsql 配下
・設定ファイル…data/pg_hba.conf
DBの接続要求を受け付けるネットワークの設定など ⇒localhostのみしか接続しないため、外部公開しない設定
・DB保管場所…data/base 配下
バックアップには、pg_dumpallコマンドでバックアップを取る
決してこのフォルダを丸ごとバックアップしないこと。
(バックアップ方法)pg_dumpall > 保存ファイル名

postgresql(DB構成の抜粋)(postgres) -bash-4.2$ psql -l
データベース一覧
名前 | 所有者 | エンコーディング | 照合順序 | Ctype(変換演算子) | アクセス権
———–+———-+——————+————-+——————-+———————–
postfix | postfix | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 |
postgres | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 |
template0 | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres
: postgres=CTc/postgres
template1 | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres
: postgres=CTc/postgres
(4 行)

※postgresqlインストール後、自動的にtemplate0,template1,postgresのDBは作られている。
今回、postfixのDBはpostfixadminのINSTALL.TXTに従って、下記の通り作成すること。

$ psql
> CREATE USER postfix WITH PASSWORD ‘whatever’;
> CREATE DATABASE postfix OWNER postfix ENCODING ‘unicode’;

メールユーザーアカウント管理(Postfixadmin)postfixadmin-2.3.5.tar.gzをダウンロードする
http://sourceforge.net/projects/postfixadmin/files/postfixadmin/postfixadmin-2.3.5/
パッケージ展開後、下記のフォルダへ配置
/var/www/html/postfixadmin
設定ファイルは、下記の通り
config.inc.php
DBにpostgresqlを使用する設定を記述のこと
$CONF[‘database_type’] = ‘pgsql’;
$CONF[‘database_host’] = ‘localhost’;
$CONF[‘database_user’] = ‘postfix’;
$CONF[‘database_password’] = ‘***********’;
$CONF[‘database_name’] = ‘postfix’;

Postfixadminの動作確認http://サーバーIP/postfixadmin/login.php
初回ログオン時は、管理者ユーザーを作成する必要がある
作成後、下図のようなログオン画面が表示される
ログオン後、使用するドメイン、メールアカウントを作成する

FW設定(iptables)/etc/sysconfig/iptables
ICMP到達を許可(ping応答)
TCP port
53(DNS)
20-21(FTP)
22(SSH)
80(Web)
110(POP3)
25,587(SMTP)
UDP port 53(DNS)
それ以外は拒否

iptables(FW構成の確認)# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
RH-Firewall-1-INPUT all — anywhere anywhere

Chain FORWARD (policy ACCEPT)
target prot opt source destination
RH-Firewall-1-INPUT all — anywhere anywhere

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Chain RH-Firewall-1-INPUT (2 references)
target prot opt source destination
ACCEPT all — anywhere anywhere
ACCEPT icmp — anywhere anywhere icmp any
ACCEPT esp — anywhere anywhere
ACCEPT ah — anywhere anywhere
ACCEPT udp — anywhere 224.0.0.251 udp dpt:mdns
ACCEPT udp — anywhere anywhere udp dpt:domain
ACCEPT tcp — anywhere anywhere tcp dpt:domain
ACCEPT all — anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp — anywhere anywhere state NEW tcp dpt:ssh
ACCEPT tcp — anywhere anywhere state NEW tcp dpt:http
ACCEPT tcp — anywhere anywhere state NEW tcp dpt:ftp-data
ACCEPT tcp — anywhere anywhere state NEW tcp dpt:ftp
ACCEPT tcp — anywhere anywhere state NEW tcp dpt:smtp
ACCEPT tcp — anywhere anywhere state NEW tcp dpt:pop3
ACCEPT tcp — anywhere anywhere state NEW tcp dpt:submission
REJECT all — anywhere anywhere reject-with icmp-host-prohibited

フィルタリング設定(hosts.allow)設定ファイル /etc/hosts.allow
sshd : .myhost.jp : allow ;myhostからSSH許可

in.proftpd : .myhost.jp : allow ;myhostからのFTP許可

ALL : ALL : deny ;他は全部拒否

と、すごく駆け足で設定したけれど、各サービスの稼働確認と 開始・停止の方法についてメモ。

serviceコマンドによる確認service サービス名 status  ⇒サービスが実行中かどうか確認できる
例:web(Apache2)
(確認)service apache2 status  apache2 (pid 1908) を実行中…
⇒「実行中…」が表示されていれば、正常動作中
もし、挙動がおかしいとき、サービスの再起動をする
(停止)service apache2 stop
(開始)service apache2 start

サービスによっては、restart(stop/startを一括で行う)コマンドもある。

serviceをstartしたのに起動しない場合
エラーメッセージが表示されれば、それをもとに調査する
もしくは、エラーログファイルが作成されていないかどうか。

各serviceの確認と再始動方法(1)WEB/FTP関係
web(Apache2)
(確認)service apache2 status
(再始動)service apache2 graceful

FTP(xinetd)
(確認) service xinetd status
(再始動)service xinetd restart

各serviceの確認と再始動方法(2)メール関連
DB(postgres)
(確認) service postgresql status (再始動)service postgresql stop ; service postgresql start

SMTP(Postfix)
(確認) service postfix status
(再始動)service postfix stop ; service postfix start

POP3(courier-imap)
(確認) service courier-imap status または netstat ?an して110ポートがあるか
(再始動)service courier-imap restart

SMTP認証(SASL Authd)
(確認) service saslauthd status
(再始動)service saslauthd restart

POP認証(pop-before-smtp)
(確認) service pop-before-smtp status
(再始動)service pop-before-smtp restart

各serviceの確認と再始動方法(3)DNS、FW関連
FW(iptables)
(確認)service iptables status
(再始動)service iptables restart
⇒取扱いに注意のこと。フィルタを誤ると、ログイン不可になる恐れがあるため。

フィルタリング(xinetd)
(確認)service xinetd status
(再始動)service xinetd restart
メモ:/etc/hosts.allowに記載するだけで、通常は自動的にルールが適用される

DNS(named)
(確認)service named status
(再始動)service named restart

DNSの挙動確認の方法として、簡易的に下記の方法で自分自身が名前解決できるか確認する。
# nslookup
> server 127.0.0.1
Default server: 127.0.0.1
Address: 127.0.0.1#53
> www.kenti.jp
Server: 127.0.0.1
Address: 127.0.0.1#53
Name: www.kenti.jp
Address: xxx.xxx.xxx.xxx

と、ここまで。
あとはサーバー移行の際、旧サーバーからデータを持ってきたい時などは、SCPで直接サーバー間のコピーをしてしまいます。

SCPを使ったサーバー間でのファイルコピー方法scp ユーザー名@サーバー名:ディレクトリ/コピー元ファイル名 ユーザー名@サーバー名:コピー先ディレクトリ/(ファイル名)
(上記を一行で入力のこと)

例)
scp user@oldserver.kenti.jp:/home/file.tgz user@newserver.kenti.jp:/home/
⇒oldserverのhomeのfile.tgzを  newserverのhomeディレクトリ配下へコピーする。
転送は暗号化通信となるので、FTPよりも安全な転送。SCPのアクセス制限はhosts.allowのsshdに準じていたはず。

こんな感じで、サーバーの移行と構築をだいたい済ませてしまいます。
あ~。いつもWindowsばっかり触っているので、久しぶりにLinuxをやったら、なんだかとてもすがすがしくなりました。

やっぱりこういうコマンド入力で設定してくのは、目に見えるからいいですよね。
今度またkvmで遊ぼう。