続:NetFilter(iptables)のrawテーブル

テーブルの処理順

とりあえずテーブルの順番はこんな感じ.

パケットの入力 raw(PREROUTING),nat(PREROUTING),filter(INPUT)
パケットの出力 raw(OUTPUT),nat(OUTPUT),filter(OUTPUT)

全体的なダイアグラムは描いたけどこれはまた別の機会に.

検証要約

間違っていたら誰か突っ込んで(笑

手段概要

それぞれの組み込みチェインにログ出力をするルールを追記し,出力されるログ具合で処理順の解を求めます.

ルールの準備
# Generated by iptables-save v1.3.5 on Tue Mar 10 00:39:17 2009
*filter
:INPUT ACCEPT [218648:308005115]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [121850:7374988]
-A INPUT -p tcp -m tcp --dport 10000 -m state --state NEW -j LOG --log-prefix " FILTER_INPUT_LOG:" 
-A OUTPUT -p tcp -m tcp --dport 80 -m state --state NEW -j LOG --log-prefix " FILTER_OUTPUT_LOG:" 
COMMIT
# Completed on Tue Mar 10 00:39:17 2009
# Generated by iptables-save v1.3.5 on Tue Mar 10 00:39:17 2009
*raw
:PREROUTING ACCEPT [218831:308050843]
:OUTPUT ACCEPT [121859:7376184]
-A PREROUTING -p tcp -m tcp --dport 10000 -j LOG --log-prefix " RAW_PREROUTING_LOG:" 
-A OUTPUT -p tcp -m tcp --dport 80 -j LOG --log-prefix " RAW_OUTPUT_LOG:" 
COMMIT
# Completed on Tue Mar 10 00:39:17 2009
# Generated by iptables-save v1.3.5 on Tue Mar 10 00:39:17 2009
*nat
:PREROUTING ACCEPT [775:169070]
:POSTROUTING ACCEPT [357:27024]
:OUTPUT ACCEPT [357:27024]
-A PREROUTING -p tcp -m tcp --dport 10000 -m state --state NEW -j LOG --log-prefix " NAT_PREROUTING_LOG:" 
-A POSTROUTING -p tcp -m tcp --dport 10000 -m state --state NEW -j LOG --log-prefix " NAT_POSTROUTING_LOG:" 
-A OUTPUT -p tcp -m tcp --dport 80 -m state --state NEW -j LOG --log-prefix " NAT_OUTPUT_LOG:" 
COMMIT
# Completed on Tue Mar 10 00:39:17 2009

簡単にいうと,パケットの入出力があると/var/log/messagesなどにログを出すだけのルールです.
ポートが10000だったり80だったりはあまり他意はないので気にせず.
注意点はrawテーブルはステートフルなルールはかけません(実際は登録できるけど試した限りでは期待通りに動かないみたい).
ip_conntrackより前に処理されるということもありますし,目的から考えたらそういうもんですかね.

外部からパケットを突っ込む

外部からTCPの10000番にパケットを突っ込むだけです.10000にサービスを何も立ち上げなくても取り急ぎ問題ありません.

$ telnet 192.168.1.111 1000

っで,ログを見ます.

$ tail /var/log/messages
Mar 10 00:36:29 localhost kernel:  RAW_PREROUTING_LOG:IN=eth0 OUT= MAC=00:0c:29:da:06:16:00:1f:d0:5e:d8:45:08:00 SRC=192.168.1.10 DST=192.168.1.111 LEN=60 TOS=0x10 PREC=0x00 TTL=64 ID=45461 DF PROTO=TCP SPT=43839 DPT=10000 WINDOW=5840 RES=0x00 SYN URGP=0 
Mar 10 00:36:29 localhost kernel:  NAT_PREROUTING_LOG:IN=eth0 OUT= MAC=00:0c:29:da:06:16:00:1f:d0:5e:d8:45:08:00 SRC=192.168.1.10 DST=192.168.1.111 LEN=60 TOS=0x10 PREC=0x00 TTL=64 ID=45461 DF PROTO=TCP SPT=43839 DPT=10000 WINDOW=5840 RES=0x00 SYN URGP=0 
Mar 10 00:36:29 localhost kernel:  FILTER_INPUT_LOG:IN=eth0 OUT= MAC=00:0c:29:da:06:16:00:1f:d0:5e:d8:45:08:00 SRC=192.168.1.10 DST=192.168.1.111 LEN=60 TOS=0x10 PREC=0x00 TTL=64 ID=45461 DF PROTO=TCP SPT=43839 DPT=10000 WINDOW=5840 RES=0x00 SYN URGP=0 
外部にパケットを吐き出す

同じくtelnetで.同様に相手は居なくてもかまいません.

$ telnet 192.168.1.1 80
Mar 10 00:34:24 localhost kernel:  RAW_OUTPUT_LOG:IN= OUT=eth0 SRC=192.168.1.111 DST=192.168.1.1 LEN=60 TOS=0x10 PREC=0x00 TTL=64 ID=49029 DF PROTO=TCP SPT=54504 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0 
Mar 10 00:34:24 localhost kernel:  NAT_OUTPUT_LOG:IN= OUT=eth0 SRC=192.168.1.111 DST=192.168.1.1 LEN=60 TOS=0x10 PREC=0x00 TTL=64 ID=49029 DF PROTO=TCP SPT=54504 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0 
Mar 10 00:34:24 localhost kernel:  FILTER_OUTPUT_LOG:IN= OUT=eth0 SRC=192.168.1.111 DST=192.168.1.1 LEN=60 TOS=0x10 PREC=0x00 TTL=64 ID=49029 DF PROTO=TCP SPT=54504 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0 
なんに使うんじゃ?

正直「これ!!」ってのはわかりませんが,こちらのページの記述によると,NOTRACKというターゲットとともに使うようです.

rawテーブルはNOTRACKを使用する事でconntrack、NATを適用せずに通過させる その分、高速になる、TRACE でトレース出来る また conntrackやstateモジュールは使用出来ない

っで,なんで調べたのか

単刀直入に言うと,英語のmanを見たら登場したからです

$ LANG=C man iptables

raw:
This table is used mainly for configuring exemptions from connection tracking in combination with the NOTRACK target. It registers at the netfilter hooks with higher priority and is thus called before ip_conntrack, or any other IP tables. It provides the following built-in chains: PREROUTING (for packets arriving via any network interface) OUTPUT (for packets generated by local processes)

でてくんなよ.

manのrawテーブルの説明を和訳してみた

とりあえず適当ですが,rawの説明を和訳してみました.

このテーブルは、主にNOTRACKターゲットと組み合わせ,接続のトラッキングから除外した構成をするために使用されます。
rawテーブルはより高い優先度でnetfilterフックに登録し、ip_conntrack、あるいは他のIPテーブルの前に呼ばれます。

rawテーブルは次の組み込みチェインを提供します: PREROUTING (略) OUTPUT (略)

未来の自分が参考になれば.

追記: 参考URL

改めて調べたらこういうものも出てきた