はじめに
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件のコメント