ICMP: ошибка порта недоступна, даже если порт открыт

Я тестирую свой сервер Debian с некоторым сканированием портов Nmap. Мой Debian – это виртуальная машина, работающая на мостовом соединении.

Сканирование классического порта с использованием запроса TCP SYN отлично работает и обнаруживает порт 80 как открытый (что является правильным):

nmap -p 80 192.168.1.166 Starting Nmap 6.47 ( http://nmap.org ) at 2016-02-10 21:36 CET Nmap scan report for 192.168.1.166 Host is up (0.00014s latency). PORT STATE SERVICE 80/tcp open http MAC Address: xx:xx:xx:xx:xx:xx (Cadmus Computer Systems) Nmap done: 1 IP address (1 host up) scanned in 0.51 seconds 

Но при запуске сканирования портов UDP он терпит неудачу, и мой сервер Debian отвечает с ошибкой ICMP: Port unreachable :

 nmap -sU -p 80 192.168.1.166 Starting Nmap 6.47 ( http://nmap.org ) at 2016-02-10 21:39 CET Nmap scan report for 192.168.1.166 Host is up (0.00030s latency). PORT STATE SERVICE 80/udp closed http MAC Address: xx:xx:xx:xx:xx:xx (Cadmus Computer Systems) Nmap done: 1 IP address (1 host up) scanned in 0.52 seconds 

Запись Wireshark:

запись проводов


Как это возможно? Мой порт 80 открыт, как получилось, что Debian отвечает с ошибкой ICMP: Port unreachable ? Это проблема безопасности?

Хотя TCP и UDP являются частью TCP / IP, оба относятся к тем же уровням TCP / IP или OSI, и оба являются слоем выше IP, это разные протоколы.

http://www.cyberciti.biz/faq/key-differences-between-tcp-and-udp-protocols/

Протокол управления передачей (TCP) и протокол пользовательских дейтаграмм (UDP) являются двумя основными протоколами пакета Internet Protocol. Как TCP, так и UDP работают на транспортном уровне модели TCP / IP, и оба имеют очень различное использование. TCP – это протокол, ориентированный на соединение. UDP – протокол без установления соединения.

tcp ip model http://www.ml-ip.com/assets/images/tcpip-layers.gif

Некоторые службы действительно отвечают на TCP и UDP-порты одновременно, как и в случае служб DNS и NTP, однако это не обязательно относится к веб-серверам, которые обычно отвечают по умолчанию только на порт 80 / TCP (и делают не работать / слушать вообще в UDP)

Вы можете перечислить свои прослушивающие порты UDP в системе Linux с помощью:

 $sudo netstat -anlpu Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name udp 0 0 0.0.0.0:1900 0.0.0.0:* 15760/minidlnad udp 0 0 0.0.0.0:5000 0.0.0.0:* 32138/asterisk udp 0 0 0.0.0.0:4500 0.0.0.0:* 1592/charon udp 0 0 0.0.0.0:4520 0.0.0.0:* 32138/asterisk udp 0 0 0.0.0.0:5060 0.0.0.0:* 32138/asterisk udp 0 0 0.0.0.0:4569 0.0.0.0:* 32138/asterisk udp 0 0 0.0.0.0:500 0.0.0.0:* 1592/charon udp 0 0 192.168.201.1:53 0.0.0.0:* 30868/named udp 0 0 127.0.0.1:53 0.0.0.0:* 30868/named udp 0 0 0.0.0.0:67 0.0.0.0:* 2055/dhcpd udp 0 0 0.0.0.0:14403 0.0.0.0:* 1041/dhclient udp 17920 0 0.0.0.0:68 0.0.0.0:* 1592/charon udp 0 0 0.0.0.0:68 0.0.0.0:* 1041/dhclient udp 0 0 0.0.0.0:56417 0.0.0.0:* 2055/dhcpd udp 0 0 192.168.201.1:123 0.0.0.0:* 1859/ntpd udp 0 0 127.0.0.1:123 0.0.0.0:* 1859/ntpd udp 0 0 192.168.201.255:137 0.0.0.0:* 1777/nmbd udp 0 0 192.168.201.1:137 0.0.0.0:* 1777/nmbd udp 0 0 0.0.0.0:137 0.0.0.0:* 1777/nmbd udp 0 0 192.168.201.255:138 0.0.0.0:* 1777/nmbd udp 0 0 192.168.201.1:138 0.0.0.0:* 1777/nmbd udp 0 0 0.0.0.0:138 0.0.0.0:* 1777/nmbd udp 0 0 192.168.201.1:17566 0.0.0.0:* 15760/minidlnad 

И ваши прослушивающие TCP-порты с помощью команды:

 $sudo netstat -anlpt Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:5060 0.0.0.0:* LISTEN 32138/asterisk tcp 0 0 192.168.201.1:8200 0.0.0.0:* LISTEN 15760/minidlnad tcp 0 0 192.168.201.1:139 0.0.0.0:* LISTEN 2092/smbd tcp 0 0 0.0.0.0:2000 0.0.0.0:* LISTEN 32138/asterisk tcp 0 0 192.168.201.1:80 0.0.0.0:* LISTEN 7781/nginx tcp 0 0 192.168.201.1:53 0.0.0.0:* LISTEN 30868/named tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 30868/named tcp 0 0 192.168.201.1:22 0.0.0.0:* LISTEN 2023/sshd tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN 1919/perl tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 30868/named tcp 0 0 192.168.201.1:445 0.0.0.0:* LISTEN 2092/smbd tcp 0 224 192.168.201.1:22 192.168.201.12:56820 ESTABLISHED 16523/sshd: rui [pr 

Теперь, как правило, NMAP отправляет SYN на проверяемый порт и по протоколу TCP, если демон или служба привязана к порту, он будет отвечать с помощью SYN + ACK, а nmap покажет его как открытый.

Согласование соединения TCP / IP: трехстороннее рукопожатие

Чтобы установить соединение, TCP использует трехстороннее рукопожатие. Прежде чем клиент попытается подключиться к серверу, сервер должен сначала подключиться и прослушать порт, чтобы открыть его для соединений: это называется пассивным открытием. Как только пассивное открытие установлено, клиент может инициировать активное открытие. Чтобы установить соединение, происходит трехстороннее (или трехступенчатое) рукопожатие:

SYN: активное открытие выполняется клиентом, отправляющим SYN на сервер. Клиент устанавливает порядковый номер сегмента на случайное значение A. SYN-ACK: В ответ сервер отвечает SYN-ACK.

3-стороннее рукопожатие

Однако, если служба не работает там, TCP / IP определяет, что ядро ​​отправит сообщение ICMP с сообщением «Недоступное для порта» для служб UDP и сообщениями TCP RST для служб TCP.

ICMP Destination недоступен

Недоступная цель генерируется хостом или входящим шлюзом [3], чтобы сообщить клиенту, что назначение по какой-либо причине недоступно. Сообщение «Недоступное место назначения» может быть сгенерировано в результате TCP, UDP или другой передачи ICMP. Недоступные TCP-порты, в частности, реагируют на TCP RST, а не на тип недоступного типа 3, как и следовало ожидать.

Таким образом, ваша проверка UDP на порт 80 / UDP просто получает сообщение ICMP unreachable, потому что нет службы, которая слушает эту комбинацию или протокол / порт.

Что касается соображений безопасности, эти недопустимые сообщения ICMP-назначения, безусловно, могут быть заблокированы, если вы определяете правила брандмауэра / iptables, которые DROP все сообщения по умолчанию и разрешают только в портах, которые ваша машина обслуживает снаружи. Таким образом, nmap-сканирование всех открытых портов, особенно в сети, будет медленнее, а серверы будут использовать меньше ресурсов.

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

Пожалуйста, обратите внимание, что если вместо использования DROP в iptables вы используете правила REJECT, ядро ​​не будет игнорировать попытки проверки сканирования / TCP / IP и ответит сообщениями ICMP Destination недоступными, код 13: «Связь административно запрещена (административная фильтрация предотвращает пересылку пакета) ».

Блокировать все порты, кроме SSH / HTTP, в ipchains и iptables

Протоколы TCP / 80 и UDP / 80 – это два разных протокола (см. /etc/protocols ), которые просто имеют одинаковый номер порта. TCP / 80 открыт, и для UDP существует другое правило, которое генерирует ответ ICMP.