- PR -

「Linuxで作るファイアウォール[フィルタ設定編]」 に関する質問

1
投稿者投稿内容
Shuji Tamura
会議室デビュー日: 2004/01/26
投稿数: 5
投稿日時: 2004-01-26 23:57
@IT会議室 新入生の SHuji Tamura です。よろしくお願いします。
Linux Square の記事をいつも大変参考にさせていただいています。

http://www.atmarkit.co.jp/flinux/rensai/security05/security05a.html
第5回Linuxで作るファイアウォール[フィルタ設定編]記載の
# /sbin/iptables -A FORWARD -p tcp ! --syn -m state --state ESTABLISHED --sport 80 -s 192.168.0.10 -j ACCEPT
部分に疑問を持ちましたので、投稿させていただきます。

「! --syn」は、「--syn SYN,RST,ACK SYN」以外ではなく「--syn SYN,RST,ACK SYN」
上の行を下の行に訂正:
「! --syn」は、「--tcp-flags SYN,RST,ACK SYN」以外ではなく、
「--tcp-flags SYN,RST,ACK SYN」
の逆、すなわち {SYN=0, RST=1, ACK=1} のパケットを指定しているので、
上記の iptables では、RST=1 すなわち強制終了のパケットしかフォワードしない
のではないかと思うのですが、間違っているでしょうか。

このように記載されたホームページを他でも見ましたので、私の理解不足なのかも
しれないと思い、質問させていただきました。よろしくお願いします。


_________________


[ メッセージ編集済み 編集者: Shuji Tamura 編集日時 2004-01-29 20:23 ]

[ メッセージ編集済み 編集者: Shuji Tamura 編集日時 2004-01-29 20:32 ]
士元
会議室デビュー日: 2003/05/15
投稿数: 15
投稿日時: 2004-01-27 13:16
はじめまして。

[! --syn]はもっと単純にsynのフラグが立っていない、
要するに接続済みのパケットという事になります。

これは必ずしも他のフラグが立ってなければならないという訳ではないと思います。
synフラグは接続要求と接続応答の部分でしか使われないとおもうので(たぶん)
プログラムと同じで単なる否定で!=的に考えれば大丈夫だと思いますよ。

実際に設定してみると違いがわかると思います。
Shuji Tamura
会議室デビュー日: 2004/01/26
投稿数: 5
投稿日時: 2004-01-27 22:24
士元さん、どうもコメントありがとうございます。

[! --syn]はもっと単純にsynのフラグが立っていない、
だけのことであるとのことですが、

たとえば、
http://www.linux.or.jp/JM/html/iptables/man8/iptables.8.html
によれば、
"--syn" の前に "!" フラグを置くと、 SYN ビットがクリアされ ACK と RST ビットが設定されている TCP パケットにのみマッチする。
と明記されています。どう解釈されますか?
士元
会議室デビュー日: 2003/05/15
投稿数: 15
投稿日時: 2004-01-28 14:10
どうもです。

内容拝見しました。

なんか、自分の理解に自信がなくなってきてしまいました(^_^;
実際に記述の仕方は知っていたのですが、
意味を誤解している場合があるかもしれません。

申し訳ないですが、参考にならないですね・・・

時間を見つけて自分のほうで試してみようかと思います。
フィードバックはできるかどうかはわかりませんが・・・

一応設定だけしてみて、
hpingなどでフラグをつけたパケットを送ってみると良いかもしれません。

申し訳ないですが答えに行き着きません(^_^;
自分ももう少し勉強します(笑)

[ メッセージ編集済み 編集者: 士元 編集日時 2004-01-28 18:48 ]
Shuji Tamura
会議室デビュー日: 2004/01/26
投稿数: 5
投稿日時: 2004-01-29 20:38
士元さん、混乱させてしまって申し訳ありません。

実は、この件を投稿したのは、
# /sbin/iptables -A FORWARD -i ppp0 -d 192.168.1.0/24 -p tcp ! --syn -m state --state ESTABLISHED -j ACCEPT
を試した時、うまくインターネットに接続できなかったため、
外部から内部にフォワードされていないと判断したからなのですが、

再度テストし直したところ、今度はうまく接続できました。
その原因は多分、前の失敗時は
# /sbin/iptables -A FORWARD -i ppp0 -d 192.168.1.0/24 -p udp -m state --state ESTABLISHED -j ACCEPT
を忘れていたためで、
-p udp --sport 53 がフォワードされず、外部 DNS からの返信パケットが内部へ
フォワードできなかったためと思います。
とはいえ、これで疑問が解けたわけではないのですが。

その後、O'REILLY の 「LINUX ネットワーク管理/第2版」も調べてみました。
こちらには、もっと混乱することが書かれています。
[!] --syn
SYN ビットが設定され、ACK ビットと FIN ビットが設定されていないデータグラム
を指定する。--tcp-flags SYN,RST,ACK SYN の省略形。
SYN と ACK はよいとして、三つ目のフラグは FIN なの? RST なの?
どっちなのという思いですが、これは、RST が正しいはずですよね。
更に混乱することには、(!) を使用したときは、SYN ビットと ACK ビットが両方設定
されていないデータグラムを指定するとあります。

どの文書も、書いていることがすこし違っていて、混乱してしまいます。

それで、もう少し基本的な勉強をしないことには、これ以上は考えてもしかたない
という結論に至りました。

とりあえずは、以下の方針でフォワードしようと思います。
デフォルトポリシーは、フォワードを禁止です
1.-p tcp --syn パケットは外部から内部へフォワードしない
2.-p tcp --syn 以外は、ESTABLISHED なパケットだけを内部へ
  フォワードする
1.# /sbin/iptables -A FORWARD -i ppp0 -d 192.168.1.0/24 -p tcp --syn DROP
2.# /sbin/iptables -A FORWARD -i ppp0 -d 192.168.1.0/24 -m state --state ESTABLISHED ACCEPT

2.だけでもよいような気もするのですが....。
ESTABLISHED は、ACK=1 のパケットを指定するので、-p tcp --syn のパケットは
除外されるはずですよね。

それに、
# /sbin/iptables -A FORWARD -i ppp0 -d 192.168.1.0/24 -p tcp ! --syn -m state --state ESTABLISHED -j ACCEPT
とは、何が違うのか?、同じなのか?....。
など、疑問は残るのですが、これ以上は、しばらく考えないことにします。

どうもありがとうございました。

_________________
Shuji Tamura
会議室デビュー日: 2004/01/26
投稿数: 5
投稿日時: 2004-02-07 12:48
最初に質問しました、Shuji Tamura です。

その後も、ルーターマシンのパケットフィルタリングを書き直そうと
いろいろ調べを続けていたところ、次のドキュメント
http://www.linux.or.jp/JF/JFdocs/packet-filtering-HOWTO-7.html
には、こう書かれていることに気づきました。

--syn は、SYN フラグがセットされていて、RST と ACK フラグがクリアされている
パケットです。! --syn は、接続開始のパケットを除く全てのパケットです。

同じ linux.or.jp なのに、JF とJM でまるっきり異なる説明がされています。
http://www.linux.or.jp/JF/JFdocs/packet-filtering-HOWTO-7.html
http://www.linux.or.jp/JM/html/iptables/man8/iptables.8.html

どちらが正しいかは、実績で明らかなように、JF のドキュメントが正しい
ことになります。

この一連の投稿を読まれた方に混乱を与えてしまい申し訳ありませんでしたが、
これで一応すっきりしました。


[ メッセージ編集済み 編集者: Shuji Tamura 編集日時 2004-02-07 15:22 ]
1

スキルアップ/キャリアアップ(JOB@IT)