私のサーバー (以下のiptables
ルールがロードされているサーバー) の IP は です192.168.3.110
。私の LAN には IP を持つ別のコンピューターがあります192.168.3.106
。ポート 80 のサーバーへのリクエストを にリダイレクトしようとしています192.168.3.106
。
iptables
CentOS 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
サーバーから自分自身に呼び出しを行うと、応答が返される理由がわかりません。
この場合、物事はこのように動作するはずだと私は理解しています:
curl http://192.168.3.110
- IPアドレスを使用してサーバーから実行していることを忘れないでください192.168.3.110
- パケットはNATテーブルからOUTPUTチェーンに送られ、そこでDNATされる。
- パケットはNATテーブルからPOSTROUTINGチェーンに送られ、そこでSNATされる。
- 私の Apache が
192.168.3.106
私のリクエストに応答しています。 - パケットは NAT テーブルから PREROUTING チェーンに到達しており、そこで DNAT される必要があります。
- パケットは転送され、どこかに投げられます。
5 と 6 を除いて、すべて期待どおりに動作するようです。言い換えると、サーバーから応答を受信します。私の論理がどこで壊れているのか誰か説明してくれませんか?
答え1
iptables nat テーブルは、(疑似)接続の最初のパケットに対してのみ走査されます。後続のパケットは、最初のパケットによって確立されたマッピングに従ってマッピングされます (またはそのまま残されます)。