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
CentOSでiptables用スクリプト作成してログも出力する。
iptables設定用スクリプトを作成し、iptablesのログも出力するようにする。
環境
CentOS6
手順
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 {パーミッション} {ユーザー名} {グループ名} ...
新規ログファイルをローテーションした直後に作成する。
翌日、ログローテートを確認する。