Я пытаюсь открыть только порт 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?
Как указано на веб-сайте докера:
Если вам нужно добавить правила, которые загружаются до правил Docker, добавьте их в цепочку DOCKER-USER. Эти правила загружаются до того, как Docker создаст какие-либо правила автоматически.
По умолчанию всем внешним исходным IP-адресам разрешено подключаться к демону Docker.
Таким образом, эти правила, которые вы написали, должны быть добавлены в цепочку DOCKER-USER, а не INPUT, поскольку INPUT будет фильтровать трафик, идущий на хост, а не на docker dameon
Согласно вашим правилам iptables, вы не можете установить сеанс на порт 21, кроме как с вашего локального хоста.
О ваших правилах FORWARD:
Вы можете начать видеть, прослушивает ли какой-то процесс порт 21:
ss -antp | grep :21
Затем вы можете попытаться отслеживать прохождение пакета по правилам:
watch iptables -L -n -v
А затем попробуйте еще раз и посмотрите, увеличивается ли один из счетчиков пакетов правила, если вы снова подключитесь через Telnet. Согласно вашему набору правил, вы должны увеличивать политику INPUT по умолчанию DROP:
Chain INPUT (policy DROP 23 packets, 1878 bytes)
Если подходит другое правило, не могли бы вы нам сообщить?
Если нет, то несколько глупых вопросов:
dig
или nslookup
и посмотрите, совпадает ли он с ip a
на вашем сервере?