如何讓 boto 與已預先路由到另一個連接埠的連接埠 443 一起運作?

如何讓 boto 與已預先路由到另一個連接埠的連接埠 443 一起運作?

我的標題可能措辭不好,但我會盡力弄清楚背景故事:

我有 Ubuntu 實例,其中包含所有託管 Web 伺服器的 Docker 容器集群

為了安撫防火牆,我們希望使用連接埠 443 而不是連接埠 8000(其中服務正在偵聽流量並追蹤對對應容器開啟的套接字)

為此,我們增加了一條規則:

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 可以正常工作,但我們無法將連接埠 8000 用於生產 ssl 服務。

我們應該如何設定 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

相關內容