다른 포트로 사전 라우팅되는 포트 443에서 boto가 작동하도록 하려면 어떻게 해야 합니까?

다른 포트로 사전 라우팅되는 포트 443에서 boto가 작동하도록 하려면 어떻게 해야 합니까?

내 제목이 형편없게 표현되었을 수도 있지만 배경 이야기를 바로잡으려고 노력하겠습니다.

웹 서버를 호스팅하는 모든 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.

관련 정보