Как подключиться к машине Linux, которая регулярно меняет IP?

12

Моя проблема заключается в поиске пути к SSH на сервер Linux (Ubuntu 18.04), чей IP-адрес меняется ежедневно.

У меня есть клиент, которому я иногда помогаю с задачами администратора. Мне нужно подключиться к машине по ssh, когда им нужна помощь, но у них нет статического IP-адреса, поэтому открытый IP-адрес сервера постоянно меняется. Я создал небольшой скрипт для сообщения об IP-адресе компьютера с Linux и обнаружил, что он меняется один раз в день около полудня.

Я могу настроить SSH, и он работает как локально, так и удаленно ... пока IP-адрес не изменится. Как только это произойдет, я больше не смогу подключиться удаленно, даже используя новый IP-адрес.

  • Нужно ли перезапускать службу SSH каждый раз, когда меняется IP-адрес?
  • Если так, то почему?
  • Есть ли какие-либо другие действия, которые мне нужно предпринять при изменении IP-адреса, чтобы разрешить доступ по SSH?

ОБНОВИТЬ

Чтобы было ясно, моя проблема не в том, чтобы найти новый IP-адрес. У меня уже есть скрипт для этого. Проблема в том, что сервер перестает отвечать на запросы после изменения IP-адреса, даже если я пытаюсь подключиться с использованием нового IP-адреса.

Если я перезапущу службу SSH на целевой машине, у меня снова будет удаленный доступ. Но я не понимаю, зачем мне это делать. Я хотел бы знать причину в надежде найти лучшее решение.

Кажется, что большинство людей думают, что SSH должен работать, пока мы знаем новый IP, так что это уникально для 18.04? Я недавно установил этот сервер для клиента, поэтому все настройки конфигурации по-прежнему остаются настройками по умолчанию. (Не знаю, как это изменить.)

Ричард
источник
8
Используйте динамический днс .
Ипор Сирсер
12
Кричи на своего провайдера. Изменение IP-адреса один раз в день абсурдно для делового соединения, и это даже относительно неслыханно для домашнего подключения.
Майкл Хэмптон
2
Вы говорите, что SSH доступ перестает работать при изменении IP-адреса. Но вы не сказали, когда он снова начнет работать. Я предполагаю, что это должно как-то снова начать работать, иначе вы не сможете перестать работать каждый день. И нет ничего, что вы должны делать, когда меняется IP-адрес. Сервер ssh будет немедленно доступен на новом IP-адресе.
Касперд
1
ListenAddress <dynamic host name>Может быть какая-то странность, связанная с работой DDNS, и что-то вроде конфигурационного файла sshd, возможно, из-за того, что кто-то не хочет, чтобы внутренние пользователи могли подключаться по ssh к серверу. Это фактически потребовало бы перезапуска сервера ssh каждый раз, когда изменяется IP.
Гунтрам Блом поддерживает Монику
1
@MichaelHampton: кричать, вероятно, не поможет, заплатив будет. При нынешнем дефиците адресов IPv4 большинство провайдеров взимают дополнительную плату за статический адрес IPv4 (некоторые даже взимают дополнительную плату за нестатический публичный IP-адрес, в противном случае вы получаете Dual Stack Lite ). Конечно, если OP на IPv6, все изменится ...
sleske

Ответы:

21

Другие ответы, кажется, упустили из виду одну вещь в вашем вопросе:

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

DDNS поможет вам узнать новый IP-адрес, но здесь проблема не в этом.

К сожалению, сервер, получающий новый IP-адрес, не должен быть проблемой при стандартной настройке, где провайдер предоставляет маршрутизатор, сервер имеет внутренний адрес за маршрутизатором, а маршрутизатор выполняет переадресацию портов. Возможно, вам потребуется предоставить больше информации о топологии сети, чтобы получить хороший ответ.

Я мог бы себе представить, что сервер не находится за маршрутизатором и не выполняет свое собственное PPPoE-соединение, и a) привязка сервера ssh к определенному адресу интерфейса в момент перезапуска сервера, b) брандмауэр на машине, который разрешает входящий ssh ​​для только IP-адрес сервера с брандмауэром не обновляется при изменении IP-адреса.

Чтобы проверить первый случай, сделайте netstat -nta | grep -w 22 | grep LISTEN. Если он говорит 0.0.0.0:22, это нормально; если в нем указан конкретный IP, то проверьте файл конфигурации sshd ( /etc/sshd.conf) ListenAddress.

Чтобы проверить второй случай, выполните iptables -L -nи проверьте, соответствует ли одно из правил в INCOMINGцепочке IP-адресу вашего сервера и порту 22.

Если один из них имеет текущий адрес сервера, вам нужно либо изменить его на 0.0.0.0 (убедитесь, что вы знаете о последствиях для безопасности), либо обновлять правило / конфигурацию при каждом изменении IP-адреса.

редактировать

Поскольку сервер находится за маршрутизатором, приведенные выше идеи, вероятно, не применимы (*). В этой настройке маршрутизатор имеет внешний IP-адрес (который меняется ежедневно), а ваши внутренние устройства должны иметь несколько адресов 10.xyz или 192.168.xy, которые не должны изменяться. Вы подключаетесь к внешнему адресу, и маршрутизатор должен использовать правило переадресации портов на внутренний адрес.

Эта переадресация портов не должна прерываться при изменении внешнего IP-адреса (однако существующие соединения ssh будут сброшены), но, возможно , это правило не было настроено вами, но каким-то волшебством UPNP, когда маршрутизатор сбрасывает UPNP-сообщения вперед при получении новый адрес, и sshd вызывает правило только при перезапуске. Вы сами настроили перенаправитель портов в роутере.

Или это внутренний IP-адрес сервера, который изменяется - в этом случае что-то сильно сломано вашим DHCP. Дайте вашему серверу фиксированный внутренний адрес.

Или вы используете IPV6? В некоторых конфигурациях устройство постоянно меняет свой IP-адрес, чтобы его было легче отслеживать. См., Например, https://www.internetsociety.org/blog/2014/12/ipv6-privacy-addresses-provide-protection-against-surveillance-and-tracking/ - но в этом случае вам не стыдно упоминая это в своем оригинальном посте. Это может означать, что ваш маршрутизатор вообще не выполняет NAT, и мои оригинальные идеи остаются в силе даже за маршрутизатором.

Гунтрам Блом поддерживает Монику
источник
2
+1 за то, что был первым ответом, чтобы фактически обратиться к тому, что было задано в вопросе.
Касперд
@Guntram Blohm Спасибо за ответ! Сервер находится за роутером. Будут ли эти две возможности сохраняться в этом сценарии? Если это так, я проверю их обоих на следующий день или около того, когда смогу локально получить доступ к целевой машине.
Ричард
11

Динамический DNS - это один из вариантов, другой - иметь почту сервера или иным образом отправлять вам свой IP. Можно сделать простой HTTP-вызов (до конечной точки, которой вы управляете, и регистрируете запросы).

Решение всей общедоступной сети также возможно и наоборот; Вы можете настроить сервер на обратный туннель или VPN-соединение, которое не будет зависеть от изменения IP-адреса.

Что касается служб, не отвечающих на новый адрес: это полностью зависит от настроек вашей сети. Например: WAN IP на внутреннем интерфейсе через DHCP и SSH-сервер, настроенный на прослушивание только IP-адреса вашего интерфейса, известного при запуске, означают, что sshd необходимо перезапустить при изменении интерфейса.

Джон Китс
источник
1
Как описано в вопросе, уже существует решение для поиска нового IP-адреса. Таким образом, добавление динамического DNS не решит никаких проблем. Проблема, как описано, заключается в том, что сервер ssh перестает отвечать при изменении IP-адреса. Вы не обратились к этой проблеме. Ожидается, что VPN-соединения и обратные туннели перестанут работать при изменении IP-адреса, поэтому вам нужно что-то для их автоматического перезапуска.
Касперд
7

Вы должны действительно посмотреть на сервисы ddns. Насколько удаленно можно подключиться к определенной машине с динамическим IP-адресом; DDDS является наиболее часто используемым решением.

зайдите на https://noip.com и зарегистрируйтесь для учетной записи (это, errr ... предположительно..coff..cof .. Бесплатно для 1-3 машин, работающих в одной сети (если я не ошибаюсь, не цитируйте меня здесь: это было давно, так как я доверял любому из этих «бесплатных» сервисов ...). Есть и другие альтернативы, такие как Afraid DNS ( https://freedns.afraid.org/ И даже, Cisco, Open DNS: также может быть использован (при условии, что это не единственный клиент, я бы посоветовал вам подписаться на пробную учетную запись, принять ее на раскрутку, а позже - на настоящую). сделка >>> у них даже есть одно из загружаемых расширений, похожих на GUI, которое будет автоматически обновлять имя хоста ddns при изменении ip ваших клиентов. Это действительно самый простой, не технически подкованный способ, который я знаю [только в на случай, если вам нужно позвонить одному из ваших клиентов и попросить меня загрузить графический интерфейс, скорее ....])

dotbiggie
источник
3
Хотя это, безусловно, полезно для доступа к хосту при смене IP-адресов, вопрос не в этом. Вопрос в том, почему сервер ssh перестает отвечать при изменении IP-адреса и как это исправить. Динамическая служба DNS не обращается к этому.
Касперд
4

Я могу настроить SSH, и он работает как локально, так и удаленно ... пока IP-адрес не изменится. Как только это произойдет, я больше не смогу подключиться удаленно, даже используя новый IP-адрес.

Иногда для того, чтобы изменения DHCP вступили в силу, требуется некоторое время. Попробуйте перезапустить DHCP-клиент на целевой машине

$> sudo dhclient -r
$> sudo dhclient
Do I need to restart the service every time the IP address changes?
If so, why?

Нет. Вам нужно перезапускать службу ssh только при изменении конфигурации ( /etc/ssh/sshd_conf).

Есть ли какие-либо другие действия, которые мне нужно предпринять при изменении IP-адреса, чтобы разрешить доступ по SSH?

Нет.

У меня есть решение, которое предполагает, что вы настроили sendmail на целевой машине.

Этот скрипт отправляет электронное письмо с указанием IP-адреса, который, по нашему мнению, мы имеем в мире (спасибо ipify.org). Электронная почта всегда будет иметь самый последний IP-адрес.

  1. Создать скрипт bh dhcp-notify (без расширения .sh)
  2. Поместите скрипт в /etc/dhcp/dhclient-exit-hooks.d

    #!/bin/sh
    case "$reason" in (BOUND|RENEW|REBIND|REBOOT)
    (
       echo To: me@my.email
       echo From: me@my.email
       echo "Content-Type: text/html; "
       echo Subject: DHCP reason: $reason
       echo
       echo Your IP address is: `curl -s https://api.ipify.org`
    ) | sendmail -t
    ;;
    esac
    

Если это не работает, вы всегда можете настроить cron для отправки вам текущего IP-адреса (потерять оператор case).

#!/bin/sh
(
   echo To: me@my.email
   echo From: me@my.email
   echo "Content-Type: text/html; "
   echo Subject: IP address change
   echo
   echo Your IP address is: `curl -s https://api.ipify.org`
) | sendmail -t
karlchilders
источник
Я как раз собирался это предложить, это отличная идея, и первое, что пришло в голову, когда я прочитал вопрос. Кроме того, если у вас возникли проблемы с api.ipify.org (по какой-то причине он заблокирован в моей школьной сети), вы можете воспользоваться другим сайтом, который я создал несколько месяцев назад и который делает то же самое: findip.win
undo
@karlchilders Спасибо за ответ! У меня уже есть скрипт cron, сообщающий мне ip-адрес, но я понятия не имел о хуках dhclient. Это замечательно! Я бы предпочел, чтобы IP сообщался только тогда, когда он действительно меняется. Вопрос: Если этот скрипт может работать и сообщать IP-адрес, почему переработка dhclient повлияет на доступ по SSH?
Ричард
@karlchilders Или этот сценарий работает только при ручной утилизации dhclient?
Ричард
dhclient -r; dhclient возобновит аренду dhcp, чтобы ваш хост был текущим. Хуки будут работать каждый раз, когда событие dhcp происходит вручную или иным образом.
karlchilders
@Richard Пожалуйста, отметьте один из ответов как предпочтительный ответ. Спасибо.
Карлчилдерс
3

Думая нестандартно - вы могли бы организовать фиксированный адрес IPv6? Обычно меняются только адреса IPv4 из-за их нехватки.

MSalters
источник
IP-адрес, который я опускаю, фактически является IPv6 каждый раз.
Ричард
1
@Richard: Жаль слышать, что это не работает для вас. Я оставлю ответ для других людей, которые имеют эту проблему с IPv4.
MSalters
@Richard В своем вопросе вы действительно должны упомянуть, что имеете дело с IPv6. Это делает проблему совершенно другой.
Дубу
1
@Dubu Это действительно делает проблему другой. Такого рода проблема просто не должна возникать на IPv6, поэтому, возможно, все считают, что это IPv4. Но на самом деле вы можете получить некоторые из описанных симптомов, если вы по ошибке используете адрес конфиденциальности, а не статический адрес. Например, если вы спросите веб-сайт, какой у вас IP-адрес, на нем будет показан ваш конфиденциальный адрес, а не статический адрес. И использовать это для соединений ssh ​​не очень хорошая идея. Все еще не объясняет, почему он не работает, пока сервер ssh не будет перезапущен.
Касперд
1
@Dubu: Это довольно нестандартный подход. DHCPv6-PD (делегирование префикса) в сочетании с уникальным идентификатором DHCP (DUID) должны предотвратить это.
MSalters
1

Чем я занимаюсь почти год. Я столкнулся с вашей проблемой в январе этого года, когда выступал в моем местном университете.

С тех пор этот скрипт выполнялся на моей машине: // Довольно очевидно, //

import smtplib
from requests import get
import time

user = 'exampleemail@gmail.com'
psd = 'examplepassword'
msg = 'Hey, your ip has changed! Use this one from now on: '
currip = '0.0.0.0' # It'll send an email the first time you execute this aswell
while True:
    newip = get('https://api.ipify.org').text
    if currip == newip:
        print("nonewip")
        #You can just comment the line above this one if you want to
    else:
        tmpmsg = "\n"+msg + newip +" The old one used to be: "+currip
        currip = newip
        server = smtplib.SMTP('smtp.gmail.com', 587)
        server.connect('smtp.gmail.com')
        server.ehlo()
        server.starttls()
        server.ehlo()
        server.login(user,psd)
        #You can change the second parameter, use ('from','to','message')
        server.sendmail(user, user, tmpmsg)

        server.quit()
        with open('/home/pi/DEV/iphistory.txt', 'a') as f:
            f.write('newip: '+currip+'\n')
            f.close()
        print('New IP Found: '+tmpmsg)
    time.sleep(7200)

Python 3.x должен работать без нареканий. Возможно, это не лучшее решение, но оно работает.

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

Теперь по поводу ваших вопросов:

Нужно ли перезапускать сервис каждый раз, когда меняется IP-адрес? Если при перезапуске службы вы имеете в виду восстановление соединения ssh, да.

Если так, то почему? Потому что, если адрес, с которым вы пытаетесь установить связь, больше не предоставляет нужную вам услугу. Это больше не твоя машина.

Есть ли какие-либо другие действия, которые мне нужно предпринять при изменении IP-адреса, чтобы разрешить доступ по SSH? Просто SSH на новый адрес.

Ура! JSR

Хайме Саторрес Рей
источник
Спасибо за ответ @JSR! Я на самом деле написал аналогичный сценарий, чтобы сообщить мне IP-адрес. Но как только он меняется, даже зная новый IP-адрес, я не могу подключиться по SSH к удаленной машине. Сталкивались ли вы с этой проблемой?
Ричард
Вы уверены, что получаете правильный адрес? если это так, попробуйте пинг на него, как только вы получите IP. Я никогда раньше не сталкивался с этой проблемой. Также, на случай, если вы не знали, вы можете запустить скрипт в фоновом режиме с помощью "python3 scriptname.py &". Также проверьте порты переадресации маршрутизатора, я полагаю, что локальный IP не не меняется, но все же стоит проверить.
Хайме Саторрес Рей
Да, IP правильный. Если я перезапущу службу SSH на целевой машине, я смогу подключиться снова. Но я не понимаю, почему так должно быть.
Ричард
@ Ричард: проблема в том, что, поскольку ваш IP-адрес меняется, ваш хост останавливает каждое соединение, так как ключ RSA, который вы используете для аутентификации, не совпадает с тем, который он запрашивает. Я ни в коем случае не эксперт по этой теме, так что не принимайте мои слова как факт ... Но ваша ситуация, похоже, такая ВЕРОЯТНАЯ из-за того, что я только что сказал.
Хайме Саторрес Рей
1

Стоит посмотреть на это с другой стороны: обычно гораздо проще создать внешнее соединение с компьютера, которое требует вашего внимания (DNS, NAT и другие настройки брандмауэра не имеют значения или намного проще).

Вы можете использовать это, чтобы создать пуленепробиваемое и простое решение для доступа к удаленной машине R. Единственное требование - вы можете предоставить публичный sshдоступ к одному из ваших локальных компьютеров (назовем его так S). Затем действуйте следующим образом:

  1. Создайте исходящее sshсоединение от Rto S, установив обратный туннель обратно вR :

    ssh -L 22:<address-of-S>:22000

  2. На S, использовать обратный туннель sshв удаленной машине R:

    ssh -p 22000 127.0.0.1

Шаг 1 может быть запущен вручную и по требованию удаленной стороной, когда вам потребуется помощь. В качестве альтернативы вы можете создать сервис, Rкоторый будет постоянно поддерживать такой обратный туннель S.

Я использовал такую ​​настройку для входа в удаленные (мобильные) системы, которые находились за брандмауэрами / NAT и у которых вообще не было записей DNS.

Алекс О
источник
1

Если вам просто нужен удаленный вход, используйте mosh . Помимо способности превосходно справляться с изменениями IP (практически без задержки во время переключения), у него есть и другие преимущества по сравнению с обычным ssh, например локальное прогнозирующее эхо, низкая задержка и намного более быстрое восстановление после неработающих каналов.

Если вам конкретно нужно ssh(скажем, вам нужна пересылка X11 или что-то в этом роде), я предлагаю настроить VPN (например, OpenVPN), предпочтительно через UDP, с короткой поддержкой активности. TCP-соединения (т.е. ваш ssh) через VPN заживают и остаются подключенными после смены IP, это займет больше времени (до минуты или около того), но вы можете поиграть с /proc/sys/net/ipv4/tcp_*записями, чтобы сделать его более приемлемым.

Редактировать:

  • sshДля проверки подлинности mosh требуется , но после проверки подлинности соединение остается до тех пор, пока вы не выйдете из системы (или не перезагрузите компьютер), и вы сможете расследовать сбой sshна досуге (например, strace -f -p pid_of_sshd )
  • можно использовать moshбез ssh, ответ адаптирован отсюда :

На сервере запускаем:

mosh-server new -p $randomport -- $shellprogram

вы получите результат, как QzdRHbAWzL7eRobi75DCrz

На клиенте запускаем:

MOSH_KEY=QzdRHbAWzL7eRobi75DCrz mosh-client $serverip $radomport

Обратите внимание, что $serveripдолжен быть IP, без разрешения имени хоста.

Как получить ключ с одной стороны на другую, решать только вам. Я бы посоветовал зашифровать с помощью предварительного ключа и обмена мгновенными сообщениями, рассылки или заставить локального пользователя диктовать его с помощью телефонного звонка.

  • если там действительно есть проблема ssh, установите inetdи запустите ssh, а не как отдельный демон, например, с помощью этой строки конфигурации для «классического» inetd.conf, он будет запускать новый демон каждый раз, когда вы входите в систему (обратите внимание, что не все Inetd обрабатывает вилки ipv6):

ssh stream tcp6 nowait root /usr/sbin/sshd sshd -i

Радован Гарабик
источник
1
Спасибо за ответ @Radovan! Mosh выглядит интересно, но похоже, что он использует SSH для аутентификации. Так что корень моей проблемы все еще существует, правильно? Дайте мне знать, если я неправильно понял документы.
Ричард
@Richard Да, однако есть возможности ... Я отредактировал свой ответ.
Радован Гарабик