web-dev-qa-db-ja.com

ローカルホストリクエストをLinuxコンテナにリダイレクトする

UbuntuホストでいくつかのLinuxコンテナーを実行し、それぞれがwebappを実行しています。 Webアプリにアクセスするには、iptablesを使用してポートを転送します。

Sudo iptables -t nat -A PREROUTING -p tcp --dport <port> -j DNAT --to-destination #<container_ip>:<port>

これは、トラフィックがホストのoutsideから来ている場合にうまく機能します。リクエストがローカルホストによって行われた場合、それは機能しません:

 curl <Host_ip>:<port>       #works (from outside the Host)
 curl <container_ip>:<port>  #works (from inside the Host)
 curl 127.0.0.1:<port>       #doesn't work (from inside the Host)

ローカルホストからのパケットがiptablesDNATルールを通過しないことを理解しているため、機能しません。これを機能させる方法はありますか?

3
rmonjo

iptablesを含まないソリューションを受け入れる場合は、単純なプロキシサーバー( balanceなど)を実行するだけで済みます。/haproxy または pen など)localhostへのトラフィックを傍受し、コンテナに渡します。

0
larsks

@ブリゴ:それは正しくありません。 NATテーブルには、OUTPUTチェーンを含めることができます。問題は、NATテーブルのPREROUTINGチェーンがループバックインターフェイスに適用されていないことです。

@ rmonjo、PREROUTINGチェーンに加えてOUTPUTチェーンを使用します。

iptables -t nat -A OUTPUT -o lo -p tcp --dport <port> -j DNAT \
--to-destination #<container_ip>:<port>

編集:これは機能しません。この問題を解決できないREDIRECTターゲットを考えていました。

1
Mark Wagner

私はこのトリックを行うためにiptablesを取得しようと多くの時間を費やしましたが、どういうわけか、dnatターゲットをnatテーブルの出力チェーンに追加すると、パケットのそれ以上の処理が停止するようです。

Iptablesのデバッグは、次のトリックで実行できます。 http://backreference.org/2010/06/11/iptables-debugging/

Linuxのパケットフローのグラフィカルな概要も役立ちます: http://inai.de/images/nf-packet-flow.png

私は自分の問題を解決するためにxinetdに頼りました。 SSH -Lトンネルのエンドポイント(ローカルホスト)を別のマシンに転送する を参照してください。

0
Jaap Prickartz