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

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

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


CentOSでiptables用スクリプト作成してログも出力する。

iptables設定用スクリプトを作成し、iptablesのログも出力するようにする。

環境

CentOS6

手順

iptablesスクリプト作成

iptablesスクリプト作成

vi /etc/iptables.sh

スクリプトにはiptablesのコマンドをずらーっと書くだけ。
最初に初期化、最後に保存してiptablesを実行してる。

「-j LOG」の指定でログ出力をしています。
iptablesのルールは記述順(実行順)に適用されますが、「-j LOG」の行の前にREJECTやDROPされたパケットはログ出力されないようです。

–log-prefix “[iptables firewall]”
でログ出力時の識別子を指定。

–log-level=info
でログ出力のレベルを設定。通常はwarning

下記スクリプト、参考サイトの丸パクリ・・
環境に応じて適宜変更する。
下記だと、warningログだけ出力してる。

#!/bin/sh
#
# パス
PATH=/sbin:/usr/sbin:/bin:/usr/bin

# 内部ネットワークとして許可する範囲
LOCALNET0=192.168.10.0/24
LOCALNET1=10.0.10.0/24


#自サーバーIP
MYIP=10.0.10.30

###########################################################
# ポリシーの初期化
###########################################################
# すべてのルールを削除
iptables -F
iptables -t nat -F
iptables -X

# パケットカウンタをクリア
iptables -Z

# デフォルトのポリシーを設定する
# INPUTはリモートでの設定を考慮する
iptables -P INPUT ACCEPT
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

###########################################################
# ループバックインターフェイスの開放
###########################################################
# ローカルアドレスへの許可
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

iptables -A INPUT -p tcp -s $LOCALNET0 -j ACCEPT
iptables -A INPUT -p tcp -s $LOCALNET1 -j ACCEPT
iptables -A OUTPUT -p tcp -d $LOCALNET0 -j ACCEPT
iptables -A OUTPUT -p tcp -d $LOCALNET1 -j ACCEPT

###########################################################
# 内部から行ったアクセスに対する外部からの返答アクセスを許可
###########################################################
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

###########################################################
# ステルススキャンに対抗
###########################################################
# すべてのTCPセッションがSYNで始まらないものをログに記録し、拒否する
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "Dropped by Stealth Scan: "
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

###########################################################
# Ping of Death対策
###########################################################
# 1秒間に10回を超えるpingはログを記録して破棄
#iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 10 -j LOG --log-prefix "Dropped by Ping of Death: "
#iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 10 -j DROP

###########################################################
# ICMP制御
###########################################################
# ICMPの入力について設定
iptables -A INPUT -p icmp -j ACCEPT

# ICMPの出力について設定
iptables -A OUTPUT -p icmp -j ACCEPT


###########################################################
# 内向きポリシー
###########################################################
# LOCALNETからのTCP22番ポート(SSH)へのアクセスを許可
iptables -A INPUT -p tcp -s $LOCALNET0 --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -s $LOCALNET1 --dport 22 -j ACCEPT

# LOCALNETからのTCP20,21番ポート(FTP)へのアクセスを許可
iptables -A INPUT -p tcp -s $LOCALNET0 -m multiport --dport 20,21 -j ACCEPT
iptables -A INPUT -p tcp -s $LOCALNET1 -m multiport --dport 20,21 -j ACCEPT

# 外部からのTCP80番ポート(HTTP)へのアクセスを許可
iptables -A INPUT -p tcp -d $MYIP --dport 80 -j ACCEPT


###########################################################
# 外向きポリシー
###########################################################
# 既に認証されたパケットを受理
iptables -I OUTPUT 1 -p tcp -s $MYIP -m state --state ESTABLISHED,RELATED -j ACCEPT

# LOCALNETからのTCP22番ポート(SSH)へのアクセスを許可
iptables -A OUTPUT -p tcp -d $LOCALNET0 --sport 22 -j ACCEPT
iptables -A OUTPUT -p tcp -d $LOCALNET1 --sport 22 -j ACCEPT

# LOCALNETへのTCP20,21番ポート(FTP)へのアクセスを許可
iptables -A OUTPUT -p tcp -d $LOCALNET0 -m multiport --sport 20,21 -j ACCEPT
iptables -A OUTPUT -p tcp -d $LOCALNET1 -m multiport --sport 20,21 -j ACCEPT

# HTTPセッションを開始するパケットを受理
iptables -A OUTPUT -p tcp -s $MYIP --dport 80 -j ACCEPT

# SSLセッションを開始するパケットを受理
iptables -A OUTPUT -p tcp -s $MYIP --dport 443 -j ACCEPT

# DNSセッションを開始するパケットを受理
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

# SMTPセッションを開始するパケットを受理
iptables -A OUTPUT -p tcp -s $MYIP --dport 25 -j ACCEPT
iptables -A OUTPUT -p tcp -s $MYIP --dport 465 -j ACCEPT
iptables -A OUTPUT -p tcp -s $MYIP --dport 587 -j ACCEPT

# NTPを許可
iptables -A OUTPUT -p udp -d 133.243.238.243 --dport 123 --sport 123 -j ACCEPT          # ntp-a2.nict.go.jp
iptables -A OUTPUT -p udp -d 133.243.238.244 --dport 123 --sport 123 -j ACCEPT          # ntp-a3.nict.go.jp
iptables -A OUTPUT -p udp -d 133.243.238.163 --dport 123 --sport 123 -j ACCEPT          # ntp-b2.nict.go.jp
iptables -A OUTPUT -p udp -d 133.243.238.164 --dport 123 --sport 123 -j ACCEPT          # ntp-b3.nict.go.jp
iptables -A OUTPUT -p udp -d 210.171.226.40 --dport 123 --sport 123 -j ACCEPT


###########################################################
# INPUTロギング
###########################################################
iptables -N IN_LOGGING
iptables -A IN_LOGGING -j LOG --log-level warning --log-prefix "Dropped by INPUT: "
iptables -A IN_LOGGING -j DROP
iptables -A INPUT -j IN_LOGGING

###########################################################
# OUTPUTロギング
###########################################################
iptables -N OUT_LOGGING
iptables -A OUT_LOGGING -j LOG --log-level warning --log-prefix "Dropped by OUTPUT: "
iptables -A OUT_LOGGING -j DROP
iptables -A OUTPUT -j OUT_LOGGING

###########################################################
# ポリシーの初期化
###########################################################
# デフォルトのポリシーを設定する
# INPUTのみリモートでの設定を考慮する
iptables -P INPUT DROP

###########################################################
# 設定の保存と反映
###########################################################
/etc/init.d/iptables save
/etc/init.d/iptables restart

実行権限付与

chmod +x /etc/iptables.sh

スクリプト実行

sh /etc/iptables.sh

この時点ではまだログは出力されない

ロガー設定

ログ出力先ディレクトリ作成

mkdir /var/log/iptables/

rsyslogの設定
rsyslogがlinux標準のロギングシステムらしい。

vi /etc/rsyslog.conf

追記

kern.info                                               /var/log/iptables/iptables.log

messageログへの出力しないよう設定

.info;mail.none;news.none;authpriv.none;cron.none /var/log/messages

↓変更↓

.info;mail.none;news.none;authpriv.none;cron.none;kern.none /var/log/messages

rsyslogを再起動

service rsyslog restart

ログローテート

上記のままだと1ファイルにログが溜まってしまうのでデイリーでローテートを行う。

linux標準のlogrotateを使用する。
logrotate.d配下に設定ファイルを作成すると自動的に実行される。

vi /etc/logrotate.d/iptables

設定

/var/log/iptables/iptables.log {
  rotate 10
  daily
  compress
  missingok
  notifempty
  create 0644 root root
}

rotete ... n回分ローテート保持
daily ... 毎日ローテート
compress ... 圧縮する
missingok ... ログファイルが見つからなかった場合、エラーメッセージを出力せずに次のログファイルの処理に移行する。
notifempty ... ログファイルが空ならローテートしない
create {パーミッション} {ユーザー名} {グループ名} ...
新規ログファイルをローテーションした直後に作成する。


翌日、ログローテートを確認する。

CetnOSサーバー初期環境構築と設定まとめ。

CentOSサーバー構築時の設定項目まとめ。
都度アップデートします。