Назад | Перейти на главную страницу

Как заставить бото работать с портом 443, предварительно маршрутизируемым на другой порт?

Мой заголовок может быть плохо сформулирован, но я постараюсь рассказать предысторию прямо:

У меня есть экземпляры Ubuntu с кластерами контейнеров Docker, все веб-серверы хостинга

Чтобы успокоить брандмауэры, мы хотим использовать порт 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

Это не относится к трафику, идущему в другом направлении, например, к "входящему" интерфейсу. docker0 а "исходящий" интерфейс eth0.