2017年9月2日土曜日

iptables入門

Linuxで長らくパーソナルファイアーウォールとして利用されているiptablesではあるが、設定が面倒ですぐにサービスを止めてしまいがちである。とはいえ、セキュリティ上、無効化するのはよくないので、設定方法を簡単にまとめてみた。

設定概要

ファイアーウォールを設定する場合、基本的には以下の通りに設定する。

 INPUT方向 (外部 → サーバー) : デフォルト拒否。必要なポートのみ許可
 OUTPUT方向 (サーバー → 外部) : デフォルト許可

今回設定する内容を図示したものが以下となる。



設定手順

それではiptablesを設定していく。iptablesでは、一つ一つのルールをコマンドで設定していく。

1. ルールを全部削除する

既存のiptablesの設定が残っていると設定が綺麗にならないので、すべての設定を削除する。ただし、いきなり削除してしまうと、SSHといったリモート接続用の通信もできなくなってしまうので、デフォルトのポリシーをACCEPTに変えてから実施するようにする。

# iptables -P INPUT ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -F

なお、FORWARDは利用しないので、DROPにしておく。

# iptables -P FORWARD DROP

ルールを確認するコマンドは以下の通り。すべてのルールがない状態となっている。

# iptables -L
------------------------------
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy DROP)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
------------------------------

2. 共通のルールを追加する

まずは共通のルールとして2つのルールを設定する。1行目はサーバー側から外部に通信した際の確立した通信を許可するルールで、2行目はループバックアドレスの通信を許可するルールとなる。

# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -i lo -j ACCEPT

「ESTABLISHED」は接続が確立してACKフラグの付いたパケットのことであり、TCPの3-WAYハンドシェイクで通信確立後のすべての通信を許可する。「RELATED」はFTP DATAなどの通信を許可するための設定らしいので、一応許可しておく。

また、pingの応答を許可するために、Echo Reply (Type 0)とEcho Request (Type 8)を許可するルールを追加する。

# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT

3. 個別のルールを追加する

後は要件に応じて必要なポートを開ける。コマンドは以下を定型文として覚えてしまえばよい。-mオプションと-pオプションのプロトコルはそろえること。

 iptables -A INPUT -m state --state NEW -m <tcp/udp> -p <tcp/udp> --dport <port> -j ACCEPT

「NEW」は接続開始要求時のSYNフラグのみが付いたパケットを許可する設定となる。接続確立後は、「ESTABLISHED」の状態(ACKフラグ)が付いたパケットとなるので、先に設定した「確立した通信を許可」のルールにて通信が許可される。

例として、私の環境では以下のように設定した。

# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
# iptables -A INPUT -m state --state NEW -m udp -p udp --dport 161 -j ACCEPT
# iptables -A INPUT -m state --state NEW -m udp -p udp --dport 162 -j ACCEPT
# iptables -A INPUT -m state --state NEW -m udp -p udp --dport 123 -j ACCEPT
# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 10051 -j ACCEPT
# iptables -A INPUT -m state --state NEW -m udp -p udp --dport 514 -j ACCEPT

4. INPUTのデフォルトのポリシーをDROPに変更する

設定が完了したところで、デフォルトのポリシーをDROPに変更する。

# iptables -P INPUT DROP

最終的な設定を確認すると、以下の通りになる。

# iptables -L
------------------------------
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere            icmp echo-reply
ACCEPT     icmp --  anywhere             anywhere            icmp echo-request
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:https
ACCEPT     udp  --  anywhere             anywhere            state NEW udp dpt:snmp
ACCEPT     udp  --  anywhere             anywhere            state NEW udp dpt:snmptrap
ACCEPT     udp  --  anywhere             anywhere            state NEW udp dpt:ntp
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:zabbix-trapper
ACCEPT     udp  --  anywhere             anywhere            state NEW udp dpt:syslog

Chain FORWARD (policy DROP)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
------------------------------

5. 問題なければ設定を保存

通信に問題がなさそうであれば、設定を保存する。

# service iptables save
------------------------------
iptables: ファイアウォールのルールを /etc/sysconfig/iptable[  OK  ]中:
------------------------------

設定が以下のファイルに反映されていることを確認する。

# cat /etc/sysconfig/iptables
------------------------------
# Generated by iptables-save v1.4.7 on Sat Sep  2 09:11:41 2017
*filter
:INPUT DROP [220:23012]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [1692:292692]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 161 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 162 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 123 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 10051 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 514 -j ACCEPT
COMMIT
# Completed on Sat Sep  2 09:11:41 2017
------------------------------

以上で設定は完了となる。

0 件のコメント:

コメントを投稿

人気の投稿