Невозможно заблокировать порт 21 и 5222 через iptables (из-за докера?)

Я пытаюсь открыть только порты 80, 443 и SSH на моей виртуальной машине Ubuntu. Я запускаю Docker, который, как мне кажется, делает видимыми порт 21 и 5222.

telnet HOST 21
Trying HOST...
Connected to HOST.
Escape character is '^]'.

sudo iptables --list --line-numbers -v

Chain INPUT (policy DROP 23 packets, 1878 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1     2013  350K ACCEPT     all  --  lo     any     anywhere             anywhere            
2     1063  614K ACCEPT     all  --  any    any     anywhere             anywhere             ctstate RELATED,ESTABLISHED
3        0     0 DROP       all  --  any    any     anywhere             anywhere             ctstate INVALID
4        1    60 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:ssh ctstate NEW,ESTABLISHED
5       28  1644 ACCEPT     tcp  --  any    any     anywhere             anywhere             multiport dports http,https ctstate NEW,ESTABLISHED

Chain FORWARD (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 DOCKER-USER  all  --  any    any     anywhere             anywhere            

Chain OUTPUT (policy ACCEPT 43 packets, 3082 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1     2013  350K ACCEPT     all  --  any    lo      anywhere             anywhere            
2      816  236K ACCEPT     all  --  any    any     anywhere             anywhere             ctstate ESTABLISHED
3        0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp spt:ssh ctstate ESTABLISHED
4        0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             multiport dports http,https ctstate ESTABLISHED

Chain DOCKER-USER (1 references)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 RETURN     all  --  any    any     anywhere             anywhere            

sudo iptables-save

# Generated by iptables-save v1.6.1 on Sun Mar  3 05:57:34 2019
*nat
:PREROUTING ACCEPT [286:14463]
:INPUT ACCEPT [29:1704]
:OUTPUT ACCEPT [273:16843]
:POSTROUTING ACCEPT [273:16843]
:DOCKER - [0:0]
COMMIT
# Completed on Sun Mar  3 05:57:34 2019
# Generated by iptables-save v1.6.1 on Sun Mar  3 05:57:34 2019
*filter
:INPUT DROP [23:1878]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [43:3082]
:DOCKER-USER - [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A FORWARD -j DOCKER-USER
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT
-A DOCKER-USER -j RETURN
COMMIT
# Completed on Sun Mar  3 05:57:34 2019
# Generated by iptables-save v1.6.1 on Sun Mar  3 05:57:34 2019
*mangle
:PREROUTING ACCEPT [3829:1086443]
:INPUT ACCEPT [3617:1077407]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [3380:702245]
:POSTROUTING ACCEPT [3380:702245]
COMMIT
# Completed on Sun Mar  3 05:57:34 2019

Я отключил докер сервис при запуске и отключил его, изменяя iptables (но он все еще вставляет DOCKER-USER).

Почему я все еще могу использовать telnet для портов 21 и 5222?

2
задан 3 March 2019 в 07:58
2 ответа

Как указано на веб-сайте докера:

Если вам нужно добавить правила, которые загружаются до правил Docker, добавьте их в цепочку DOCKER-USER. Эти правила загружаются до того, как какие-либо правила, которые Docker создает автоматически.

По умолчанию, всем внешним исходным IP-адресам разрешено подключаться к демону Docker.

Таким образом, эти правила, которые вы написали, должны быть добавлены в цепочку DOCKER-USER, а не INPUT так как INPUT будет фильтровать трафик, идущий на хост, а не на docker dameon

1
ответ дан 3 December 2019 в 12:30

Согласно вашим правилам iptables, вы не можете установить сеанс на порт 21, кроме как с вашего локального хоста.

О ваших правилах FORWARD:

  • у вас есть только один, который переходит к DOCKER-USER.
  • DOCKER-USER ничего не делает, а затем возвращается к FORWARD.
  • FORWARD по умолчанию политика DROP.

Вы можете начать видеть, прослушивает ли какой-то процесс порт 21:

ss -antp | grep :21

Затем вы можете попытаться контролировать прохождение пакета по правилам:

watch iptables -L -n -v

А затем попробуйте еще раз и посмотрите, увеличивается ли один из счетчиков пакетов правил, если вы снова выполняете телнетинг. В соответствии с вашим набором правил, вы должны увеличивать политику DROP по умолчанию INPUT:

Chain INPUT (policy DROP 23 packets, 1878 bytes)

Если другое правило соответствует, не могли бы вы нам сообщить?

Если ни то, ни другое, несколько глупых вопросов:

  • Вы уверены, что попали в цель сервер?
  • Можете ли вы разрешить DNS с вашего хоста с помощью dig или nslookup и посмотреть, совпадает ли он с ip a на вашем сервере?
0
ответ дан 3 December 2019 в 12:30

Теги

Похожие вопросы