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

Как заблокировать определенный порт с помощью iptables

У меня запущена служба (реестр докеров) на моем сервере debian на порту 5000. Я хотел бы ограничить доступ к этому конкретному IP, поэтому я создал файл с правилами (1.2.3.4 - мой доверенный IP)

*filter
-A INPUT -p tcp --dport 5000 --source 1.2.3.4 -j ACCEPT
-A INPUT -p tcp --dport 5000 -j DROP
COMMIT

затем я использовал команду, чтобы применить эти правила к iptables

sudo iptables-restore < myfile

поэтому результат команды sudo iptables -L:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  1.2.3.4              anywhere             tcp dpt:5000
DROP       tcp  --  anywhere             anywhere             tcp dpt:5000

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Затем я проверяю, доступен ли порт 5000 из Интернета (с другого моего сервера)

nc -zv 5.6.7.8 5000

и результат [... 5000 (?) Открытых] Мой вопрос: почему? Эти правила настолько просты, почему я могу получить доступ к службе через порт 5000? Даже если соблюдаю одно правило (-A ВХОД -p tcp --dport 5000 -j DROP), Я все еще могу получить доступ к этому порту.

Изменить 1: @ A.B, вы правы. Теперь я вижу также правила докера.

sudo iptables-save -c
# Generated by xtables-save v1.8.2 on Thu Feb 13 15:21:42 2020
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:DOCKER - [0:0]
[39755:1536013] -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
[40:2500] -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
[0:0] -A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 5000 -j MASQUERADE
[0:0] -A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
[0:0] -A DOCKER -i docker0 -j RETURN
[33:1824] -A DOCKER ! -i docker0 -p tcp -m tcp --dport 5000 -j DNAT --to-destination 172.17.0.2:5000
COMMIT
# Completed on Thu Feb 13 15:21:42 2020
# Generated by xtables-save v1.8.2 on Thu Feb 13 15:21:42 2020
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:DOCKER-USER - [0:0]
[0:0] -A DOCKER-USER -p tcp -m tcp --dport 5000 -j DROP
COMMIT
# Completed on Thu Feb 13 15:21:42 2020

Итак, теперь вопрос в том, как добавить правило DROP в таблицу nat? Я добавил правило в соответствии с документами докеров

sudo iptables -t nat -N DOCKER-USER
sudo iptables -t nat -I DOCKER-USER -p tcp -m tcp --dport 5000 -j RETURN

но никакого эффекта.

Edit2: Наконец-то! Я нашел здесь ответ: https://unix.stackexchange.com/questions/462706/block-docker-port-and-access-it-to-few-ip-addresses

Это решает проблему.

-I FORWARD 1 -d 172.17.0.2 -p tcp --dport 5000 -j DROP

Вам нужно добавить свои правила в цепочку Docker. Для этого создайте следующий файл:

*filter
-I DOCKER -i [interface] -s 1.2.3.4 -p tcp --dport 5000 -j ACCEPT
-I DOCKER 3 -i [interface] -p tcp --dport 5000 -j DROP
COMMIT

Это запретит любые пакеты, поступающие в реестр докеров, за исключением 1.2.3.4. Если вы хотите изменить правила и поведение, не забудьте соответствующим образом изменить метрику. Следующая ссылка предоставит вам дополнительную информацию: https://docs.docker.com/network/iptables/