ポート 443 を別のポートに事前ルーティングして boto を動作させるにはどうすればよいですか?

ポート 443 を別のポートに事前ルーティングして boto を動作させるにはどうすればよいですか?

タイトルの言い回しは下手かもしれませんが、背景をわかりやすく説明したいと思います。

私は、WebサーバーをホストするDockerコンテナのクラスタを備えたUbuntuインスタンスを持っています

ファイアウォールを緩和するために、ポート 8000 の代わりにポート 443 を使用します (サービスがトラフィックをリッスンし、適切なコンテナに開いているソケットを追跡している場所)

これを実現するために、次のルールを追加しました:

sudo iptables -t nat -D PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8000

ただし、コンテナは boto を使用してコンテンツを s3 にプッシュします。つまり、次のようになります。

from boto.s3.connection import S3Connection

s3_connection = S3Connection(
    'AWS_KEY_ID',
    'AWS_SECRET_KEY'
)
s3_bucket = s3_connection.get_bucket(
    'AWS_BUCKET'
)

事前ルーティング ルールが適用されると、boto はポート 443 を使用できなくなり、次の結果を返します。

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "/usr/local/lib/python2.7/dist-packages/boto/s3/connection.py", line 496, in get_bucket
    return self.head_bucket(bucket_name, headers=headers)
  File "/usr/local/lib/python2.7/dist-packages/boto/s3/connection.py", line 543, in head_bucket
    response.status, response.reason, body)
boto.exception.S3ResponseError: S3ResponseError: 405 Method Not Allowed

ルールがない場合、boto は正常に動作しますが、実稼働 SSL サービスにポート 8000 を使用することはできません。

両方のことを実行するには、PREROUTING テーブルとサービスをどのように構成すればよいでしょうか?

私は boto、iptables、docker の専門家ではありませんが、これがホストではなくコンテナの問題であるように見えるのは興味深いことです。

答え1

DNATルールが十分に具体的ではありません。適用対象は全て送信元や送信先に関係なく、トラフィックはホスト経由でポート 443 に転送されます。

この問題を解決するには、ルールをより具体的にします。たとえば、外部からの受信トラフィックにのみ適用されるように指定します。これがインターフェイスに到着する場合は、ルールに次の内容eth0を追加します。-i eth0

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8000

これは、反対方向のトラフィックには適用されません。この場合、「受信」インターフェースは例でdocker0、「送信」インターフェースは ですeth0

関連情報