Я столкнулся со следующей проблемой: я хочу заблокировать доступ к порту 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
, но вам придется управлять пересылкой пакетов в контейнеры вручную.