Ubuntu

如何讓 boto 使用預先路由到另一個埠的埠 443?

  • March 4, 2015

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

我有帶有 Docker 容器集群的 Ubuntu 實例,它們都託管 Web 伺服器

為了安撫防火牆,我們希望使用埠 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 方面的專家,有趣的是,這似乎是容器上的問題,而不是主機上的問題。

您的 DNAT 規則不夠具體。它適用於通過主機轉發到埠 443 的所有流量,無論來源或目的地如何。

要解決此問題,請使規則更加具體,例如指定它僅適用於來自外部世界的入站流量。如果這到達eth0介面,那麼您將添加-i eth0到規則中:

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

這不適用於去往另一個方向的流量,其中“入站”介面是 egdocker0而“出站”介面是eth0

引用自:https://serverfault.com/questions/672884