IPtablesが期待どおりに機能しない:PREROUTINGでDNATを使用して、応答パケットは期待通りにDNAT処理されません。

IPtablesが期待どおりに機能しない:PREROUTINGでDNATを使用して、応答パケットは期待通りにDNAT処理されません。

私のサーバー(次のiptablesルールがロードされています)にはIPがあります192.168.3.110。私のLANにIPを持つ別のコンピュータがあります192.168.3.106。ポート80のサーバー要求を192.168.3.106

iptablesCentOS 7サーバーに次のファイルがロードされています。


*nat
:PREROUTING DROP
:INPUT DROP
:OUTPUT DROP
:POSTROUTING DROP

-A PREROUTING -m state --state RELATED,ESTABLISHED -j ACCEPT
-A PREROUTING -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A PREROUTING --dst 192.168.3.110 -p tcp --dport 80 -j DNAT --to-destination 192.168.3.106
-A PREROUTING -i lo -j ACCEPT

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A INPUT -i lo -j ACCEPT

-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A OUTPUT --dst 192.168.3.110 -p tcp -m state --state NEW --dport 80 -j DNAT --to-destination 192.168.3.106
-A OUTPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT

-A POSTROUTING -m state --state RELATED,ESTABLISHED -j ACCEPT
-A POSTROUTING -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A POSTROUTING --src 192.168.3.0/24 --dst 192.168.3.106 -p tcp --dport 80 -j SNAT --to-source 192.168.3.110
-A POSTROUTING -o lo -j ACCEPT

COMMIT

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A INPUT -i lo -j ACCEPT

-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited

-A OUTPUT -p tcp --sport 22 -j ACCEPT
-A OUTPUT -p tcp -j ACCEPT
-A OUTPUT -j ACCEPT
-A OUTPUT -o lo -j ACCEPT

COMMIT

基本的に私は次のことをしています(少なくとも私はそう理解しています)。

  • SSHの有効化

  • ポート80でTCPを有効にする

  • DNAT および SNAT パケットにより、所望の動作を達成できました。

質問:サーバーから独自の呼び出しを行うと、なぜ192.168.3.110応答を受け取るのか理解できません。

これがこの場合に機能する必要があることを理解する方法です。

  1. curl http://192.168.3.110- IPを使って私のサーバーでこれをやっていることを忘れないでください。192.168.3.110
  2. パケットは nat テーブルから OUTPUT チェーンに移動し、ここで DNAT で表されます。
  3. パケットはnatテーブルからPOSTROUTINGチェーンに移動してSNATになります。
  4. 私のApacheはから来て、192.168.3.106私の要求に答えています。
  5. パケットが DNATed されるべき nat テーブルの PREROUTING チェーンに到達しています。
  6. パケットは転送され、どこかにスローされます。

5、6を除いて、すべてが期待どおりに機能しているようです。つまり、サーバーから応答を受け取ります。私の論理がどこで壊れたのかを説明できる人はいますか?

ベストアンサー1

iptables nat テーブルは、(擬似)接続の最初のパケットに対してのみ渡されます。後続のパケットは、最初のパケットによって設定されたマッピングに従ってマッピング(または保持)されます。

おすすめ記事