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. パケットは NAT テーブルから PREROUTING チェーンに到達しており、そこで DNAT される必要があります。
  6. パケットは転送され、どこかに投げられます。

5 と 6 を除いて、すべて期待どおりに動作するようです。言い換えると、サーバーから応答を受信します。私の論理がどこで壊れているのか誰か説明してくれませんか?

答え1

iptables nat テーブルは、(疑似)接続の最初のパケットに対してのみ走査されます。後続のパケットは、最初のパケットによって確立されたマッピングに従ってマッピングされます (またはそのまま残されます)。

関連情報