Как проверить, что сервер OpenVPN прослушивает удаленный порт без использования клиента OpenVPN?

39

Мне нужно проверить, что сервер OpenVPN (UDP) работает и доступен на заданном порту host :.

У меня только обычный компьютер под управлением Windows XP без клиента OpenVPN (и нет возможности его установить) и не требуется никаких ключей для подключения к серверу - в моем распоряжении только стандартные инструменты командной строки WinXP, браузер и PuTTY.

Если бы я тестировал что-то вроде сервера SMTP или POP3, я бы использовал telnet и посмотрел, отвечает ли он, но как это сделать с OpenVPN (UDP)?

Иван
источник
если openvpn работает через tcp, вы также можете использовать telnet
rvs
OpenVPN работает через UDP
Иван,
2
Можете ли вы объяснить, почему вы хотите решить эту проблему из устаревшей системы Windows, а не из реальной системы мониторинга?
Алекс Холст
2
Если сервер UDP openvpn использует (рекомендуемый) tls-authпараметр конфигурации, то это НЕВОЗМОЖНО (если у вас нет хотя бы внешнего ключа оболочки)! Любой пакет с неверной подписью HMAC будет отброшен сервером без ответа.
Алекс Стрэджи

Ответы:

51

Вот оболочка однострочная:

echo -e "\x38\x01\x00\x00\x00\x00\x00\x00\x00" | 
   timeout 10 nc -u openvpnserver.com 1194 | cat -v

если на другом конце есть openvpn, вывод будет

@$M-^HM--LdM-t|M-^X^@^@^@^@^@@$M-^HM--LdM-t|M-^X^@^@^@^@^@@$M-^HM--LdM-t|M-^X...

в противном случае он будет отключен и отключится через 10 секунд или отобразит что-то другое.

ПРИМЕЧАНИЕ: это работает, только если tls-authопция конфигурации не активна, в противном случае сервер отклоняет сообщения с неверным HMAC.

Лоик Дачари
источник
2
Я получаю что-то немного другое, но я получаю что-то. Спасибо.
artfulrobot
7
Просто чтобы заявить очевидное, это для Linux / Unix, а не для Windows. И это требует netcat (не установлен по умолчанию в некоторых дистрибутивах). Кроме того, если в вашем дистрибутиве Linux нет команды «timeout», просто используйте параметр netcat «-w», например, «nc -w 10 -u openvpnserver.com 1194».
М.В.
1
Это потрясающе.
Дмурати
2
Это не будет работать в сценарии OP, если сервер использует tls-authопцию config для отбрасывания пакетов с неправильным сигнатурой HMAC.
Алекс Стрэги
2
Я считаю, что конвейеризация, od -x -N 14а не cat -vгораздо полезнее, потому что вы можете: а) видеть реальный двоичный контент, а не мусор в ASCII, и б) мгновенно получать каждую строку вывода, когда сервер отправляет каждый пакет квитирования и сразу останавливает его после первого. -N 14потому что пакет рукопожатия имеет длину 14 байтов и просто повторяется.
BaseZen
5

Извините, если я немного опоздал с ответом;)
Отправьте пакет udp со следующим содержимым:
$ 38 $ 01 $ 00 $ 00 $ 00 $ 00 $ 00 $ 00 $ 00
Сервер должен что-то ответить.
Вы можете подделать пакеты udp с помощью python:

import socket
senddata= "\x38\x01\x00\x00\x00\x00\x00\x00\x00"

def checkserver(ip,port):
   print('Checking %s:%s' %(ip,port)) 
   sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
   sock.settimeout(5) # in seconds
   sock.connect((ip, port))
   print("Sending request...")
   sock.send(senddata)
   try:
      dta=sock.recv(100)
      print("Server reply: %s" %(dta))
   except:
      print("Server not responding")
   sock.close()
   print("###########################################################")

def main():
   checkserver("addr.of.server1",1194)
   checkserver("addr.of.server2",1195)

if __name__ == "__main__":
   main()
болтун
источник
1
Как говорит ответ Лоика, это не работает tls-auth.
tedder42
1
Для Python 3 строка 10 вызовет проблему. Замените «sock.send (senddata)» на «sock.send (senddata.encode ())», и это будет работать.
NDB
2

Вы можете попробовать запустить следующее в CLI

#netstat -ltnup

Это должно перечислить все процессы, которые слушают на вашем сервере / системе. Grep для номера порта, который вы хотите

#netstat -ltnup | grep 1194
Мистер ИТ Гуру
источник
У ОП есть только инструменты для Windows XP.
user9517 поддерживает GoFundMonica
1
@Iain: у OP была PuTTY, поэтому возможно подключение к серверу SSH. В этом случае эта очень простая проверка является полезным первым шагом.
mivk
2

Для тех, кто сталкивается с этим, кто пытается контролировать сервер, который tls-authвключил, вы можете использовать скрипт Python здесь: https://github.com/liquidat/nagios-icinga-openvpn

Вывод отформатирован для использования в Nagios или Icinga, но он может быть запущен кем угодно / кем угодно, если у вас есть python и файл ключей tls.

Например, если вы используете в SHA256качестве дайджеста, вы бы использовали что-то вроде:

python check-openvpn.py -p 1194 --tls-auth ta.key --digest SHA256 vpn-server.example.com

Примечание: вам может потребоваться добавить в --tls-auth-inverseзависимости от значения сервера key-direction.

Серен
источник
0

Если вы можете получить pcap действительного взаимодействия клиента OpenVPN с сервером OpenVPN, вы можете смоделировать начальный набор пакетов с помощью чего-то вроде netcat, как предложено TiZon.

По сути, вам нужно достаточно действительного первого пакета, чтобы сервер ответил хотя бы сообщением об ошибке, поэтому он не должен быть идеальным, достаточно хорошим.

Я попытался зайти на http://pcapr.net , но я не увидел там пример OpenVPN. Возможно, если кто-то еще заявляет, что служба работает, вы можете попросить этого другого человека получить пакет транзакций.

pcapademic
источник
-5

если у вас есть настройка openvpn на прослушивание TCP, то это так же просто, как

telnet vpnserver 1194

при условии, что 1194 - это порт, который вы слушаете

это должно дать вам какой-то ответ, чтобы показать, что сервер openvpn прослушивает

anthonysomerset
источник
Вы уверены на 100%? Когда я делаю это, после некоторого ожидания я получаю сообщение «Не удалось открыть соединение с хостом на порту 1194: сбой подключения». Разве клиент не должен сначала что-то сказать, прежде чем сервер OpenVPN ответит?
Иван
6
Обратите внимание, что по умолчанию OpenVPN предназначен только для UDP, а telnet предназначен для использования TCP.
Иван