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ルールを通過しないことを理解しているため、機能しません。これを機能させる方法はありますか?
iptables
を含まないソリューションを受け入れる場合は、単純なプロキシサーバー( balance や など)を実行するだけで済みます。/haproxy または pen など)localhost
へのトラフィックを傍受し、コンテナに渡します。
@ブリゴ:それは正しくありません。 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ターゲットを考えていました。
私はこのトリックを行うためにiptablesを取得しようと多くの時間を費やしましたが、どういうわけか、dnatターゲットをnatテーブルの出力チェーンに追加すると、パケットのそれ以上の処理が停止するようです。
Iptablesのデバッグは、次のトリックで実行できます。 http://backreference.org/2010/06/11/iptables-debugging/
Linuxのパケットフローのグラフィカルな概要も役立ちます: http://inai.de/images/nf-packet-flow.png
私は自分の問題を解決するためにxinetdに頼りました。 SSH -Lトンネルのエンドポイント(ローカルホスト)を別のマシンに転送する を参照してください。