Я изучаю iptables в сочетании с Docker. Я выясняю, как на самом деле работает docker-compose host:port:port для переадресации портов. Я понял, что это делает магию iptables. Итак, я сделал небольшой тест.

Сначала у меня был этот docker-compose.yml:

version: "3"
services:
  postgres:
    image: postgres:latest
    ports:
      - 127.0.0.1:5432:5432
    networks:
      - network
network:
  network:

При запуске этого, iptables -S дает:

-P INPUT ACCEPT
-P FORWARD DROP
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION
-N DOCKER-USER
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION
-A FORWARD -o br-bd4b05981a0f -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o br-bd4b05981a0f -j DOCKER
-A FORWARD -i br-bd4b05981a0f ! -o br-bd4b05981a0f -j ACCEPT
-A FORWARD -i br-bd4b05981a0f -o br-bd4b05981a0f -j ACCEPT
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A DOCKER -d 172.18.0.2/32 ! -i br-bd4b05981a0f -o br-bd4b05981a0f -p tcp -m tcp --dport 5432 -j ACCEPT
-A DOCKER-ISOLATION -i docker0 -o br-bd4b05981a0f -j DROP
-A DOCKER-ISOLATION -i br-bd4b05981a0f -o docker0 -j DROP
-A DOCKER-ISOLATION -j RETURN
-A DOCKER-USER -j RETURN

Я проверил, что порт 5432 действительно не был доступен через Интернет и только на локальном хосте. Большой!

После этого я перезагрузил компьютер, очистил docker (docker system prune --all --volumes --force) и запустил следующий docker-compose.yml:

version: "3"
services:
  postgres:
    image: postgres:latest
    ports:
      - 5432:5432
    networks:
      - network
network:
  network:

Обратите внимание, что 127.0.0.1: больше не присутствует в этой конфигурации. Теперь при запуске iptables -S я получаю точно такую же конфигурацию:

-P INPUT ACCEPT
-P FORWARD DROP
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION
-N DOCKER-USER
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION
-A FORWARD -o br-6ada9a016213 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o br-6ada9a016213 -j DOCKER
-A FORWARD -i br-6ada9a016213 ! -o br-6ada9a016213 -j ACCEPT
-A FORWARD -i br-6ada9a016213 -o br-6ada9a016213 -j ACCEPT
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A DOCKER -d 172.18.0.2/32 ! -i br-6ada9a016213 -o br-6ada9a016213 -p tcp -m tcp --dport 5432 -j ACCEPT
-A DOCKER-ISOLATION -i docker0 -o br-6ada9a016213 -j DROP
-A DOCKER-ISOLATION -i br-6ada9a016213 -o docker0 -j DROP
-A DOCKER-ISOLATION -j RETURN
-A DOCKER-USER -j RETURN

Однако на этот раз услуга доступна через интернет. Это предназначено согласно docker-compose.yml я использую в этот раз. Однако конфигурация iptables точно такая же, как приведенная выше. Странный?

Как это возможно, что две точные конфигурации iptables ведут себя по-разному? Я предполагаю, что мне не хватает какой-то части, чтобы понять особенности функциональности переадресации портов Docket.

1 ответ1

0

Посмотрите на таблицу nat с iptables -L -t nat .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .