
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 eth0
interfaz, deberá agregar -i eth0
a 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, docker0
y la interfaz "saliente" es eth0
.