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行でipv6とipv4のデフォルトのアクセス制限として拒否設定。
その後、必要なアクセスのみを許可していってる。
上記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
色々可能性はありますが、自分の場合はipv6でlocalhostに対して通信しようとしており、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サーバーを1つ指定しており基本的にアクセスされるサーバー。
冗長化の為、クライアント側でセカンダリサーバーもDNSにしていれば、このサーバーがアクセスできなかった場合セカンダリサーバーにアクセスが行く。
DNSマスターサーバー
名前解決の情報を管理しているサーバー。
その為、コンテンツサーバーのみがマスターになり得る。
対応する名前解決の情報をスレーブに自動転送する。
マスター側が最初にアクセスされるサーバーとは限らない。
DNSスレーブサーバー
名前解決の情報をマスターから受け取って管理する。
マスターと同じ情報を管理する。
コンテンツサーバーのみがスレーブになり得る。
DNSサーバー構築時の注意点
CentOS6でLANネットワークで使用する内向けのDNSサーバーを構築する
LANネットワーク内で使用する内向けDNSサーバーを構築する。
やりたい事
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から取得する。
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で対応するゾーンファイルを指定します。
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は脆弱性が発表されてるので要対策!
やりたいこと
先日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
#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
ルーター側のiptablesでDNSのポート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につながっていない
サーバー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