しばらくの間(バージョン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
を使用することが安全でない場合は、パケットが前者の状態になり、後者にない場合の具体的な例をいくつか提供してくださいもの。
ロギングに関する@ABのアドバイスのおかげで、さらにテストを行うことができました。ここでは、結果と自分の質問に対する回答を示します。これは、私のように何も見つからなかった他の人々の助けになることを願っています。 SNAT
とDNAT
の状態に関するウェブ、および/または照合のために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,RELATED
をSNAT
またはDNAT
で置き換えるのは良い考えですか」という答えは、再びnoです。
セキュリティのために私はあなたの方法を使いません。ネットワークを作り直し、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メソッドのマークをインクリメントすることにより)より多くのテストを簡単に連鎖することを想像できます。