
タイトルの言い回しは下手かもしれませんが、背景をわかりやすく説明したいと思います。
私は、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
。