Ubuntu
如何讓 boto 使用預先路由到另一個埠的埠 443?
我的標題可能措辭不當,但我會盡量把背景故事弄清楚:
我有帶有 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
這不適用於去往另一個方向的流量,其中“入站”介面是 eg
docker0
而“出站”介面是eth0
。