Как использовать UDP дырокол для SSH-туннеля / сеанса


21

Я хочу использовать Raspberry Pi в своем коттедже на выходных. Raspberry Pi предназначен для регистрации температур и отправки их на удаленный сервер с фиксированным ip, который сохраняет данные и отображает их на простом веб-сайте.

Однако может возникнуть ситуация, когда я хочу что-то изменить на Raspberry Pi. Например, обновления системы или изменения в программе, которая отправляет данные на сервер или что-то еще.

С предложенной настройкой я не смог бы подключиться к Raspberry Pi за пределами его локальной сети.

ПРИМЕЧАНИЕ. Я не хочу менять сеть, и у существующего маршрутизатора нет возможности переадресации портов, dynDNS или VPN.

Я недавно перечитал UDP дырокол. Основная идея заключается в том, что клиент отправляет пакет UDP на известный адрес сервера (т. Е. С включенным общедоступным IP-адресом или dynDNS). Клиент B, который хочет подключиться к клиенту A, запрашивает у сервера общедоступный IP-адрес и номер порта клиента A.

Затем он может подключиться к клиенту A напрямую по общедоступному IP-адресу и порту, который является динамическим. Поскольку клиент A сначала подключается к серверу на используемом в настоящее время порту, NAT будет пересылать пакеты клиенту A.

Надеюсь, я правильно изложил идею, более или менее…

Все это звучит хорошо, но проблема в том, что это не гарантируется для работы с TCP-соединением, так как маршрутизатор может «понимать» рукопожатие TCP-соединения и, если оно не создано правильно, оно не будет пересылать пакеты.

Итак, как я могу открыть SSH-сессию от клиента B к клиенту A без клиента A, сидящего за маршрутизатором с dynDNS, с фиксированным общедоступным IP-адресом или возможностью переадресации портов? Использование центрального сервера с общедоступным, фиксированным IP-адресом или доменным именем было бы жестким.


У вас есть интернет-устройство, способное пробивать дыры в UDP, но не TCP? Получите лучшее устройство NAT.
cpt_fink

Я не сделал ssh с udp, но вот ссылка на него zarb.org/~gc/html/udp-in-ssh-tunneling.html
barlop

Я не знаю, но я спросил гуру ssh, они сказали, что ssh может пересылать udp, но только если он работает как vpn, и есть переключатель для него, он сказал, что -wон сказал udp через tcp (возможно, тем, что он включает в себя любую попытку переадресации udp с помощью ssh), включает такие проблемы, как высокая задержка и повторную передачу того, что вам больше не нужно. Я думаю, это все еще интересно попробовать. Я вижу этот vpn через ssh и -w, упомянутый здесь также wiki.archlinux.org/index.php/VPN_over_SSH
barlop

Мне интересно, почему вы не хотите открывать входящий порт? - это не похоже на сценарий, который требует сверхвысокой безопасности ... В качестве альтернативы вы могли бы заставить клиента A поддерживать исходящее SSH-соединение с обратной связью порта с сервером, к которому у клиента B есть доступ. Таким образом, вы можете подключиться через сервер-посредник. Однако такого рода механизмы подвержены сбоям и поэтому довольно нежелательны, учитывая ограниченный физический доступ, чтобы разобраться, когда что-то пойдет не так.
Кабадиша

Ответы:


8

pwnat


«... нетривиально инициировать соединение с пэром за NAT ».

«... почти все реализации NAT отказываются перенаправлять входящий трафик , который не соответствует недавнему совпадающему исходящему запросу ».


«... pwnatИнструмент представляет собой автономную реализацию GNU / Linux только для автономного обхода NAT. После обращения к серверу за NAT он устанавливает канал с семантикой TCP с использованием пакетов UDP. Он поддерживает как клиента, так и сервер за NAT (если один из NAT позволяет передавать ложные [пользовательские] сообщения ICMP ). Эта реализация предназначена для конечных пользователей. "


  
использование: ./pwnat <-s | -c> <аргументы>

  -c режим клиента
    <args>: [local ip] <локальный порт> <прокси-хост> [прокси-порт (по умолчанию: 2222)] <удаленный хост> <удаленный порт>

  -сервисный режим
    <args>: [локальный ip] [порт прокси (def: 2222)] [[разрешенный хост]: [разрешенный порт] ...]

  -6 использовать IPv6  
  -v показать выходные данные отладки (до 2)  
  -h показать помощь и выйти  

Примеры:  

    Сторона сервера, позволяющая кому-либо прокси:
      ./pwnat -s

    Клиент хочет подключиться к google.com:80:
      ./pwnat -c 8000 <pwnat.server.com> google.com 80
    Затем перейдите на http: // localhost: 8000, чтобы посетить Google!  


pwnat;  диаграмма потока сигналов сети


«Ключевая идея для включения сервера , чтобы узнать IP - адрес клиента является для сервера , чтобы периодически отправлять сообщение для фиксированного, известного IP - адреса. Простейший подход использует ICMP эхо - запросы на незанятый IP - адрес, такие как 1.2.3.4 . Поскольку 1.2.3.4 не выделен, запрос ICMP не будет маршрутизироваться маршрутизаторами без маршрута по умолчанию. "

«В результате сообщений, отправленных на 1.2.3.4, NAT включит маршрутизацию ответов в ответ на этот запрос. Затем подключающийся клиент подделает такой ответ. В частности, клиент передаст сообщение ICMP, указывающее TTL_EXPIRED. сообщение может законно быть передан любой интернет - маршрутизатор и адрес отправителя не ожидается , чтобы соответствовать целевой IP сервера. "

« Сервер прослушивает (фальшивые) ответы ICMP и при получении инициирует подключение к IP-адресу отправителя, указанному в ответе ICMP. Если клиент использует глобально маршрутизируемый IP-адрес, это совершенно не проблема, и можно использовать как TCP, так и UDP. установить двунаправленную связь , если клиент прослушивает на заранее согласованный порт. "

«(В тех случаях, когда нет заранее согласованного порта, номер порта в большинстве случаев может быть сообщен как часть полезной нагрузки ICMP ECHO RESPONSE)».


Источник: http://samy.pl/pwnat.pdf
https://github.com/samyk/pwnat


pwnat едва функционирует даже для локального подключения к локальному. Я могу отправлять и получать некоторые пакеты, но для установления надежных соединений это не очень полезно.
Скотт

@ Scott Ну, это интересный хак, но на самом деле это просто доказательство концепции, основанной на неправильном использовании и злоупотреблении сетевыми протоколами, такими как ICMP. Я бы на это не рассчитывал. Он старый и не поддерживается, и я бы не рекомендовал его использовать. Я бы даже не упомянул об этом, если бы этот вопрос конкретно не предусматривал пробивание UDP-дырок. Если вы хотите надежного, подключите VPN-туннель.
голоса

Я не жалуюсь, но думаю, что «это решение не для использования в производственной среде» - полезная информация для тех, кто приезжает сюда в поисках потенциально стабильного решения.
Скотт

@ Scott Это не так, не для использования в такой-то среде. Во многих запатентованных продуктах используются эти методы. В любом случае, здесь достаточно информации, чтобы люди могли принимать собственные решения. Я не рекомендую это. Но я использую VPN-туннели. С другой стороны, некоторые сети фильтруют трафик VPN, поэтому вам приходится принимать меры в каждом конкретном случае. Вам нужна помощь, чтобы пройти через маршрутизатор NAT?
голоса

У меня есть работоспособное в настоящее время решение, использующее обратные туннели ssh для соединения двух машин с NAT. Однако для этого требуется машина-посредник, которая имеет статический IP-адрес или для которой я могу настроить переадресацию портов на маршрутизаторе. Это позволило бы мне вырезать этого посредника. Ну что ж.
Скотт

1

Вот пара решений:

Вы можете настроить Raspberry Pi для подключения обратно к серверу OpenVPN, и у вас будет к нему доступ постоянно.

Вы можете взглянуть на PageKite. Проверьте https://pagekite.net/wiki/Howto/SshOverPageKite/


Какое это имеет отношение к «пробиванию отверстий UDP» ?
голоса

0

Это несколько грязное, но простое решение, но как насчет использования netcat? На Raspberry Pi вы можете создать скрипт, который повторяет команду:

nc <public_ip> <port1> | sh | nc <public_ip> <port2>  

На вашем локальном хосте выполните:

nc -l <port1>

И:

nc -l <port2>  

Вы сможете набрать команду в первом случае и увидеть ответ во втором.


Какое это имеет отношение к «пробиванию отверстий UDP» ?
голоса

как проходит этот NAT?
ZEE
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.