裏セグメントのホスト(たとえばVPCのEIPついてないのとかDBやNASなど裏においときたいやつ) から名前解決とかメールとかyumとかwgetとか時刻同期とかメールしたい! という場合の設定についてざっくりまとめさせていただきます。
とりあえず2パターンあります。 NATする(AWSの場合NATインスタンスを使う)パターンと、 グローバル通信できる管理サーバにソフトウェアを入れて解決するパターン。
★NATする(AWSの場合NATインスタンスを使う)パターン
db側はInternetGatewayつけてなくてパブリックでなくローカルなルーティングな場合、 名前解決をはじめ外に出られないです。(※) NATインスタンスを作るのも勿体ないと、複数NICがついたwebをnat化しようとしたところ、 マルチインタフェースなインスタンスはNATの出口に出来ない模様でした。 (※)最近新しくとったアカウントはVPCオンリーになっていてそちらだとグローバルIPがどんどん勝手に振られるようです。。(EIPつけざるをえない仕様)
NATインスタンス作成方法は以下URLから Amazon VPCトレーニング-NATインスタンスの作成方法 VPC詳細 -ほぼ週刊AWSマイスターシリーズ第7回- Amazon VPCでNATを使ってPublic SubnetとPrivate Subnetを分ける
一番上のスライドのとおりでnatインスタンスを作成可能。 ざっくりいうと、 VPCサブネットをつくり、 “ami-vpc-nat"AMIでNATインスタンスを作成し、 NATインスタンスの"Change Source/DestCheck"をDisableにし、 NATインスタンスにEIPをアソシエートし、 PublicSubnetのRouterTableにNATインスタンスのIDを追加し、 必要に応じてNATインスタンスのSecurityGroupを設定する
そのほか、一般的なルータ化設定方法と同様に、 インスタンス作成後にiptablesでnatのルール設定が必要になる模様。
/sbin/iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.0/16 -j MASQUERADE
service iptables save
iptables --list -t nat
上記スライドのとおりNATインスタンスをデフォルトゲートウェイにするルーティング設定も必要 forwardingの設定も必要
# vi /etc/sysctl.conf
----------------------------------------------------
net.ipv4.ip_forward = 0
↓
net.ipv4.ip_forward = 1
----------------------------------------------------
# sysctl -p
ルータ化設定方法(NAT) natテーブルを利用したLinuxルータの作成
NAT化したらクライアント側のデフォルトゲートウェイをNATサーバに指定します
新しいデフォルトゲートウェイ追加
# /sbin/route add default gw 10.0.0.251 dev eth0
# netstat -rn
古いデフォルトゲートウェイ削除
# /sbin/route del default gw 10.0.0.2 dev eth0
# netstat -rn
確認
# ping yahoo.co.jp
★グローバル通信できる管理サーバにソフトウェアを入れて解決するパターン
とりあえず名前解決から。bindを使う場合です。
・内部DNSを構築 参考: 内部向け DNS サーバの構築
@DNSサーバ側
# rpm -qa|grep bind
bind-utils-9.3.6-20.P1.el5_8.5
ypbind-1.19-12.el5_6.1
bind-libs-9.3.6-20.P1.el5_8.5
yum install bind.x86_64 bind-devel.x86_64
Installed:
bind.x86_64 30:9.3.6-20.P1.el5_8.6
bind-devel.x86_64 30:9.3.6-20.P1.el5_8.6
Dependency Installed:
bind-libs.i386 30:9.3.6-20.P1.el5_8.6
Dependency Updated:
bind-libs.x86_64 30:9.3.6-20.P1.el5_8.6
bind-utils.x86_64 30:9.3.6-20.P1.el5_8.6
vi /etc/named.conf
---------------
options {
// zone ファイルの格納場所
directory "/var/named";
// BIND の利用を許す範囲を指定
allow-query {
// 自分自身( localhost )
127.0.0.1;
// 10.0.0.* ( Subnet 255.255.255.0 )
10.0.0.0/24;
};
// スレーブ DNS のアドレスを記述。内向き DNS の場合は必要ないが一応記載 。
allow-transfer {
// 自分自身( localhost )
127.0.0.1;
// 10.0.0.* ( Subnet 255.255.255.0 )
10.0.0.0/24;
};
// 自前で名前解決できないとき、まずはプロバイダの DNS へ聞きに行く様にする。
// LAN 内名前解決のパフォーマンス向上にもつながるらしい。 2003/07/29 追記
forwarders {
211.132.xxx.xxx; // ISAOのプライマリ DNS の IP アドレス
211.132.xxx.xxx; // ISAOのセカンダリ DNS の IP アドレス
};
};
// ルート DNS の情報
zone "." {
// ルート DNS の情報である事を明示
type hint;
// ファイル名
file "named.ca";
};
// localhost の正引きの設定
zone "localhost" {
// Master DNS Serverであることを示す
type master;
// ファイル名
file "localhost.zone";
};
// localhost の逆引きの設定
zone "0.0.127.in-addr.arpa" {
// Master DNS Serverであることを明示
type master;
// ファイル名
file "0.0.127.in-addr.arpa";
};
// 10.0.0.* の逆引きの設定
zone "0.0.10.in-addr.arpa" {
// Master DNS Serverであることを明示
type master;
// ファイル名
file "empty";
};
---------------
wget ftp://ftp.nic.ad.jp/internet/rs.internic.net/domain/named.root
cp named.root /var/named/named.ca
vi /var/named/empty
-----------------------------------------------------------
; BIND reverse data file for empty rfc1918 zone
;
; DO NOT EDIT THIS FILE - it is used for multiple zones.
; Instead, copy it, edit named.conf, and use that copy.
;
$TTL 86400
@ IN SOA localhost root.localhost. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
86400 ) ; Negative Cache TTL
;
@ IN NS localhost.
-----------------------------------------------------------
vi /var/named/localhost.zone
----
$TTL 86400
@ IN SOA @ root (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
86400 ) ; Negative Cache TTL
IN NS @
IN A 127.0.0.1
----
vi /var/named/0.0.127.in-addr.arpa
----
$TTL 86400
@ IN SOA localhost. root.localhost. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
86400 ) ; Negative Cache TTL
IN NS localhost.
1 IN PTR localhost.
----
vi /etc/sysconfig/named
OPTIONS="-4"
/etc/init.d/named start
ps -ef|grep named
named 4801 1 0 12:02 ? 00:00:00 /usr/sbin/named -u named -4
chkconfig named on
@DNSクライアント側
vi /etc/resolv.conf
---
nameserver 10.0.0.10
nameserver 10.0.0.2
# dig +noall +answer www.isao.net
www.isao.net. 1800 IN A 218.42.137.171
# dig +noall +answer www.yahoo.co.jp
www.yahoo.co.jp. 372 IN CNAME www.g.yahoo.co.jp.
www.g.yahoo.co.jp. 17 IN A 124.83.203.233
※なぜbindかというと慣れてるからです。 unboundのほうが簡単なようです。以下参考。 Unboundをインストールしてみた
これだけだと名前は解決できるがyumはできないです。 bindだけでは名前しか解決できないので、 squidとntpdをいれてnasからのyumとwgetとntpdateを行えるようにします。
・フォワードプロキシを構築しyumとwgetとcurlをする
※webサーバフロントエンドを高速化するリバースプロキシではありません。 コンテンツをキャッシュして内部からのダウンロードを高速化(または規制)するほうの使い方です。
@プロキシサーバ側
yum install squid.x86_64 --enablerepo=epel
Installed:
squid.x86_64 7:2.6.STABLE21-6.el5
cp -p /etc/squid/squid.conf{,.`date +%Y%m%d`}
vim /etc/squid/squid.conf
diff /etc/squid/squid.conf{,.`date +%Y%m%d`}
590d589
< acl lan src 10.0.0.0/255.255.255.0
638d636
< http_access allow lan
2795,2797d2792
< header_access X-Forwarded-For deny all
< header_access Via deny all
< header_access Cache-Control deny all
3012d3006
< visible_hostname xx-stg.isao.net
4284c4278
< forwarded_for off
---
> # forwarded_for on
service squid start
chkconfig squid on
netstat -lnpt|grep squid
tcp 0 0 0.0.0.0:3128 0.0.0.0:* LISTEN 5010/(squid)
@クライアント側
vi /etc/yum.conf
--
proxy=http://10.0.0.10:3128/
--
yum grouplist
vi ~/.wgetrc
--
http_proxy=10.0.0.10:3128
--
vi ~/.curlrc
--
proxy=http://10.0.0.10:3128
--
※wget等のためのプロキシの指定 そのた、gitやgemやvagrantなんかはこちらに書いてありました。
リポジトリのインストールは以下を参考に RPMforge EPEL ELRepo Remi リポジトリインストール
・時刻同期のためにntpdを立てる @ntpサーバ側
touch /etc/ntp.drift
cp -p /etc/ntp.conf{,.org}
vi /etc/ntp.conf
---
server ntp.nict.jp
server ntp.jst.mfeed.ad.jp
driftfile /etc/ntp.drift
---
service ntpd start
chkconfig ntpd on
ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
ntp.nict.jp 133.243.238.243 2 u 2 64 3 33.951 -102.58 3.204
ntp2.jst.mfeed. 210.173.160.86 2 u 2 64 3 2.568 -102.27 2.897
@ntpクライアント側
ntpdate 10.0.0.10
# ntpdate -b 10.0.0.10
24 Jan 14:58:55 ntpdate[6730]: step time server 10.0.0.10 offset 0.070994 sec
# crontab -e
# crontab -l
0 * * * * /usr/sbin/ntpdate -bs 10.0.0.10 > /dev/null 2>&1
クラウドの場合時刻がずれやすいと聞いたことがありますし、時刻がずれるとログの時刻やDBの時刻のカラムがずれたりなどで、 アプリケーションへの影響が深刻になる可能性があるかもしれません。忘れずに設定が必要かと思います。
★LAN内部からMTAサーバに転送してメールしたい場合の設定
・sendmailの場合 @MTAの設定 ローカルからのメール転送を受け付ける設定をする sendmail.cfをコンパイルする為に必要なrpmの導入
# yum install sendmail-cf
設定の修正
# cd /etc/mail
# cp -p sendmail.mc{,.`date +%Y%m%d`}
# vi sendmail.mc
dnl DAEMON_OPTIONS(`Port=smtp,Addr=10.0.0.251, Name=MTA')dnl
LOCAL_DOMAIN(`mydmainname.com')dnl
※全方位から許可してRELAYを制限しています()
# cp -p access{,.`date +%Y%m%d`}
# vi access
Connect:localhost.localdomain RELAY
Connect:localhost RELAY
Connect:127.0.0.1 RELAY
Connect:10.0.0 RELAY
設定の更新
# makemap -v hash /etc/mail/access.db < /etc/mail/access
# m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
sendmail再起動
# /etc/init.d/sendmail restart
@メールクライアントの設定 バックアップ
# cp -p /etc/mail/submit.cf{,.org} ; ls -al /etc/mail/submit.cf*
# cp -p /etc/mail/local-host-names{,.org}; ls -al /etc/mail/local-host-names*
設定変更
# DJ_HOSTNAME=fromのドメインになるクライアントのホスト名を指定
# sed -i 's/^#Dj\$w.Foo.COM$/\0\nDj'${DJ_HOSTNAME}'/' /etc/mail/submit.cf
# echo ${DJ_HOSTNAME} >> /etc/mail/local-host-names
# sed -i "s/D{MTAHost}\[127\.0\.0\.1\]/D{MTAHost}[10.0.0.251]/g" /etc/mail/submit.cf
※MTAHostにメールMTAアドレスを指定 ※Dj設定しない場合は/etc/hostsの127.0.0.1の行の3カラム目にlocalhostの代わりに書いたドメインがfromになります。
比較確認
# diff /etc/mail/submit.cf{,.org}
# diff /etc/mail/local-host-names{,.org}
最後にmailコマンドで送信確認をします
# mail -s title-testmail hoge@gmail.com
DKIMとかSPFレコードとか必要なら別途設定のこと。
・postfixの場合 @メールサーバ側の設定
# vi /etc/postfix/main.cf
---
mynetworks = 54.249.xxx.xxx/32, 10.122.4.56/32, 10.121.18.78/32 54.249.xxx.xxx/32
---
# service postfix reload
※ローカルから許可(上記はVPCでないAWS環境なので/32指定しているがVPCなら/24等でOK) ※ほかの設定は適宜済んでる前提
@メールクライアントの設定
# vi /etc/postfix/main.cf
---
myhostname = [クライアントホストのFQDN]
relayhost = [MTAのFQDN]
---
# service postfix reload
・qmailの場合 tcp.smtpにRELAY許可するように書いてハッシュDB更新します。
# cp -p tcp.smtp{,.`date +%Y%m%d`}
# vi tcp.smtp
10.0.0.:allow,RELAYCLIENT=""
# tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
vpopmailも入ってるなら
# /home/vpopmail/bin/clearopensmtp
DBの中身を確認する
# cdbdump < /home/vpopmail/etc/tcp.smtp.cdb > ./tcp.smtp.`date +%Y%m%d`.txt
※クライアント側はsendmailかpostfixの場合を確認のこと ※PATHは適宜ご確認ください
NATインスタンスないとすこし設定が複雑になりそうですね。シンプルなほうがよければNATがいいと思います。 ただ、管理サーバはあるけどIFが複数だったりNATインスタンス代がもったいない場合にアプリいれれば解決します。