У меня есть Raspberry Pi (RPi), и я делаю удаленные подключения к нему с помощью ssh. Мне удалось правильно настроить ssh, чтобы я мог получить доступ к RPi как из локальной сети, так и из Интернета (используя определенный порт, который я открыл на своем маршрутизаторе).
Предполагая имя пользователя john
и RPi с именем raspi
:
Доступ к локальной сети
ssh john@192.168.2.7
ssh john@raspi
ssh raspi
Внешний доступ к локальной сети
ssh -p 1234 john@12.345.67.89
ssh -p 1234 12.345.67.89
Но как я могу просто сделать это ssh raspi
за пределами моей локальной сети? Есть ли способ настроить raspi, чтобы он указывал на два IP-адреса, один в локальной сети, а другой через интернет?
Что я в основном хочу, так это получить доступ к своему RPi в одиночку, независимо от того, нахожусь ли я дома или на работе.
ssh
ip
openssh
port-forwarding
Aeronaelius
источник
источник
Ответы:
Если присмотреться к вашему вопросу, кажется, вы используете один и тот же компьютер как внутри, так и за пределами локальной сети. Я изменил свой ответ соответственно:
В вашем
~/.ssh/config
, добавьте:Затем вы можете
ssh raspi-wan
извне ЛВС илиssh raspi-lan
изнутри ЛВС, не обращаясь к DNS-серверам и не редактируя/etc/hosts
для всех пользователей, и даже не делая никаких действий в качестве пользователя root. Если вы хотите, чтобы имяraspi
разрешалось по-разному, в зависимости от того, где вы находитесь, это, вероятно, потребует некоторой магии сценариев оболочки для обнаружения вашей сети и принятия соответствующих мер.источник
-wan
и-lan
постфикс. Мой SSH, однако, не понравилсяUsername
поле (плохой вариант конфигурации). Без него работает нормально.User john
, нетUserName
. Я исправляю свой ответ, чтобы отразить это, и как только вы таким образом настроили свой конфиг, вы можете опустить имя пользователя изssh
командной строки.Это вполне выполнимо только с помощью конфигурации ssh, без необходимости использовать отдельные псевдонимы для lan и wan или создания дополнительных портов для переадресации. (Но вам, естественно, нужен какой-то способ определить, находитесь ли вы внутри локальной сети или нет)
В
~/.ssh/config
, вы хотите добавить что-то вроде этого:Вместо этого
am_i_outside_of_my_lan
вы захотите разместить команду, которая определяет, находитесь ли вы в своей домашней сети или нет, и возвращает с 0 кодом выхода, если вы находитесь за ее пределами, и что-то еще в противном случае.host
Условие, вероятно , само за себя, ноexec
состояние требует некоторого объяснения: Это соответствует только тогда , когда данная команда возвращается с кодом выхода 0, то есть. Нет ошибки.Другими словами, эта
host raspi
часть ограничивает это правило, когда вы пытаетесь подключиться к хосту raspi, иexec "am_i_outside_my_lan"
еще больше ограничивает его, чтобы оно применялось только при подключении извне вашей домашней сети. Таким образом, внутри вашей домашней сетиssh user@raspi
происходит именно то, что обычно, но вне этого правила совпадают, и вместо этого это эквивалентноssh -p 1234 user@12.345.67.89
.Что касается того, что использовать вместо этого
am_i_outside_of_my_lan
, это полностью зависит от вашей настройки. Я предлагаю размещать команды в отдельном скрипте вместо того, чтобы пытаться писать их в строке, потому что цитата кажется немного трудной для понимания.Лично я использовал следующий скрипт на Python, чтобы определить, нахожусь ли я в своей собственной сети: (Поскольку мое доменное имя преобразуется в локальный ip внутри моей собственной сети)
Если у вас нет аналогичной настройки, возможно, вам придется заняться чем-то другим. (Например, вы можете посмотреть имя беспроводной сети, к которой вы подключены, или даже запросить какой-нибудь сервис what-is-my-ip, чтобы получить внешний ip сети, к которой вы подключены)
источник
На вашем компьютере (замыкающийся ИНГ один), вы можете установить имя хоста
12.345.67.89
. Откройте свой/etc/hosts
файл и установите запись DNS:Ваша машина преобразует «raspi» в «12.345.67.89» как часть процесса локального разрешения DNS. Если вы используете несколько машин, изменения должны быть сделаны на каждом из них. Проблема в том, что для редактирования требуется доступ с правами суперпользователя
/etc/hosts
, и он может быть не везде.Если вы хотите, чтобы «распи» автоматически распознавался из любого места, то извините: невозможно. Это потребует регистрации «raspi» в качестве доменного имени, что не может произойти, поскольку «raspi» не имеет TLD и не зависит от корневого сервера DNS. Тем не менее, вы можете зарегистрировать доменное имя (скажем
cfbaptista.me
, и указать его на свой IP-адрес в глобальной сети. С некоторой переадресацией портов вы сможете получить доступ к вашему Raspberry Pi с помощью:(тем не менее, это тратит деньги почти даром ...)
Что касается
user@
части, это зависит от вашего логина на разных машинах. Если у вас есть такое же имя на соединительном машине и на пульте один, то нет необходимости указывать. Если нет, вам нужно указать, кто вы на удаленной машине.источник
Цель:
ssh raspi
должна работать внутри локальной сети и в общедоступном Интернете.Для этого необходимо убедиться, что имя соответствует внутреннему IP-адресу локальной сети и общедоступному IP-адресу извне.
Во-первых, вы должны получить доменное имя, например
raspi.yourdomain.com
. Посетите http://freedns.afraid.org/ для бесплатных доменов для хобби. Укажите домен на ваш публичный IPДля локальной сети я рекомендую запустить DNSMasq. Открытая прошивка DD-WRT тесно интегрируется с DNSMasq, используя ее для DHCP и DNS. Вам просто нужно указать свой поисковый домен («yourdomain.com»), и он будет автоматически назначать DNS-имена на основе запрошенного имени каждого клиента. Чтобы это работало, нужно прочитать / raspi / etc / hostname
raspi
.После этого raspi.yourdomain.com должен разрешить локальный IP-адрес в вашей локальной сети (просто убедитесь, что вы используете локальный DNS на всех своих машинах).
Теперь вы, вероятно, не хотите открывать порт 22 общедоступному Интернету, потому что вы получите тонну перехвата трафика. Таким образом, ваш маршрутизатор может отображать raspi: 22 как некоторый другой порт, скажем, 1234. Чтобы использовать один и тот же порт как в общедоступных, так и во внутренних сетях, вы можете добавить правило перенаправления портов в raspi. В Linux:
(измените eth0 на имя вашего сетевого интерфейса, как показано
ip link
илиifconfig
, и 1234 на ваш публичный порт)Теперь вы можете
ssh -p 1234 raspi.yourdomain.com
как из публичной сети, так и из локальной сети.Вы можете добавить запись в ~ / .ssh / config на своем клиентском компьютере, чтобы сократить это до всего
ssh raspi
, как упомянуто @DopeGhoti.Если вы хотите выставить SSH-порты дополнительных машин на одном и том же общедоступном IP-адресе, просто повторите процесс с другим DNS-именем и публичным портом. Ура!
источник
Вот краткая, рабочая версия ответа Алекси Торхамо, использующая curl, чтобы получить ваш текущий публичный ip, а затем проверить, соответствует ли он общедоступному ip вашего сервера (то есть вы находитесь в той же локальной сети).
В вашем
~/.ssh/config
добавленииисточник
ssh
что все соответствующие директивы будут обрабатываться по порядку, поэтому в теории вы должны быть в состоянии сделать что-то вроде «Match host raspi / User john / HostName 192.168.2.7
после»Match host raspi exec "[[ $(curl -s ipinfo.io/ip) != '12.345.67.89' ]]" / HostName 12.345.67.89 / Port 1234
и получить тот же эффект только с однимcurl
вызовом, позволяя== '12.345.67.89'
прецеденту быть принятым из-за сбоя второгоMatch
правилаexec
.Match
, либо совпадает, либо также указан во втором - если вы указали нестандартныйPort xxxx
в первомMatch
и хотите использовать стандартный порт во второмMatch
, вам придется явно переопределить его обратно,Port 22
чтобы он не продолжал использовать портxxxx
.)Предполагая, что ваш компьютер имеет IP 192.168.1. * При подключении к локальной сети, вы можете добиться этого с помощью следующей конфигурации,
~/.ssh/config
чтобы вы всегда могли использовать одну и ту же команду (простоssh raspi
) для подключения:источник
Это решение предполагает, что в вашей домашней сети есть один маршрутизатор, который, как я считаю, является распространенным случаем.
Добавьте к вашему
~/.ssh/config
источник