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

Правило iptables не работает

Я столкнулся со следующей проблемой: я хочу заблокировать доступ к порту 8000 из сети (заблокировать все соединения, кроме соединений с 127.0.0.1). Итак, чтобы упростить мою проблему и в качестве первого шага, я решил заблокировать весь доступ к порту 8000, используя это правило:

iptables -A INPUT -p tcp --dport 8000 -j DROP

Теперь я знаю, что мне следует принять обратный подход - отбросить все соединения, кроме доверенных, но я решил сделать это в образовательных целях.

iptables -L показывает мне этот вывод:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:8000

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           ctstate RELATED,ESTABLISHED
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain DOCKER (1 references)
target     prot opt source               destination
ACCEPT     tcp  --  0.0.0.0/0            172.17.0.1          tcp dpt:80

К сожалению, мне все еще удается получить доступ к серверу через порт 8000. Вы можете сказать мне, что мне делать? Я ничего не сделал после выполнения команды правила сброса.

Похоже, вы используете Docker. При открытии порта контейнера Docker создаст правила для пересылки пакетов в ваш контейнер. Эти пакеты никогда не проходят через цепочку INPUT. Видеть: http://www.faqs.org/docs/iptables/traversingoftables.html

Вы можете фильтровать, используя цепочку FORWARD.

iptables -I FORWARD -p tcp -d 172.17.0.1 --dport 80 -j DROP

Заметка, это не приведет к разрыву соединений с localhost, и вам придется использовать переписанный пункт назначения (т.е. порт прослушивания в контейнере).

Если вам нужен больший контроль, вы можете запустить демон Docker с помощью --iptables=false, но вам придется управлять пересылкой пакетов в контейнеры вручную.