LINUX.ORG.RU

Правила iptables: то ли я накосячил, то ли докер автоматом открыл

 ,


0

1

Разбираюсь с iptables после установки докера. Изначально было настроено так:

-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m multiport --dports 80,443,{мой кастомный порт для ssh} -j ACCEPT

Поставил докер, установил контейнер, сделал проброс ещё одного порта (допустим, 10000) на 22 порт контейнера. Ожидаю, что когда попытаюсь зайти по ssh в хост-систему на 10000 порт, то получу что-то вроде connection refused, пока не открою сам 10000 порт. В итоге соединяюсь прекрасно. В чём затык? Правила стали вот такие:

-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-2
-N DOCKER-USER
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m multiport --dports 80,443,{мой кастомный порт для ssh} -j ACCEPT
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o br-18c405db569f -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o br-18c405db569f -j DOCKER
-A FORWARD -i br-18c405db569f ! -o br-18c405db569f -j ACCEPT
-A FORWARD -i br-18c405db569f -o br-18c405db569f -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 10.10.0.19/32 ! -i br-18c405db569f -o br-18c405db569f -p tcp -m tcp --dport 22 -j ACCEPT

-A DOCKER-ISOLATION-STAGE-1 -i br-18c405db569f ! -o br-18c405db569f -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o br-18c405db569f -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN

Тут добавилось какое-то правило, которое открывает 10000 порт? Не вижу его. :( А в соответствии с правилом «-P INPUT DROP», врод, он должен быть закрыт. Или тут несколько правил, типа одно перенаправляет на другое, а в конце на то, что «-A DOCKER -d 10.10.0.19/32 *** –dport 22 -j ACCEPT»?

Поставил докер, установил контейнер, сделал проброс ещё одного порта (допустим, 10000) на 22 порт контейнера.

А что в данном случае значит «сделал проброс»?

anarquista ★★★★★
()

Например

-A INPUT -i lo -j ACCEPT

Присоединяюсь к вопросу, как «прокинут» порт из контейнера?

vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 2)
Ответ на: комментарий от anarquista

Имею в виду, что указал это в команде при старте контейнера. Докер же умеет в порт-маппинг. Тут вот про это есть: https://docs.docker.com/config/containers/container-networking/

При запуске контейнера указываю, какой порт хост-системы на какой порт контейнера пробрасывать. Как это делает докер - фиг знает.:(

Просто раньше всегда было, что когда запускаешь контейнер, указываешь соответствие порт хост-системы - порт контейнера в команде docker run, потом в хост-системе нужно этот порт открыть для доступа извне, если хотим подключиться по этому порту к контейнеру. А тут попробовал - всё само работает, ничего открывать не надо. Вот и закрались сомнения, а работает ли вообще у меня блокировка всех портов в хост-системе по умолчанию.

Novascriptum
() автор топика
Последнее исправление: Novascriptum (всего исправлений: 1)
Ответ на: комментарий от Novascriptum

Имею в виду, что указал это в команде при старте контейнера

Что указал?

Посмотри, к примеру через netstat -tlpn | grep твой_порт на каком из локальных адресов твой порт и что там в правилах по этому адресу.

vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 1)
Ответ на: комментарий от vvn_black

Что указал?

Проброс портов в команде docker run. Конкретную команду не могу представить, т.к. она конструируется docker compose’ом. Но там типа такого:

docker run -itd --name="..." --privileged -p 10000:22 vendor/name

Посмотри, к примеру через netstat -tlpn | grep твой_порт на каком из локальных адресов твой порт и что там в правилах по этому адресу.

# netstat -tlpn | grep 10000
tcp        0      0 0.0.0.0:10000           0.0.0.0:*               LISTEN      6037/docker-proxy   
tcp6       0      0 :::10000               :::*                    LISTEN      6043/docker-proxy 
Novascriptum
() автор топика
Ответ на: комментарий от BOOBLIK
# iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N DOCKER
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 10.10.0.0/16 ! -o br-18c405db569f -j MASQUERADE
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 10.10.0.5/32 -d 10.10.0.5/32 -p tcp -m tcp --dport 22 -j MASQUERADE
-A DOCKER -i br-18c405db569f -j RETURN
-A DOCKER -i docker0 -j RETURN
-A DOCKER ! -i br-18c405db569f -p tcp -m tcp --dport 10000 -j DNAT --to-destination 10.10.0.5:22

Я тут что-то не пойму, почему тут вдруг стало «-P INPUT ACCEPT», если iptabes -S выдаёт «-P INPUT DROP»? И последнее правило, как я понимаю, как раз про переадресацию порта с 10000 на 22? То есть типа он реально «автоматически» открылся докером?

Novascriptum
() автор топика
Ответ на: комментарий от Novascriptum

Верно. Когда ты говоришь docker run … -p 10000:22 то он именно в таблице nat создаёт тебе правила.

BOOBLIK ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.