web-dev-qa-db-ja.com

iptables conntrackモジュール:ESTABLISHED / RELATEDの代わりにSNAT(またはDNAT)状態?

しばらくの間(バージョン1.3で導入されたと思います)、iptables 'conntrackモジュールは、SNATとDNATの2つの仮想状態を追跡できます。

SNAT仮想状態で、元の送信元アドレスが返信先と異なる場合に一致します。 DNAT元の宛先が応答元と異なる場合に一致する仮想状態。

私のルーター/ファイアウォールホストでは、SNATに次のようなルールがあります。

_# SNAT
iptables -t filter -A FORWARD -i $FROM_IFACE -o $TO_IFACE -s $FROM_IP -d $TO_IP -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A FORWARD -i $TO_IFACE -o $FROM_IFACE -s $TO_IP -d $FROM_IP -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o $TO_IFACE -s $FROM_IP -d $TO_IP -j SNAT --to-source $SNAT_IP

# DNAT
iptables -t nat -A PREROUTING -i $FROM_IFACE -d $FROM_IP -p $PROTO --dport $PORT -j DNAT --to-destination $TO_IP
iptables -t filter -A FORWARD -i $FROM_IFACE -o $TO_IFACE -d $TO_IP -p $PROTO --dport $PORT -j ACCEPT
iptables -t filter -A FORWARD -i $TO_IFACE -o $FROM_IFACE -s $TO_IP -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
_

グーグルで少し調べたところ、「新しい」iptablesまたはSNAT状態を使用したDNATルールの例は見つかりませんでしたが、とにかく_ESTABLISHED,RELATED_ by SNATまたはDNATのように:

_# SNAT
iptables -t filter -A FORWARD -i $FROM_IFACE -o $TO_IFACE -s $FROM_IP -d $TO_IP -m conntrack --ctstate NEW,SNAT -j ACCEPT
iptables -t filter -A FORWARD -i $TO_IFACE -o $FROM_IFACE -s $TO_IP -d $FROM_IP -m conntrack --ctstate SNAT -j ACCEPT
iptables -t nat -A POSTROUTING -o $TO_IFACE -s $FROM_IP -d $TO_IP -j SNAT --to-source $SNAT_IP

# DNAT
iptables -t nat -A PREROUTING -i $FROM_IFACE -d $FROM_IP -p $PROTO --dport $PORT -j DNAT --to-destination $TO_IP
iptables -t filter -A FORWARD -i $FROM_IFACE -o $TO_IFACE -d $TO_IP -p $PROTO --dport $PORT -j ACCEPT
iptables -t filter -A FORWARD -i $TO_IFACE -o $FROM_IFACE -s $TO_IP -m conntrack --ctstate DNAT -j ACCEPT
_

うまくいったようです、そしてこの方法には少なくとも1つの利点があります。ファイアウォールは内部ホストからインターネットに送信されるRSTパケットをドロップするために使用されていました(INVALID状態にあるため)が、この新しい方法では、通過許可

残念ながら、便利ですが、この方法が本当に適切であるかどうかはわかりません。ネットワークに関する理論的な知識では、許容範囲が広すぎるかどうかを理解するには不十分です(つまり、LANの外部からの不要なパケットが内部に到達することを許可します)。

私の質問は次のように書くことができると思います:パケットはSNATまたはDNAT状態を保持できますが、ESTABLISHEDまたはRELATED状態も保持できません(ただし、 、明らかに、最初にNEW状態を持つもの)?

注:このようなパケットをログに記録しようとしましたが、iptablesは_--ctstate_オプションを1つしか受け入れず、_!_はその中で使用できないため、不可能です(つまり、「SNAT状態でESTABLISHEDまたはRELATED状態ではないパケットをログに記録する」と言うことはできません。 ")。私が考えていなかったそれらをログに記録する別の方法がある場合、これも大歓迎です。

編集1:試行錯誤の末、私は間違っていることに気づきました(それによりストロークされたテキスト):一部のパケットはまだ状態INVALIDであり、最終的にドロップされました.

編集2:_ESTABLISH,RELATED_の代わりにSNAT/DNATを使用することが安全でない場合は、パケットが前者の状態になり、後者にない場合の具体的な例をいくつか提供してくださいもの。

3
MoonSweep

ロギングに関する@ABのアドバイスのおかげで、さらにテストを行うことができました。ここでは、結果と自分の質問に対する回答を示します。これは、私のように何も見つからなかった他の人々の助けになることを願っています。 SNATDNATの状態に関するウェブ、および/または照合のためにESTABLISHED,RELATEDを置き換える機能.

したがって、適度にビジーなホームネットワーク(SNAT経由でインターネットにアクセスするいくつかのホスト、およびDNAT経由でパブリックにアクセスできるサーバー(HTTP/HTTPS、SMTP、IMAPなど)をホストするいくつかの仮想マシン)では、5日で、 SNATまたはDNAT状態のパケットに関するログの1行は表示されませんでした。また、ESTABLISHEDまたはRELATEDではありません。

したがって、「パケットにはSNATまたはDNATの状態があり、ESTABLISHEDまたはRELATEDの状態はない」という質問に対する答えはnoです。

私の本当の心配は、ESTABLISHED,RELATEDの代わりにSNATまたはDNATと照合して、パケットがLANに入るのを許可することは許容範囲を超える可能性があることだったので、これは最初は安心できるように見えますが、それは良いアイデアではないことがわかりました。

実際、これは逆にless許容的であるように見えます:これらのルールを使用したテスト中に、無視できないほど小さい数が表示されましたドロップされた状態RELATEDのパケットのうち、ほとんどがICMPタイプ3、コード1および3(それぞれdestination Host unreachableおよび宛先ポート到達不能)、インターネットから来て私のLAN内のホストに宛てられています。言い換えると(ネットワークを正しく理解している場合)、ホストがインターネットへの接続を試み、リモートルーターが接続を確立できなかったと応答し、自分のファイアウォール/ルーターホストがそれらの応答をブロックしました。これは良くありません。

したがって、根本的な質問である「ESTABLISHED,RELATEDSNATまたはDNATで置き換えるのは良い考えですか」という答えは、再びnoです。

1
MoonSweep

セキュリティのために私はあなたの方法を使いません。ネットワークを作り直し、SNATを使用する必要がなくなったとします。どうなるの?それは明らかな部分です。どこかに潜んでいる隠れた問題があるかもしれません。

NATルールとフィルタールールは、正当な理由がない限り、独立性を保つ必要があります。正当な理由があるかどうかはわかりません。適切な理由は、非NATトラフィックとは異なるNATトラフィック(例: 背後のサーバーにサービスをDNATしますが、背後のサーバー/サービスに直接アクセスするためのルーターとして使用することはできません )。

さてあなたのメモについて:問題を複数のステップに分けてください。

この誤ったルール:

iptables -A FORWARD -m conntrack --ctstate SNAT ! --ctstate ESTABLISHED,RELATED -j LOG

と置き換えることができます:

iptables -N subtest
iptables -A FORWARD -m conntrack --ctstate SNAT -j subtest
iptables -A subtest -m conntrack ! --ctstate ESTABLISHED,RELATED -j LOG

または、代わりにRETURNと逆ロジックを使用します。

iptables -N speciallog
iptables -A FORWARD -j speciallog
iptables -A speciallog -m conntrack ! --ctstate SNAT -j RETURN
iptables -A speciallog -m conntrack ! --ctstate ESTABLISHED,RELATED -j LOG

または、マークを使用しても(マークが他の場所で使用されている場合は(マスクに煩わされたくない場合))、代わりに同じように使用できます。

iptables -A FORWARD -m conntrack --ctstate SNAT -j MARK 1
iptables -A FORWARD -m mark --mark 1 -m conntrack ! --ctstate ESTABLISHED,RELATED -j LOG

各メソッドについて、(markメソッドのマークをインクリメントすることにより)より多くのテストを簡単に連鎖することを想像できます。

2
A.B