¿Cómo consigo que boto funcione con el puerto 443 preenrutado a otro puerto?

¿Cómo consigo que boto funcione con el puerto 443 preenrutado a otro puerto?

Puede que mi título esté mal redactado, pero intentaré aclarar la historia de fondo:

Tengo instancias de Ubuntu con grupos de contenedores Docker que alojan servidores web.

Para apaciguar los firewalls, queremos usar el puerto 443 en lugar del puerto 8000 (donde un servicio escucha el tráfico y realiza un seguimiento de los sockets abiertos a los contenedores apropiados).

Para ello agregamos una regla:

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

Sin embargo, los contenedores usan boto para enviar contenido a s3, es decir, 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'
)

Con la regla de enrutamiento previo implementada, boto ya no puede usar el puerto 443 y regresa con:

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

Sin la regla, boto funciona bien, pero no podemos usar el puerto 8000 para un servicio SSL de producción.

¿Cómo deberíamos configurar nuestra tabla y servicio PREROUTING para hacer ambas cosas?

No soy un experto en boto, iptables o docker, y es interesante que esto parece ser un problema en los contenedores y no en el host.

Respuesta1

Su regla DNAT no es lo suficientemente específica. Se esta aplicando atodoel tráfico se reenvía a través del host al puerto 443, independientemente del origen o destino.

Para resolver el problema, haga que la regla sea más específica, por ejemplo especificando que se aplica solo al tráfico entrante del mundo exterior. Si esto llega a la eth0interfaz, deberá agregar -i eth0a la regla:

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

Esto no se aplicará al tráfico que va en la otra dirección, donde la interfaz "entrante" es, por ejemplo, docker0y la interfaz "saliente" es eth0.

información relacionada