Como faço para que o boto funcione com a porta 443 sendo pré-roteada para outra porta?

Como faço para que o boto funcione com a porta 443 sendo pré-roteada para outra porta?

Meu título pode estar mal formulado, mas tentarei esclarecer a história:

Eu tenho instâncias do Ubuntu com clusters de contêineres Docker, todos hospedando servidores web

Para apaziguar os firewalls, queremos usar a porta 443 em vez da porta 8000 (onde um serviço escuta o tráfego e monitora os soquetes abertos para os contêineres apropriados).

Para fazer isso, adicionamos uma regra:

sudo iptables -t nat -D PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8000

No entanto, os contêineres usam boto para enviar conteúdo para s3, ou seja, algo como:

from boto.s3.connection import S3Connection

s3_connection = S3Connection(
    'AWS_KEY_ID',
    'AWS_SECRET_KEY'
)
s3_bucket = s3_connection.get_bucket(
    'AWS_BUCKET'
)

Com a regra de pré-roteamento em vigor, o boto não pode mais usar a porta 443 e retorna com:

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

Sem a regra o boto funciona bem, mas não podemos usar a porta 8000 para um serviço SSL de produção.

Como deveríamos configurar nossa tabela PREROUTING e serviço para fazer as duas coisas?

Não sou especialista em boto, iptables ou docker, e é interessante que isso parece ser um problema nos contêineres e não no host.

Responder1

A sua regra DNAT não é suficientemente específica. Está se aplicandotodostráfego sendo encaminhado através do host para a porta 443, independentemente da origem ou destino.

Para resolver o problema, torne a regra mais específica, especificando, por exemplo, que ela se aplica apenas ao tráfego de entrada do mundo externo. Se isso chegar na eth0interface, você adicionaria -i eth0à regra:

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

Isso não se aplica ao tráfego que vai na outra direção, onde a interface de "entrada" é, por exemplo, docker0e a interface de "saída" é eth0.

informação relacionada