
我的標題可能措辭不好,但我會盡力弄清楚背景故事:
我有 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
。