ボールを蹴りたいシステムエンジニア

ボール蹴りが大好きなシステムエンジニア、ボールを蹴る時間確保の為に時間がある時には勉強する。

NTPサーバーを構築してLAN内サーバーでも日本時刻を同期する

NTPサーバーを構築してLAN内サーバーでも日本時刻を同期する。

NTPサーバーとは時刻を同期する為のもの(説明適当)。
LAN内にNTPサーバーを構築するメリットして

・LAN内の全てのサーバーで時刻を同期できる
 →各サーバーで外部NTPサーバーを参照する事も可能だが多少のズレが発生する可能性あるみたい
・NTPサーバーだけが外部問い合わせをする事で、外部ネットワークへのトラフィックの削減につながる

環境

・サーバーA
ゲストOS(CentOS6)
eth0:192.168.10.30
eth1:10.0.10.30
※eth0がWAN(グローバルネットワーク)に繋がっている

・サーバーB
ゲストOS(CentOS6)
eth0:10.0.10.40
※WANにつながっていない

ntpd 4.2.6

手順

NTPサーバー

現在時刻を確認

[root@lb ~]# date
2017年  1月 28日 土曜日 08:52:00 JST

ハードウェアクロックの時刻を確認

hwclock -r 
2017年01月28日 10時13分09秒  -0.353933 秒

ずれてる・・

ntpインストール

yum -y install ntp


ntp設定ファイル修正

LAN内のNTPサーバーはNICTのNTPサーバーを元にして時刻を同期する。
ntp.nict.jpは独立行政法人情報通信研究機構NICT)が管理している日本標準時に直結したNTPサーバー

vi /etc/ntp.conf  

以下の設定を行います。

#NTPサーバーの時刻と,ローカル・マシンの時刻のずれを記録するファイル
driftfile /var/lib/ntp/drift
#デフォルトのアクセス制御を設定、明示的に許可されていないアクセスを禁止
restrict -6 default ignore
restrict default ignore
restrict 210.173.160.27 mask 255.255.255.255 nomodify notrap noquery
restrict 210.173.160.57 mask 255.255.255.255 nomodify notrap noquery
restrict 210.173.160.87 mask 255.255.255.255 nomodify notrap noquery

最初の2行でipv6ipv4のデフォルトのアクセス制限として拒否設定。
その後、必要なアクセスのみを許可していってる。
上記3つのIPはこちらからアクセスする上位NTPサーバーのIP(後述)。
こちらからのタイムクエリーはしますが、あちらからのntpqやntpdcクエリーはさせないようnomodify以降のオプションを付与。

restrictでは外部からのアクセスと外部へのアクセス両方の設定となるようです。
各オプションは
ignore ... 指定したサーバからのすべてのNTPアクセスを無視
noquery ... 指定したサーバからの時刻問い合わせパケットを無視
nomodify... 指定したサーバからの設定変更要求パケットを無視
notrap ... 指定したサーバに対して状変時にトラップを上げない

# 自分自身のアクセスを許可
restrict 127.0.0.1
# 10.0.10.0/24からのアクセスを許可
restrict 10.0.10.0 mask 255.255.255.0 nomodify notrap

書いての通り、NTPサーバーへのアクセス許可設定です。

# 時刻同期先NTPサーバーを指定
server ntp1.jst.mfeed.ad.jp iburst
server ntp2.jst.mfeed.ad.jp iburst
server ntp3.jst.mfeed.ad.jp iburst

ちなみにデフォルトの下記だと、デフォルトのNTPサーバーを参照するらしい。
これでも動くみたいだけど、変更したほうが良さ気。

server 0.centos.pool.ntp.org
server 1.centos.pool.ntp.org
server 2.centos.pool.ntp.org

server に 127.127.1.0 を指定すると、自分自身のローカルクロック(システム時刻)を使用するみたい。
外部ネットワークに接続できない場合に使用する事あるみたいだけど、今回は上位NTPサーバーを参照するのでこの設定は使用しない。

server 127.127.1.0

上位サーバーを参照しない場合は、以下のようにfedgeをつける?
Stratumは、小さい方が優先度が高くなるとの事。
ちょっとこの辺よくわかってない。。

fudge 127.127.1.0 stratum 10

iptablesにNTPサーバーへのアクセスを許可する
※ntp.confのserverのIP

iptables -A OUTPUT -p udp -d 210.173.160.27 --dport 123 --sport 123 -j ACCEPT
iptables -A OUTPUT -p udp -d 210.173.160.57 --dport 123 --sport 123 -j ACCEPT
iptables -A OUTPUT -p udp -d 210.173.160.87 --dport 123 --sport 123 -j ACCEPT

ntpを起動する前に手動で時刻を合わせてみる。
※ntpdateの後にNTPサーバーのホスト名またはIPを指定する

ntpdate ntp.nict.jp

28 Jan 12:32:56 ntpdate[37946]: step time server 133.243.238.164 offset 122958.759329 sec
ntpdate

以下のようなメッセージが出た場合ntpdが起動中、またはNTPサーバーの指定がない。

27 Jan 00:01:09 ntpdate[38507]: no servers can be used, exiting
27 Jan 00:01:09 ntpdate[38507]: the NTP socket is in use, exiting

自動起動設定

chkconfig ntpd on

確認

[root@lb ~]# chkconfig --list ntpd
ntpd            0:off   1:off   2:on    3:on    4:on    5:on    6:off

ntp起動

service ntpd start


NTPサーバーとの同期確認
※remoteで指定されたホストの左に*が表示されていれば、そのサーバと同期していることを確認できるらしい

[root@lb ~]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+ntp1.jst.mfeed. 133.243.236.17   2 u    -   64    1   44.714   54.252   8.762
*ntp2.jst.mfeed. 133.243.236.17   2 u    1   64    1   46.647   57.935   5.071
 ntp3.jst.mfeed. 133.243.236.17   2 u    -   64    1   44.669   57.794   5.860
※refidの値がずっと「.INIT.」の場合

以下のようにrefidの値が「.INIT.」の場合、「.INIT.」はNTPサーバに到達できないという事。
st(Stratum) 16 は、最下位の階層で、NTPクライアントはこの階層のNTPサーバには同期しない。
ntpdは、上位サーバの時刻の違いが 1000 秒より大きい場合、何か決定的にまずいことが生じたと仮定し同期しない。

[root@lb ~]# ntpq -p

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 ntp-b2.nict.go. .INIT.          16 u    -   64    0    0.000    0.000   0.000
 ntp1.jst.mfeed. .INIT.          16 u    -   64    0    0.000    0.000   0.000
 ntp2.jst.mfeed. .INIT.          16 u    -   64    0    0.000    0.000   0.000
 ntp3.jst.mfeed. .INIT.          16 u    -   64    0    0.000    0.000   0.000

自分はここでかなりハマりました。
結論から言うと、設定してる上位NTPサーバーのIPのアクセスを許可するよう設定しntpdを再起動する事で解決しました。

ntp.confのserverにしているホストのIPを調べ、

server ntp1.jst.mfeed.ad.jp iburst
server ntp2.jst.mfeed.ad.jp iburst
server ntp3.jst.mfeed.ad.jp iburst

restrictに指定

restrict 210.173.160.27 mask 255.255.255.255 nomodify notrap noquery
restrict 210.173.160.57 mask 255.255.255.255 nomodify notrap noquery
restrict 210.173.160.87 mask 255.255.255.255 nomodify notrap noquery
※同期確認時にタイムアウトエラーが出た場合。
$ ntpq -np

::1: timed out, nothing received
***Request timed out

色々可能性はありますが、自分の場合はipv6localhostに対して通信しようとしており、ntp.conf側ではipv6を許可していないのが原因でした。
そもそもipv6は使用しないのでシステム側でipv6の通信をさせないように設定。

sysctl.confを編集し、

vi /etc/sysctl.conf

ipv6の通信をさせないように設定追加

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

反映

sysctl -p

これで解決しました。

iptablesのログでNTPのポート123がDropされていた場合。

下記の例だとntp.confのserverで指定した下記IPの123ポートがDropされてる。
210.173.160.27
210.173.160.57
210.173.160.87
これらは、ntpd.confに設定したNTPサーバーのIP

Jan 28 13:02:49 lb kernel: Dropped by OUTPUT: IN= OUT=eth0 SRC=192.168.10.30 DST=210.173.160.27 LEN=76 TOS=0x00 PREC=0xC0 TTL=64 ID=0 DF PROTO=UDP SPT=123 DPT=123 LEN=56 
Jan 28 13:06:59 lb kernel: Dropped by OUTPUT: IN= OUT=eth0 SRC=192.168.10.30 DST=210.173.160.57 LEN=76 TOS=0x00 PREC=0xC0 TTL=64 ID=0 DF PROTO=UDP SPT=123 DPT=123 LEN=56 
Jan 28 13:07:00 lb kernel: Dropped by OUTPUT: IN= OUT=eth0 SRC=192.168.10.30 DST=210.173.160.87 LEN=76 TOS=0x00 PREC=0xC0 TTL=64 ID=0 DF PROTO=UDP SPT=123 DPT=123 LEN=56

iptablesに下記設定で解決した

iptables -A OUTPUT -p udp -d 210.173.160.27 --dport 123 --sport 123 -j ACCEPT
iptables -A OUTPUT -p udp -d 210.173.160.57 --dport 123 --sport 123 -j ACCEPT
iptables -A OUTPUT -p udp -d 210.173.160.87 --dport 123 --sport 123 -j ACCEPT

同期確認

最後に時刻の同期が取れている事を確認。

[root@lb ~]# date                      
2017年  1月 28日 土曜日 09:58:18 JST

動作確認の為、故意的に時間をずらしてみる。
※ntpサーバーとのズレが大きすぎると同期されない為、2,3分だけずらしてみる。

date -s "2017/01/29 08:57:00"

直後は以下のようだけど

[root@lb ~]# ntpstat
unsynchronised
   polling server every 64 s

同期されると以下のように表示される

ntpstat
synchronised to NTP server (210.173.160.87) at stratum 3
time correct to within 34 ms
polling server every 64 s

20分位すると同期されました。
直ぐに動悸したい場合は、ntpdateコマンドを使用した方が良いでしょう。

[root@lb ~]# date
2017年  1月 29日 日曜日 09:20:13 JST

クライアントサーバー

インストール手順は省略します。


ntp.confを編集

vi /etc/ntp.conf
restrict -6 default ignore
restrict default ignore
restrict 127.0.0.1
restrict 10.0.10.0 mask 255.255.255.0 nomodify notrap

server 10.0.10.30

sysctl.confを編集

vi /etc/sysctl.conf

ipv6の通信をさせないように設定追加

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

反映

sysctl -p

ntp.conf設定

vi /etc/ntp.conf  

同期確認
refidやstが正常に表示されてればOKだはず。

[root@web ~]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 10.0.10.30      210.173.160.87   3 u    2   64    1    0.386  1823354   0.000
※「ntpq -p」実行後タイムアウトし、NTPサーバーのiptablesのログでNTPのポート123がDropされていた場合。
Jan 29 09:25:02 lb kernel: Dropped by INPUT: IN=eth1 OUT= MAC=00:0c:29:73:76:73:00:0c:29:5c:ba:fd:08:00 SRC=10.0.10.40 DST=10.0.10.30 LEN=76 TOS=0x00 PREC=0xC0 TTL=64 ID=0 DF PROTO=UDP SPT=123 DPT=123 LEN=56 

Jan 29 09:28:20 lb kernel: Dropped by OUTPUT: IN= OUT=eth1 SRC=10.0.10.30 DST=10.0.10.40 LEN=76 TOS=0x00 PREC=0xC0 TTL=64 ID=0 DF PROTO=UDP SPT=123 DPT=123 LEN=56 

NTPサーバー側でファイアウォール設定する事で解決した。

iptables -A INPUT -p udp -s 10.0.10.0/24 --dport 123 -j ACCEPT
iptables -A OUTPUT -p udp -d 10.0.10.0/24 --dport 123 --sport 123 -j ACCEPT

クライアント側から「ntpq -p」実行してタイムアウトが発生する場合は、NTPサーバー側のiptables設定やntp.confのrestrict設定あたりも疑った方が良い

DNSサーバーの種類と構成を整理

DNSサーバーの種類と構成を整理。
※間違ってる情報があれば指摘頂けると嬉しいです

種類

※外部=外部の世界中のインターネット
※内部=LAN内ネットワーク

DNSコンテンツサーバー

ドメイン名の名前解決の情報を管理し提供するサーバー。
外部向けと内部向け、どちらもコンテンツサーバーと呼ぶ。

DNS権威サーバー

コンテンツサーバーかつ外部向けのサーバー。
主に外部インターネット全体に提供するDNSサーバー。

コンテンツサーバーと権威サーバーをイコールで考えているサイトが多いけど、色々調べてみると外部(世界中のインターネット)に公開しているDNSサーバーを権威サーバー、内部LANのみで参照されるサーバーはコンテンツサーバーと呼ぶっぽい。
ただ、コンテンツサーバーの中の権威サーバーなので、権威サーバーはコンテンツサーバーと呼ぶのは正しい。

キャッシュDNSサーバー(DNSフルリゾルバ)

名前解決の情報は持っておらず、階層構造をたどり名前解決を提供するサーバー。
主に特定のクライアント(LANネットワーク内)等に提供するDNSサーバー。
外部公開する事は基本的に無いと思う。

冗長化

プライマリ=マスタ、セカンダリ=スレーブ、
と扱われる事が多いが、実際はそうでは無いと思われる。

DNSプライマリサーバー

クライアント側のリゾルバから、最初にアクセスすべきDNSサーバー。
大抵クライアント側ではDNSサーバーを1つ指定しており基本的にアクセスされるサーバー。
冗長化の為、クライアント側でセカンダリサーバーもDNSにしていれば、このサーバーがアクセスできなかった場合セカンダリサーバーにアクセスが行く。

DNSセカンダリサーバー

プライマリが障害がある時に使用されるサーバー。
使用する為にはクライアント側でDNSサーバーとして指定する必要有り。

DNSマスターサーバー

名前解決の情報を管理しているサーバー。
その為、コンテンツサーバーのみがマスターになり得る。
対応する名前解決の情報をスレーブに自動転送する。
マスター側が最初にアクセスされるサーバーとは限らない。

DNSスレーブサーバー

名前解決の情報をマスターから受け取って管理する。
マスターと同じ情報を管理する。
コンテンツサーバーのみがスレーブになり得る。

DNSサーバー構築時の注意点

  • 権威サーバーとキャッシュDNSサーバーの兼用はセキュリティ上のリスクがあるので分離した方が良い。
  • キャッシュサーバーはセキュリティ上、基本的に内向けのみとするべき。
  • サーバーダウン時のリスクに備えて冗長化の為のマスタースレーブ構成をした方が良い。

CentOS6でLANネットワークで使用する内向けのDNSサーバーを構築する

LANネットワーク内で使用する内向けDNSサーバーを構築する。

環境

CentOS6
bind9

DNSサーバーのipアドレス
eth0:192.168.10.30(WAN)
eth0:10.0.10.30(LAN)

やりたい事

LAN内ネットワークで「web01.vmware」を「10.0.10.40」
に名前解決できるようにする。
外部ネットワークには公開しない。

手順

既にbindがインストールされている前提で進めます。

bindインストール手順は下記記事より
toriaezu-engineer.hatenablog.com

正引き(ドメイン名→IPアドレス)のゾーン設定

named.confファイル編集

vi /var/named.conf 

view機能を使用してゾーンの設定をします。
view機能を使用する事でインターネット側からの問い合わせと、LAN内からの問い合わせ、それぞれに名前解決ができます。
WAN側とLAN側とで異なるドメイン名を返すといった事もできる。

今回は内向け(LAN内)のDNSサーバーなので、viewにinternalを指定しています。
外向きDNSサーバーとしても使用する場合はexternalを指定しますが、今回は使用しません。

view "internal" {
        match-clients   { 192.168.10.0/24; 10.0.10.0/24; };
        recursion yes;

        zone "." {
             type hint;
             file "named.ca";
        };

        zone "web01.vmware"{
             type master;
             file "web01.vmware.zone";
        };
  #include "/etc/named.rfc1912.zones";
  #include "/etc/named.root.key";
};

match-clientsには当該view機能を使用許可するクライアントを指定、ここではLANネットワークのIPを指定。
recursionは再帰的な問い合わせという機能となるが、外部向けDNSの場合はDOS攻撃対策の為にも使用しないよう「no」に設定する。
今回はキャッシュDNSサーバーとして使用するのでyes。

今回設定するドメインに合わせて、「web01.vmware」というゾーンを作成します。
fileで作成するゾーンファイルを指定。

デフォルトで定義されている下記ですが

  include "/etc/named.rfc1912.zones";
  include "/etc/named.root.key";

named.rfc1912.zones
はローカルホストなどの定義されてるファイル。
デフォルトでは/etc直下にあります。
コメントアウトしてもよさそうですが、使用する場合はこのファイルでインクルードしてるファイル
named.localhost
named.loopback
等は、下記にあったのでコピーします。
※バージョンによりパスは異なります

/usr/share/doc/bind-9.8.2/sample/var/named/named.localhost
/usr/share/doc/bind-9.8.2/sample/var/named/named.empty
/usr/share/doc/bind-9.8.2/sample/var/named/named.loopback

※named.conでは相対パスを指定した場合、/var/named/から参照されます。

コピー

[root@lb ~]# cp -p /usr/share/doc/bind-9.8.2/sample/var/named/named.localhost /var/named/chroot/var/named/
[root@lb ~]# cp -p /usr/share/doc/bind-9.8.2/sample/var/named/named.loopback /var/named/chroot/var/named/
[root@lb ~]# cp -p /usr/share/doc/bind-9.8.2/sample/var/named/named.empty /var/named/chroot/var/named/

ルートゾーンのファイルを作成

dig @a.root-servers.net . ns > /var/named/chroot/var/named/named.ca

このファイルはルートサーバに関する情報、ルートサーバ情報は全世界共通であり、ここではa.root-servers.netから取得する。


正引き(ドメイン名→IPアドレス)ゾーンファイル作成

vi /var/named/chroot/var/named/web01.vmware.zone  
$TTL    86400
@       IN      SOA     web01.vmware. root.web01.vmware.  (
                                2016012701      ; Serial
                                3600            ; Refresh
                                900             ; Retry
                                3600000         ; Expire
                                3600 )          ; Minimum

        IN NS    web01.vmware.
        IN MX 10 mail.web01.vmware.
@       IN A     10.0.10.40
www     IN A     10.0.10.40
ftp     IN A     10.0.10.40
mail    IN A     10.0.10.40

簡単に説明すると、
SOAレコードの、SOAの後には「ドメイン名.」と「このドメインの管理者メールアドレス.」が続く。
Serialの行は識別ID、他のゾーンと被ってはいけない、上記では年月日+01を設定している。
NSレコードの行で、このドメインのネームサーバーを指定。
Aのレコードの行で、ホスト名からIPアドレスへの変換。
上記例だとwww以降の行はサブドメイン的な扱い。

逆引き(IPアドレスドメイン名)のゾーン設定

named.confファイル編集

vi /var/named.conf 

先程設定したviewのinternalに逆引きのゾーンを追加します。

view "internal" {
        match-clients   { 192.168.10.0/24; 10.0.10.0/24; };
        recursion yes;

        zone "." {
             type hint;
             file "named.ca";
        };

        zone "web01.vmware"{
             type master;
             file "web01.vmware.zone";
        };

        zone "10.0.10.in-addr.arpa"{
             type master;
             file "10.0.10.in-addr.zone";
             allow-transfer {
                      none;
             };
        };
  #include "/etc/named.rfc1912.zones";
  #include "/etc/named.root.key";
};

「10.0.10.in-addr.arpa」という逆引きのゾーンを作成していますが、「.in-addr.arpa」の部分は固定みたいです。
「10.0.10.in-addr.zone」とかの名前に設定したら上手く逆引きできませんでした・・
allow-transferではゾーン転送要求を許可するスレーブサーバのIPアドレスを指定しますが、今回はスレーブ構成は作成しませんのでnoneを指定します。
fileで対応するゾーンファイルを指定します。

逆引き(IPアドレスドメイン名)ゾーンファイル作成

vi /var/named/chroot/var/named/10.0.10.in-addr.zone
$TTL    86400
@       IN      SOA     web01.vmware. root.web01.vmware.(
                                      2016012701 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
              IN      NS    web01.vmware.
40            IN      PTR   web01.vmware.

簡単に説明すると、
NSレコードの行で、このドメインのネームサーバーを指定。
PTRレコードで、IPアドレスからホスト名に変更。
サーバーIPアドレス最下位部(上記例だと10.0.10.40となる)とドメイン名を指定

ゾーンファイルの各レコードについては下記参考サイトが分かりやすかった。
BINDの設定 - ゾーンファイルの記述方法

設定ファイルチェックと動作確認

named.conf構文チェック
何も表示されなければOK

[root@lb ~]# named-checkconf /etc/named.conf

ゾーンファイルの確認
ゾーン名ごとに確認
OKが出ればOK

[root@lb ~]# named-checkzone web01.vmware /var/named/chroot/var/named/web01.vmware.zone 
zone web01.vmware/IN: loaded serial 1000058531
OK

bind再起動

/etc/rc.d/init.d/named restart


起動時、以下のようなエラーが出た場合は
localhost.localdomainのゾーンで読み込んでるファイル「named.localhost」が無いですよって意味。

zone localhost.localdomain/IN: loading from master file named.localhost failed: file not found


今回設定したDNSサーバーをネームサーバーに指定

vi /etc/resolv.conf 
nameserver 192.168.10.30
nameserver 192.168.10.1

1行目が、今回構築したDNSサーバー
(eth0が192.168.10.30、eth1が10.0.10.30)
192.168.10.1はデフォルトゲートウェイルーター

注意点として、インターフェイスファイル(ifcfg-eth0)でDNSサーバーを指定している場合はそちらが優先される。
インターフェイスファイルに記述する場合は以下のようになる。

/etc/sysconfig/network-scripts/ifcfg-eth0

DNS1=192.168.10.30
DNS2=192.168.10.1

名前解決できた

[root@lb Desktop]# nslookup web01.vmware
Server:		192.168.10.30
Address:	192.168.10.30#53

Name:	web01.vmware
Address: 10.0.10.40

逆引きもOK

[root@lb ~]# nslookup 10.0.10.40
Server:         192.168.10.30
Address:        192.168.10.30#53

40.10.0.10.in-addr.arpa name = web01.vmware.

CentOS6でDNSサーバーを構築して、LAN内サーバーでも名前解決が出来るようにする

CentOS6でDNSサーバーを構築して、LAN内サーバーでも名前解決が出来るようにする。

環境

サーバーA
ルーターDNSサーバーとする)
ゲストOS(CentOS6)
eth0:192.168.10.30
eth1:10.0.10.30
※eth0がWAN(グローバルネットワーク)に繋がっている

サーバーB
ゲストOS(CentOS6)
eth0:10.0.10.40
※WANにつながっていない

上記環境は下記記事で作成した。
toriaezu-engineer.hatenablog.com


DSNサーバー構築の為、bindを使用する。

※bindは脆弱性が発表されてるので要対策!

やりたいこと

  • 構築したDNSサーバーを参照してサーバーBから外部ドメインの名前解決を行う

先日CentOSルーターを構築してLANネットワーク構築を行ったのですが、LAN内ネットワークサーバーから名前解決が出来なかった事がきっかけでDNSサーバーを構築する事にしました。
ルーター構築後は、LAN内サーバーでのDNSサーバーはルーターを指定し、iptablesの設定でDSNのポート53をIPフォワードとかすれば出来るのかなと思ったら出来ず・・・
調べた所、LANネットワークで参照するDNSサーバーを構築する必要があるっぽい情報が多々ある気がしたのでDSNサーバーを構築する事に。

DNSサーバー構築時にはDSNサーバーの種類を構成を一読↓
toriaezu-engineer.hatenablog.com

手順

ライブラリをインストール。
bindサービスをchroot環境で実行する為にbind-chrootパッケージもインストールする。

yum -y install bind
yum -y install bind-chroot

バージョン9.7からはcaching-nameserverというパッケージも含まれているらしい。

chrootについてちょっと勉強。
DNSサービス(ポート53)は外部ホストに対して解放しなければならない為、クラッカーの攻撃対象になりやすい。
その対策として、BINDサービスをchroot環境で実行する事でchroot環境以外の設定ファイル等を操作されないようにするものみたい。

本来bindサービスの設定ファイルは

/etc/named.conf
/etc/named/

にインストールされるけど、bind-chrootをインストールする事でbindサービスをchroot環境で実行され、設定ファイルがは
/var/named/chroot/
配下にインストールされ、bindサービスは/var/named/chroot/より上の階層のディレクトリファイルは参照できずセキュリティ対策となる。

BINDサービス実行時は自動的にマウントが行われ以下のようになる。

$ df -h

/etc/named             18G  3.0G   14G  18% /var/named/chroot/etc/named
/var/named             18G  3.0G   14G  18% /var/named/chroot/var/named
/etc/named.conf        18G  3.0G   14G  18% /var/named/chroot/etc/named.conf

インストール作業に戻ります。

named設定ファイル追記

vi /etc/sysconfig/named 

最終行に追記。
IPv4のみ有効にするという設定。
IPv6 機能を無効化する事で、AAA レコードを探しに行ったりしてネットワークの遅延が発生する事、名前解決で時間が掛かる事を防ぐ。

OPTIONS="-4"

named.confファイルを編集

vi /etc/named.conf
options {
        # セキュリティ対策の為バージョンを隠す
        version "unknown";

        # 自分自身のIPのみ指定とならないようコメントアウト
        #listen-on port 53 { 127.0.0.1; };
        #listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";

        # 任意からのqueryに対応
        allow-query     { 192.168.10.0/24; 10.0.10.0/24; };
        recursion yes;

        # messages の「named]の項目に「validating」というメッセージが大量に記録される現象の対策の為、
        # DNSSECを無効化すべくnoに設定
        dnssec-enable no;
        dnssec-validation no;

        # automatic empty zone: XXXXXのログ出力を停止
        empty-zones-enable no;

        # IPv6のポートを無効にする
        use-v6-udp-ports { };

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key";

        managed-keys-directory "/var/named/dynamic";

        # 自分自身で名前解決できない場合に転送するDNSサーバー
        forwarders       { 192.168.10.1; 192.168.10.1;};
};

logging {
        # デバッグモードのためのチャンネル
        channel default_debug {
                file "data/named.run";
                # ログレベル
                severity dynamic;
        };
        # categoryで指定したチャンネルのログを出力する
        category default { "default_debug"; };
};

zone "." IN {
        type hint;
        file "named.ca";
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

named.rfc1912.zonesファイル編集

vi /etc/named.rfc1912.zones

IPv6に関する部分をコメントアウト

#zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {#       type master;
#       file "named.loopback";
#       allow-update { none; };
#};

bindでrndcを利用する場合は下記コマンドで共通鍵を作成する。
実行すると、/etc/rndc.keyとして共通鍵が生成される。

$ rndc-confgen -a -r /dev/urandom -t /var/named/chroot

wrote key file "/etc/rndc.key"
wrote key file "/var/named/chroot/etc/rndc.key"

named.conf構文チェック
何も表示されなければOK

[root@lb ~]# named-checkconf /etc/named.conf

bind起動

/etc/rc.d/init.d/named start

ルーター側のiptablesDNSのポート53を開放する
iptables実行、もしくはiptablesスクリプトに記述

iptables -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT

ここまでの設定後、
LANネットワークのサーバーBにて、DNSサーバーにサーバーAのIPを指定。

/etc/sysconfig/network-scripts/ifcfg-eth0

DNS1=10.0.10.30
DNS2=10.0.10.30

resolv.confファイルもnameserverをサーバーAに指定。
/etc/resolv.conf

nameserver 10.0.10.30

ネットワーク再起動

/etc/init.d/network restart

サーバーAでも名前解決できた!

$ ping yahoo.co.jp

PING yahoo.co.jp (183.79.135.206) 56(84) bytes of data.
64 bytes from f1.top.vip.kks.yahoo.co.jp (183.79.135.206): icmp_seq=1 ttl=45 time=45.6 ms


前述のログ設定だと下記にログ出力される。

less /var/named/chroot/var/named/data/named.run

自動起動設定

chkconfig named on
[root@lb ~]# chkconfig --list named                                                                                
named           0:off   1:off   2:on    3:on    4:on    5:on    6:off

ここまでの設定でDNSサーバーとは稼働可能。
他にやる事と言えば、、

・LANネットワーク内のサーバーに好きなドメイン指定してアクセスできる
toriaezu-engineer.hatenablog.com

・ルートゾーンファイルの自動更新
→後日やる

ドメインサービスから取得した独自ドメインのゾーン設定を行い、外部向けDNSサーバー設定する事により、
自身のサーバーが稼動中にも関わらず、ダイナミックDNSサービス側が保守やトラブル等によりサービス停止した事によりドメイン名でサーバーにアクセスできなくなるということがなくなる。
独自ドメイン持ってないから不要、&ドメインサービスのDNSを信じる

・master,slave設定
→後日勉強する

・bindの脆弱性対策
→後日やる

CentOS6でLAN内サーバーからWANにアクセスする(ルータ構築)

CentOS6でLAN内サーバーからWANにアクセスする(ルータ構築)

環境

・サーバーA
ゲストOS(CentOS6)
eth0:192.168.10.30
eth1:10.0.10.30
※eth0がWAN(グローバルネットワーク)に繋がっている

・サーバーB
ゲストOS(CentOS6)
eth0:10.0.10.40
※WANにつながっていない

やりたいこと

  • サーバーAとサーバーB間でping通信
  • サーバーBからWANにping通信

サーバーBでの設定

固定IP設定

vi /etc/sysconfig/network-scripts/ifcfg-eth0

※抜粋

BOOTPROTO="none"
ONBOOT="yes"
IPADDR=10.0.10.40
PREFIX=24
NETMASK=255.255.255.0
DNS1=10.0.10.30
DNS2=10.0.10.30

サーバーBが直接繋がっているネットワークは、サーバーAしか無い為、デフォルトゲートウェイでサーバーAのIPを設定する。

デフォルトゲートウェイ設定

vi /etc/sysconfig/network
NETWORKING=yes
GATEWAY=10.0.10.30

ネットワーク再起動

/etc/init.d/network restart

デフォルトゲートウェイが反映されない場合があるのでOS再起動

reboot

ルーティングテーブル確認

[root@web ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.10.0       0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         10.0.10.30      0.0.0.0         UG    0      0        0 eth0

ここまでの設定でサーバーBの全ての通信は10.0.10.30をゲートウェイとして通信される。

サーバーAの設定

IP設定

WAN側NIC
eth0

vi /etc/sysconfig/network-scripts/ifcfg-eth0

※抜粋

BOOTPROTO="none"
ONBOOT="yes"
IPADDR=192.168.10.30
PREFIX=24
GATEWAY=192.168.10.1
NETMASK=255.255.255.0
DNS1=192.168.10.1
DNS2=192.168.10.1

LAN側NIC
eth1

vi /etc/sysconfig/network-scripts/ifcfg-eth1

※抜粋

BOOTPROTO="none"
ONBOOT="yes"
IPADDR=10.0.10.30
PREFIX=24
NETMASK=255.255.255.0
GATEWAY=10.0.10.40

デフォルトゲートウェイ設定

vi /etc/sysconfig/network
NETWORKING=yes
GATEWAY=192.168.10.1

networkファイルでゲートウェイを設定する場合は/etc/sysconfig/network-scripts/route-eth*の空ファイルが無い事を確認する。
空ファイルがあるとデフォルトゲートウェイが正常に反映されない事があった。

ネットワーク再起動

/etc/init.d/network restart

デフォルトゲートウェイが反映されない場合があるのでOS再起動

reboot

ルーティングテーブル確認

[root@lb Desktop]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
10.0.10.0       0.0.0.0         255.255.255.0   U     0      0        0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 eth1
0.0.0.0         192.168.10.1    0.0.0.0         UG    0      0        0 eth0

サーバーAのデフォルトゲートウェイは192.168.10.1、
10.0.10.のゲートウェイは10.0.10.40。

IPフォワード設定

sysctl設定でIPフォワードの設定

vi /etc/sysctl.conf 

1に設定

net.ipv4.ip_forward = 1

反映

sysctl -p

再起動

reboot

iptables設定

iptablesコマンドを実行して設定。
ただし、これだと再起動時に設定が消えるのでiptablesスクリプトを組んだ方が良いかも。

iptables -A FORWARD -i eth1 -o eth0 -s 10.0.10.0/255.255.255.0 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o $WAN_NIC -s 10.0.10.0/255.255.255.0 -j MASQUERADE

上記3行を簡単に説明すると、
1.
       -i パケットを受信するインターフェイス
       -o パケットを送信するインターフェイス
       -s パケットの送信元
2.ステートフル性を確認し、「--state ESTABLISHED,RELATED」となっているものに通過許可
3.
-t nat natテーブルを使用
-A POSTROUTING POSTROUTINGチェインを使用し、内部ネットから外部ネットへ出ていくパケットのソースIPを書き換える
-o eth0 パケットが出ていくインターフェイス(eth0)を指定
-s $internal_net ソース側ネットワークアドレス(192.168.0.0/24)
-j MASQUERADE IPマスカレードを行う

IPマスカレードの設定を確認

[root@lb ~]# iptables -t nat -nL -v                                                                                   
Chain PREROUTING (policy ACCEPT 1186 packets, 81027 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 6 packets, 460 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    2   168 MASQUERADE  all  --  *      eth0    10.0.10.0/24         0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 30 packets, 1900 bytes)
 pkts bytes target     prot opt in     out     source               destination 

10.0.10.0/24をeth0にマスカレードしている。

疎通確認

サーバーAからサーバーB

[root@lb Desktop]# ping 10.0.10.40
PING 10.0.10.40 (10.0.10.40) 56(84) bytes of data.
64 bytes from 10.0.10.40: icmp_seq=1 ttl=64 time=0.231 ms
64 bytes from 10.0.10.40: icmp_seq=2 ttl=64 time=0.158 ms
64 bytes from 10.0.10.40: icmp_seq=3 ttl=64 time=0.501 ms

サーバーAからWANネットワーク
※ここではyahoo宛て

[root@lb Desktop]# ping 183.79.198.79
PING 183.79.198.79 (183.79.198.79) 56(84) bytes of data.
64 bytes from 183.79.198.79: icmp_seq=1 ttl=46 time=44.7 ms
64 bytes from 183.79.198.79: icmp_seq=2 ttl=46 time=42.9 ms

サーバーBからWAN
つながらない・・

[root@web ~]# ping 183.79.198.79
PING 183.79.198.79 (183.79.198.79) 56(84) bytes of data.
64 bytes from 183.79.198.79: icmp_seq=1 ttl=45 time=43.4 ms
64 bytes from 183.79.198.79: icmp_seq=2 ttl=45 time=43.2 ms

出来た!

注意ポイント

ちなみに、この設定かなりはまりました。
正直あきらめそうになった。。
ハマったポイントとして以下を注意。

デフォルトゲートウェイの設定
LANネットワークサーバーのデフォルトゲートウェイはルータのIPとなっている事。
デフォルトゲートウェイの設定出来てると思いきや、ちゃんと反映されてなかったりしてハマった。
設定後は「route -n」コマンドでデフォルトゲートウェイ反映が正常な事を確認する事。

iptablesでのIPマスカレード(IPフォワード)設定
ルータの為にはiptablesの設定が必要と知らずにまずハマる。
iptablesの設定が必要とわかった後も正しい設定にハマる。。

以下のようにpingでLANネットワークサーバーからWAN側に出れない時はIPフォワード周り(iptablesの設定とか)の可能性が高いです。
pingで固まる時も。

[root@web ~]# ping 183.79.198.79
PING 183.79.198.79 (183.79.198.79) 56(84) bytes of data.
From 10.0.10.30 icmp_seq=1 Destination Host Prohibited
From 10.0.10.30 icmp_seq=2 Destination Host Prohibited


以上で、基本的なルータ作成は完了。
後は必要に応じてiptablesで許可、拒否設定等行う。

後、LANネットワークのサーバーではDNSによる名前解決が出来ないみたいなので、別途DNSサーバーを構築する必要があり。
↓下記記事で構築しました。
toriaezu-engineer.hatenablog.com