クローズドなテスト環境を作成する際のメモ

そろそろ仕事も落ち着いてきたので、夕飯以外の記事でも。(^_^;

お客様の移行データを使用したテストを行う場合はクローズドなテスト環境を用意する必要があります。基本はHubに必要なマシンを繋げてテストをすればOKなんですが、

  • サーバも納品物でお客様の環境に合わせたネットワーク設定を行っておく必要がある
  • ミドルウェアがホスト名(ドメイン名)の変更を認めていない
  • SMTPサーバが必要
  • SMTPサーバはサブネットの外
  • サーバの内部向けのアドレスと外向けのアドレスが違う
  • サーバには内部向けのアドレス設定のみ行う

という感じの条件がイロイロあった場合のごまかし方です。

まず考えられる構成は以下のような感じ。

Hub ┬ 1 テスト対象のサーバ
    ├ 2 いろいろ兼用のlinuxサーバ
    …
    └ 3 テスト用クライアント

1, 3はまさにテスト対象なので置いておいて、2のlinuxサーバについてです。
ここで2のサーバには以下の機能を持ってもらいます。

デフォルトゲートウェイ
とりあえずこのサブネットのデフォルトゲートウェイとなってもらいます
SMTPサーバ
SMTPサーバの役割も担ってもらいます。上記のように違うサブネットにあるサーバとして振舞ってもらいます。
ルーティング
外向けのアドレスへのリクエストを内向けのアドレスに変換します。

ということで上記機能を実現するための設定についてです。
ちなみにここであげた設定方法はCentOS4.X(ちょっと古いです)で試したものです。

複数IPアドレスの割当

テスト用に急遽用意したマシンに複数のNICがついてることなど、ほとんどないので一枚のNICに複数のIPアドレスを割り当てます。
(そもそも最近はNetwork Interface Cardでなく、大概はオンボードですね。)
既存のIPアドレスが設定されているのは大体

/etc/sysconfig/network-scripts/ifcg-eth0

だと思います。これをコピーして、

/etc/sysconfig/network-scripts/ifcg-eth0:1

とかを作ります。上記ファイルの

DEVICE=eth0

行を

DEVICE=eth0:0

に変更し、他の部分(ネットワーク関連の部分)は新たに割り当てたい情報に変更します。
変更後は

/etc/rc.d/init.d/network restart

を実行し、ネットワークを再起動します。ifconfigコマンドを使用して追加したインタフェースが見えていれば作業は完了です。

SMTPサーバの設定

MTAとしてpostfixを使用し、他ドメイン宛のメールをローカル配送として受けるようにします。
CentOSでのMTAの変更は/usr/sbin/system-switch-mail またはと /usr/sbin/system-switch-mail-nox を使用すると簡単に行えます。
切り替え後は/etc/postfix/main.cfの以下の行を適当に編集すると、適当なドメイン(自分が受け取りたいドメイン)宛のメールを当該サーバで受け取れるようになります。

myhost = ホスト名.ドメイン名
mydomain = 自分が設定したいドメイン
inet_interface = all
mydestination = $myhostname, localhost.$mydomain, localhost, 以下このサーバで受け取りたいドメインをカンマ区切りで列挙します
mynetworks_style = class
alias_maps =hash:/etc/aliases
alias_database =hash:/etc/aliases
home_mailbox = Maildir/

また、上記の設定を行った場合 /etc/aliases で

メールの宛先のユーザ名:	実際のUnixユーザ名

を設定し、 newaliases を実行すると適当なユーザ名でメールの受信も出来るようになります。
受信したメールは /etc/dovecot.conf 修正して、/etc/rc.d/init.d/dovecot restart すれば、imap なり pop3 なりでメールクライアントから読めるようになりますので、環境に合わせて適宜修正します。

ルーティング設定

この場合は「サーバの内部向けのアドレスと外向けのアドレスが違う」「サーバには内部向けのアドレス設定のみ行う」場合に限定した設定です。
ちゃんとした設定は
Iptablesチュートリアル 日本語訳辺りを参考にしてください。ちなみに私はiptablesのManpage見てもさっぱり理解できませんでした。(^_^;
iptablesの設定スクリプトは以下のような感じにしました。

#!/bin/bash

# ipforwarding の設定を許可します
echo 1 > /proc/sys/net/ipv4/ip_forwarding

# テーブルをクリアします。念のためnatテーブルも指定しておきます。
iptables -F
iptables -F -t nat

# テストする時のためにpingを受け入れる設定にします
# icmp-type 0 は Echo Reply, 8 は Echo Request なのでこの辺りを
# 許可していればOK
iptables -I INPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -I INPUT -p icmp --icmp-type 8 -j ACCEPT

# eth0 が LAN側のインタフェース, eth0:1 が WAN側のインタフェースです。
# LAN->WAN, WAN->LAN の両方向の forwarding を許可します。
# 実際にはこの設定はいらなかったような気がしますが…。
iptables -A FORWARD -i eth0 -o eth0:1 -j ACCEPT
iptables -A FORWARD -i eth0:1 -o eth0 -j ACCEPT

# LANに含まれるIPアドレスを設定します。ネットワークアドレス/サブネットマスク
# 形式で指定します。
LAN_IPS=xxxx.xxxx.xxxx.xxx/255.255.255.XXX
# LAN側のゲートウェイアドレスを指定します。
GW_LAN=xxx.xxx.xxx.xxx
# WAN側のゲートウェイアドレスを指定します。
GW_WAN=xxx.xxx.xxx.xxx
# サーバの内向けのアドレスを設定します。
AP_LAN=xxx.xxx.xxx.xxx
# サーバの外向けのアドレスを設定します。
AP_WAN=xxx.xxx.xxx.xxx

# forwardするプロトコルとしてTCPとICMPを指定します。
# ちゃんとしたい場合はポート指定まで入れた方が良いです。
#FWD_PRTCL="-p tcp --dport 80"
FWD_PRTCL="-p tcp"
FWD_PRTCL_ICMP="-p icmp"

# TCPプロトコルのDNATターゲットの設定。
# DNATはDestination Network Address Translation:宛先ネットワークアドレス変換
# のことです。
# 以下は、LANに含まれるIPアドレスから、WAN側のアドレスでサーバに
# アクセスがあった場合、LAN側のアドレスにパケットを書き換える設定です。
# チェーンはPREROUTING(タイミングはルーティング前)、プロトコルはTCPです。
iptables -t nat -A PREROUTING $FWD_PRTCL -d $AP_WAN -j DNAT --to-destination $AP_LAN $LAN_IPS

# TCPプロトコルのSNATターゲットの設定。
# SNATはSource Network Address Translation:送信元ネットワークアドレス変換
# のことです。
# これはサーバのLAN側のアドレスからアクセス元にパケットを返す際に、WAN側の
# アドレスからパケットが来たように書き換える設定です。
# (WAN側アドレスに対してアクセスしたのに、LAN側アドレスからパケットが
# 返って来た場合、おかしなことになってしまうため)
# チェーンはPOSTROUTING(タイミングはルーティング後)、プロトコルはTCPです。

iptables -t nat -A POSTROUTING $FWD_PRTCL --dst $AP_LAN -j SNAT --to-source $AP_WAN $LAN_IPS

# ICMPプロトコルのDNAT設定です。内容はTCPプロトコルの場合と同じです。
iptables -t nat -A PREROUTING $FWD_PRTCL_ICMP -d $AP_WAN -j DNAT --to-destination $AP_LAN $LAN_IPS

# ICMPプロトコルのSNAT設定です。内容はTCPプロトコルの場合と同じです。
iptables -t nat -A POSTROUTING $FWD_PRTCL_ICMP --dst $AP_LAN -j SNAT --to-source $AP_WAN $LAN_IPS

# WAN_GW => WAN_GW HTTP => LAN_HTTP
# ここはちょっと別の設定方法のメモ。
# Gateway上のHTTPサーバと
# iptables -t nat -A OUTPUT --dst $INET_IP -p tcp --dport 80 -j NAT --to-destination $HTTP_IP

上記スクリプトを実行後、

/etc/rc.d/init.d/iptables save

すれば、再起動後も上記設定が有効になります。

KDEでのCapsLock<->Control, 半角/全角<->Escキーの入れ替え方

毎回忘れるのでついでにメモ。
~/.kde/Autostart/に以下の内容のスクリプトを作成。(実行権限もつけておく)

#!/bin/bash
xmodemap ~/.xmodmaprc

以下の要領で~/.xmodmaprcを作成。

remove Lock = Caps_Lock
remove Control = Control_L
keysym Control_L = Caps_Lock
keysym Caps_Lock = Control_L
add Lock = Caps_Lock
add Control = Control_L
keycode 9 = Zenkaku_Hankaku
keycode 49 = Escape