Я пытаюсь проверить, может ли пара наших серверов обмениваться данными через определенные порты перед переносом на них некоторых наших служб, и что они не заблокированы списками контроля доступа брандмауэра нашей организации.
Имеет смысл
[mrduki@mybox1~]$ nc -ul 40000
---
[mrduki@mybox2~]$ nc -zvuw2 mybox1.com 40000
Connection to mybox1.com 40000 port [udp/*] succeeded!
Не имеет смысла
[mrduki@mybox1~]$ nc -ul 40000
[mrduki@mybox1~]$ ^C
---
[mrduki@mybox2~]$ nc -zvuw2 mybox1.com 40000
Connection to mybox1.com 40000 port [udp/*] succeeded!
Фактически, если я провожу сканирование портов из 40000-40100
, каждый порт будет успешным.
Если я провожу те же тесты без -u
(чтобы он проверял TCP вместо UDP), я получаю 40000 (tcp) timed out: Operation now in progress
error, как я и ожидал (поскольку у меня нет такой службы TCP, которая прослушивает 40000
).
Выполнение sudo netstat -alnp | grep LISTEN
на mybox1
, хотя не показывает, что такие службы прослушивают эти порты. Так что мне не хватает?
nc
может быть не самым лучшим инструментом для тестирования состояния порта. Вы пробовали nmap
? На самом деле это сканер портов. Я проверил файловый сервер в моей домашней сети и 127.0.0.1, оба сообщили, что UDP порт 40000
закрыт.
nmap
# nmap -sU -p 40000 igor
Starting Nmap 7.01 ( https://nmap.org ) at 2016-08-18 18:27 EDT
Nmap scan report for igor (192.168.1.125)
Host is up (0.00027s latency).
rDNS record for 192.168.1.125: igor.swass
PORT STATE SERVICE
40000/udp closed unknown
MAC Address: 68:05:CA:3A:BF:B7 (Intel Corporate)
Nmap done: 1 IP address (1 host up) scanned in 0.53 seconds
Kernel + /dev
Для этого также можно использовать ядро. Но nmap
наверное лучше.
# timeout 3 cat < /dev/udp/example.com/40000
Когда я пытался nc
на том же сервере (igor) я получал те же результаты, что и Вы. Но я вернулся, чтобы попробовать еще раз, и теперь он не возвращает ни одного вывода (ни одного успешного сообщения), а wireshark показывает "Destination unreachable", отправляемого обратно по ICMP. Я ничего из этого не понимаю. Но я бы переключился на другой метод проверки состояния UDP-порта.
UDP - протокол "без соединения". Если вы посылаете пакет и не получаете отказ (по ICMP), то он считается успешным. Это не зависит от того, ответит ли кто-нибудь. Невозможность получения на удаленном конце может рассматриваться как проблема с высоким уровнем сцепления, например, DNS, но это не сбой в том, что касается UDP.
Контрастируйте это с TCP, который имеет статус. Сбой при получении ответа (ACK) считается сбоем внутри TCP (обычно он отображается как "отфильтрованный"), так же как и отрицательные ответы (RST, который отображается как закрытый).
UDP: open|filtered закрыт. TCP: открыть закрытый фильтр
Ни один блок брандмауэра не остановит успешную попытку UDP-соединения, поскольку соединение с UDP не подразумевает отправку чего-либо или прослушивание ответов. Функционально UDP-соединение - это то же самое, что и отправка до момента фактической отправки данных, то есть:
Заметьте, что ничто из этого не мешает работе брандмауэра и не посылается по проводам.