Назад | Перейти на главную страницу

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

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

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

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


ОБНОВИТЬ

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

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

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

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

Как только это произойдет, я больше не смогу подключаться удаленно, даже используя новый 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.x.y.z или 192.168.x.y, которые не должны меняться. Вы подключаетесь к внешнему адресу, и маршрутизатор должен установить правило перенаправления портов на внутренний адрес.

Эта переадресация портов не должна прерываться при изменении внешнего 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, и мои первоначальные идеи по-прежнему актуальны даже за маршрутизатором.

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

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

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

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

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

Я могу настроить 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. Создайте сценарий bash 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

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

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

С тех пор этот сценарий работает на моей машине: // В значительной степени не требует пояснений //

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

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

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

  1. Создать наружу ssh связь от R к 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.

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

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

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

  • требует мош ssh для аутентификации, но после аутентификации соединение остается до тех пор, пока вы не выйдете из системы (или не перезагрузитесь), и вы сможете исследовать сбой 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