web-dev-qa-db-ja.com

IPtables:DNATが機能しない

私が持っているCentOSサーバーで、ポート8080をサードパーティのWebサーバーに転送したいと思います。
そこで私はこのルールを追加しました:

iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination thirdparty_server_ip:80

しかし、それはうまくいかないようです。
プロセスをデバッグするために、次の2つのLOGルールを追加しました。

iptables -t mangle -A PREROUTING -p tcp --src my_laptop_ip --dport ! 22 -j LOG --log-level warning --log-prefix "[_REQUEST_COMING_FROM_CLIENT_] "
iptables -t nat -A POSTROUTING -p tcp --dst thirdparty_server_ip  -j LOG --log-level warning --log-prefix "[_REQUEST_BEING_FORWARDED_] "

--dport ! 22の部分は、ログファイルがフラッディングしないようにSSHトラフィックを除外するためだけにあります)

このページ によると、mangle/PREROUTINGチェーンは、着信パケットを処理する最初のチェーンであり、nat/POSTROUTING chainは、発信パケットを処理する最後のチェーンです。

そして、nat/PREROUTINGチェーンは他の2つの中間にあるので、3つのルールはこれを行う必要があります。

  1. mangle/PREROUTINGのルールは、着信パケットをログに記録します
  2. nat/PREROUTINGのルールはパケットを変更します(宛先IPとポートを変更します)
  3. nat/POSTROUTINGのルールは、転送されようとしている変更されたパケットをログに記録します

最初のルールは私のラップトップからの着信パケットをログに記録しますが、3番目のルールは2番目のルールによって変更されることになっているパケットをログに記録しません。ただし、サーバーで生成されたパケットはログに記録されるため、2つのLOGルールが正しく機能していることがわかります。

パケットが転送されないのはなぜですか、または少なくとも3番目のルールによってログに記録されないのはなぜですか?

PS:これらの3つ以上のルールはありません。すべてのテーブルの他のすべてのチェーンは空であり、ポリシーはACCEPTです。

2
GetFree

サーバーでIP転送をオンにする必要がある場合があります。試してみてください

エコー1>/proc/sys/net/ipv4/ip_forward

5
vadimk

DNATを実行しているクライアントが、NATボックスをゲートウェイとして使用するかどうかに大きく依存します(+実際に返信するとNATボックスも使用されます)OR NOT。

そうではないと思いますので、次に障害について説明します:{

[〜#〜] dnat [〜#〜]あなたはRelay-IPでEffective-IPをマスクする(クライアントのPoVからの)NATボックスに属している)。したがって、クライアントは、Effective-IPではなくRelay-IPと通信することを期待しています。代わりに、クライアントは突然、Effective-IPから今まで聞いたことのない返信を受け取ります。

したがって、クライアントとEffective-serviceの間の中間ゲートウェイでなくてもこのようなマスキングを行う場合は、SNAT(NAT-box-external-IPでクライアントを非表示にする)も使用する必要があるため、Effective-IPサービスボックスからのすべての応答はNATゲートウェイに戻ると、NATが解除され、これを開始したクライアントにのみ返送されます。

}

1
poige