[LAST UPDATE : 2016/05/30 ]
前提知識
– – –
パケットフィルタリングとは
カーネルが処理するパケットを検査し、不要なパケットは遮断するなどのルールに基づき処理を行う。
iptablesとは
パケットフィルタリングやNAT(ネットワークアドレス変換)の設定を行う機能およびコマンド。
Linuxカーネルにはnetfilterというのパケット処理機能が組み込まれていて、iptablesはこれを利用する。
iptablesの理解には「テーブル」「チェイン」の概念理解は必要です。
テーブルとは
iptablesで作成するルール群(後述のチェイン)の使用目的を決定するもの。
ルールを作成する際に指定したテーブルによって、デフォルトで使用できるチェインやアクション(後述のターゲット)に制限がかかる等、ルールの使用目的(フィルタリング or NATなど)を明確化する為に用意されている。
主なテーブル
filter パケットフィルタリング用
nat NAT用
チェインとは・・・ルールです。
パケットの処理方法を定義したルール群。
チェインにルールを追加していきます。
また同時に、チェインはどのタイミングでルールを適用するかを表します。
INPUT
ローカルホスト(ローカルプロセス)宛のパケットに対してルールを適用
OUTPUT
ローカルホストで生成されたパケットに対してルールを適用
FORWARD
ローカルホストを経由するパケットに対してルールを適用
PREROUTING
入ってきたパケットの内容を書き換えるためにルールを適用
POSTROUTING
出て行くパケットの内容を書き換えるためにルールを適用
# テーブル「filter」を指定した場合はデフォルトで「INPUT」「OUTPUT」「FORWARD」が使用できる。
# テーブル「nat」を指定した場合は「OUTPUT」「PREROUTING」「POSTROUTING」が使用できる。
ターゲットとは・・・アクションです。
ACCEPT 通過を許可
DROP 破棄
REJECT 拒否(通信元に通知)
MASQUERADE 送信元IPアドレスと送信元ポート番号を変更
SNAT 送信元IPアドレスを指定したIPアドレスに変更
LOG ログに記録
ルールで使用する主なオプション
-s IPアドレス 送信元のIPアドレスを指定
-d ipアドレス 送信先のIPアドレスを指定
–sport ポート番号 送信元のポート番号を指定
–dport ポート番号 送信先のポート番号を指定
-p プロトコル プロトコルの指定(tcp,udp,icmp,all)
-i インターフェース名 受信するインターフェースの指定
-o インターフェース名 送信するインターフェースの指定
-j ターゲット 適用するターゲット(アクション)の指定
– – –
■ iptablesの機能を有効化する
# service iptables restart
■ iptablesの機能を自動的に起動する
# chkconfig iptables on
■ 基本パケットの種類
INPUT(入力)
OUTPUT(出力)
FORWARD(転送)
■ パケットフィルタリング条件の表示
# cat /etc/sysconfig/iptables
・
・
COMMIT
*filter
:INPUT DROP [0:0]
・
・
#COMMIT
INPUT(入力) OUTPUT(出力) FORWARD(転送)
■ パケットフィルタリング条件の表示
# cat /etc/sysconfig/iptables
・
・
COMMIT
*filter
:INPUT DROP [0:0]
・
・
#COMMIT
で、iptablesの内容を記述しているファイルを直接見れる。
パケットフィルタリングの条件は*filter から #COMMIT の間に記述されている。
ただ、ファイルを直接見るよりも以下のコマンドで見た方が整形され分かりやすい。
■ [書式]パケットフィルタリングのルール一覧表示
iptables [-t テーブル名] ーL[チェイン] *テーブルを指定しない場合は、パケットフィルタリング用のfilterテーブル、 それに属するチェイン、ルールの一覧表示 *チェインを指定しない場合は、全てのチェインのルールが表示される。
# iptables -v -L Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 11835 17M ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED 3 144 ACCEPT icmp -- any any anywhere anywhere 2 120 ACCEPT all -- lo any anywhere anywhere 0 0 ACCEPT tcp -- any any anywhere anywhere state NEW tcp dpt:ss 202 13759 REJECT all -- any any anywhere anywhere reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination ・ ・
Chain毎に空行区切りで表示される。
出力結果の一行目
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
は INPUT チェーンのデフォルトポリシーが ACCEPT で デフォルトポリシーが適用されたパケットの数とバイト数を表す。
ちなみに、INPUTチェーンの最後に全条件にマッチするREJECTがあるので、デフォルトポリシーが適用されるパケットは 0 packets, 0 bytes となっている。
その次の行以降にあるカラムはそれぞれ
target:適用されるアクション(ACCEPT, DROP, REJECT, LOG, …)
prot:プロトコル
opt:オプション
in:受信するNIC(lo, eth0, …)
out:送信するNIC(lo, eth0, …)
source:送信元IP
destination:送信先IP
■ 特定のチェインのパケットフィルタリング条件の表示
-L オプションの後に 引数でチェイン名を付けると、
特定のチェインのパケットフィルタリング条件だけを表示できる。
# iptable -v -L INPUT Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 11837 17M ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED 3 144 ACCEPT icmp -- any any anywhere anywhere 2 120 ACCEPT all -- lo any anywhere anywhere 0 0 ACCEPT tcp -- any any anywhere anywhere state NEW tcp dpt:ssh 202 13759 REJECT all -- any any anywhere anywhere reject-with icmp-host-prohibited
■ IPマスカレードルールを追加する場合
*IPマスカレード:複数のプライベートアドレスをひとつのグローバルアドレスとポート番号に割り当てます。
チェイン(ルール):出て行くパケットに対するルール→ POSTROUTING オプション A でルール追加(ADD)
ターゲット(アクション):MASQUERADE オプション j で指定
インターネット側インターフェース:eth0 #送信するインターフェース オプション o で指定
LAN内のアドレス:172.16.0.0/24 #送信元NWアドレス オプション s で指定
IPマスカレードルールはテーブル、チェインは下記の通り。
テーブル:NAT
チェイン:出て行くパケットの内容を書き換える→ POSTROUTEING
上記をふまえると、下記の通りとなります。
iptables -t nat -A POSTROUTING -s 172.16.0.0/24 -o eth0 -j MASQUERADE
■考えてみよう
FW:10.0.0.10
ローカルNW192.168.0.0/24 から インターネットへのアクセスに対して、FWでNATによるアドレス変換を実施する。
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 0/0 -j SNAT – -to -source 10.0.0.10
TCPの特定パケット(SYN,ACK、。。)の情報をログに書き込む
s
iptables -I INPUT -s 0.0.0.0 -d 192.168.0.44/32 \
–p tcp \
–tcp-flags ALL SYN,ACK,PSH,URG,RST,FIN \
-j LOG
以上です。