はじめに

iptables には rawテーブルなるものが存在し、ここに書かれたルールは、他のどのテーブルよりも先に実行される。
また、rawテーブルは、主に NOTRACK ターゲットと共に使用され、ステートフルインスペクションなどの接続追跡から除外するために使用される。

本稿では、実際に NOTRACK ターゲットを使用して、特定のパケットを接続追跡から除外してみる。

実験

まず、ファイアウォールを以下のように設定し、icmp の状態 (state) が ESTABLISHED の場合だけ ACCEPT する。

# iptables -A INPUT -p icmp -j DROP
# iptables -I INPUT -p icmp -m state --state ESTABLISHED -j ACCEPT
# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
DROP       icmp --  0.0.0.0/0            0.0.0.0/0           

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

この状態で、グーグルに icmp を送信した場合は以下のようにパケットが返ってくることがわかる。

$ ping google.com -c 3
PING google.com (216.58.197.142) 56(84) bytes of data.
64 bytes from nrt12s01-in-f14.1e100.net (216.58.197.142): icmp_seq=1 ttl=48 time=3.02 ms
64 bytes from nrt12s01-in-f14.1e100.net (216.58.197.142): icmp_seq=2 ttl=48 time=3.17 ms
64 bytes from nrt12s01-in-f14.1e100.net (216.58.197.142): icmp_seq=3 ttl=48 time=3.61 ms

--- google.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 3.026/3.270/3.610/0.252 ms

続いて、rawテーブルに NOTRACK を設定し、icmpへの接続追跡を無効にする。
このようにすることで、上記で設定した state情報のルールから除外することができる。

# iptables -t raw -A PREROUTING -p icmp -j NOTRACK
# iptables -t raw -nL
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
CT         icmp --  0.0.0.0/0            0.0.0.0/0            NOTRACK

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination   

この状態で、icmpを送信するとパケットが返ってこないことがわかる。

# ping google.com -c 3
PING google.com (216.58.197.142) 56(84) bytes of data.

--- google.com ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2049ms

0件のコメント

コメントを残す

アバタープレースホルダー

メールアドレスが公開されることはありません。 が付いている欄は必須項目です