Як підключитися до машини Linux, яка регулярно змінює IP?


12

Моя проблема - знайти спосіб SSH на сервер Linux (Ubuntu 18.04), IP-адреса щодня змінюється.

У мене є клієнт, якому я час від часу допомагаю у виконанні завдань адміністратора. Мені потрібно запустити машину, коли їм потрібна допомога, але вони не мають статичного IP, тому загальнодоступний IP-сервер постійно змінюється. Я створив невеликий сценарій, щоб повідомити про IP-адресу Linux-машини, і виявив, що він змінюється один раз на день близько полудня.

Я можу налаштувати SSH, і він працює як локально, так і віддалено ... поки не зміниться IP-адреса. Як тільки це станеться, я більше не можу віддалено підключитися, навіть використовуючи нову IP-адресу.

  • Чи потрібно перезапускати службу SSH щоразу, коли IP-адреса змінюється?
  • Якщо так, то чому?
  • Чи потрібно здійснити якісь інші дії, коли зміниться IP-адреса, щоб дозволити доступ до SSH?

ОНОВЛЕННЯ

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

Якщо я перезавантажую службу SSH на цільовій машині, у мене знову є віддалений доступ. Але я не розумію, чому я повинен був це робити. Я хотів би знати першопричину в надії знайти краще рішення.

Більшість людей, здається, вважають, що SSH повинен працювати до тих пір, поки ми знаємо про новий IP, тож це щось унікальне для 18.04? Я встановив цей сервер для клієнта нещодавно, тому всі налаштування конфігурації все ще знаходяться за замовчуванням. (Не знаю, як це змінити.)


8
Використовуйте динамічні dns .
Іпор Сірсер

12
Кричите на їх провайдера. Зміна IP-адреси один раз на день є абсурдним для ділового зв’язку, і це навіть відносно нечувано для житлового зв'язку.
Майкл Хемптон

2
Ви кажете, що ssh-доступ перестає працювати, коли змінюється IP-адреса. Але ви ще не сказали, коли вона почне працювати знову. Я припускаю, що він повинен якось знову почати працювати, інакше ви не могли бачити, як він щодня перестає працювати. І ви нічого не повинні робити, коли змінюється IP-адреса. Сервер ssh буде негайно доступний за новою IP-адресою.
kasperd

1
Може статися якесь дивне явище, як, наприклад, працює DDNS, і щось подібне ListenAddress <dynamic host name>до файлу конфігурації sshd, можливо, тому, що хтось не хотів, щоб внутрішні користувачі мали змогу ssh на сервер. Це фактично вимагатиме перезавантаження ssh-сервера щоразу, коли IP-адреса змінюється.
Гунтрам Блом підтримує Моніку

1
@MichaelHampton: Кричати, мабуть, не допоможе, платити буде. При нинішньому дефіциті IPv4-адрес більшість постачальників платять додатково за статичну IPv4-адресу (деякі навіть платять додатково за нестатичну загальнодоступну IP-адресу, інакше ви отримуєте Dual Stack Lite ). Звичайно, якщо OP на IPv6, все зміниться ...
sleske

Відповіді:


21

Інші відповіді, здається, не помітили одного питання у вашому запитанні:

Як тільки це станеться, я більше не можу віддалено підключитися, навіть використовуючи нову IP-адресу

DDNS допоможе вам дізнатися нову IP-адресу, але це, здається, не є проблемою тут.

На жаль, отримання сервера нового IP-адреси не повинно бути проблемою в стандартних налаштуваннях, коли провайдер надає маршрутизатор, сервер має внутрішню адресу за маршрутизатором, а маршрутизатор робить переадресацію порту. Можливо, вам потрібно буде надати більше інформації про мережеву топологію, щоб отримати хорошу відповідь.

Я можу собі уявити, що сервер не знаходиться за маршрутизатором і не здійснює власне з'єднання PPPoE; а ) прив'язка 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 за те, що є першою відповіддю на те, що насправді вирішило те, що було задано у запитанні.
kasperd

@Guntram Blohm Дякую за відповідь! Сервер знаходиться за маршрутизатором. Чи залишилися б ці дві можливості в цьому сценарії? Якщо це так, я перевірю їх обох наступного дня або близько того, коли я можу отримати доступ до місцевої машини.
Річард

11

Динамічний DNS є одним із варіантів, інший - надсилати пошту сервера або іншим чином надсилати вам IP-адресу. Здійснюється простий дзвінок HTTP (до кінцевої точки, яку ви контролюєте та записуєте в журнал).

Також можна вирішити всю громадську мережу навпаки; у вас може бути налаштовано сервер зворотного тунелю або з'єднання VPN, на яке не вплине зміна IP-адреси.

Щодо сервісів, які не відповідають на нову адресу: це повністю залежить від налаштування вашої мережі. Наприклад: WAN IP на внутрішньому інтерфейсі через DHCP і сервер SSH, встановлений для прослуховування IP на вашому інтерфейсі, відомий при запуску, означає, що sshd повинен бути перезапущений при зміні інтерфейсу.


1
Як описано в запитанні, вже є рішення для пошуку нової IP-адреси. Таким чином додавання динамічного DNS насправді не вирішить жодних проблем. Описана проблема полягає в тому, що ssh-сервер перестає відповідати, коли змінюється IP-адреса. Ви не вирішили цю проблему. Очікується, що з'єднання VPN та зворотні тунелі OTOH припинять свою роботу, коли зміниться IP-адреса, тому вам потрібно щось встановити, щоб автоматично їх перезапустити.
kasperd

7

Вам справді слід заглянути в послуги ddns. Що стосується віддаленої можливості підключення до певної машини з динамічною ip адресою; ddns - це найбільш часто використовуване рішення.

перейдіть на https://noip.com та підпишіться на акаунт (це, помилково ... нібито..кофф..коф .. Безкоштовно для 1-3 машин, що працюють у тій же мережі (якщо я не помиляюся, не цитуйте я тут: минув час, коли я довіряв будь-якій із цих "безкоштовних" послуг ...) Існують також інші альтернативи, такі як Afraid DNS ( https: //freedns.a strah.org/ І навіть, Cisco, Open DNS: також може бути використаний (за умови, що це не лише ви клієнт, я б запропонував вам зареєструватися для випробування зонтичного облікового запису, взяти його за спін і потім зареєструвати справжнє угода >>> вони навіть отримали одне з них, схоже на GUI-розширення, яке можна автоматично оновлювати ім'я ходу ddns кожного разу, коли ваші клієнти змінюють ip. Це насправді це найпростіший, нетехнологічний розумний спосіб, про який я знаю [просто в у випадку, якщо вам потрібно зателефонувати одному з клієнтів і попросити завантажити графічний інтерфейс, а не ....])


3
Хоча це, безумовно, корисно для доступу до хоста на зміні IP-адрес, про це не йдеться. Питання в тому, чому ssh-сервер перестає відповідати, коли змінюється IP-адреса і як це виправити. Динамічна служба DNS не вирішує цього питання.
kasperd

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. Створіть сценарій 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-адресу (втратити заяву справи).

#!/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

Я тільки збирався запропонувати це, це чудова ідея, і перше, що прийшло в голову, коли я читав питання. Крім того, якщо у вас виникли проблеми з api.ipify.org (він чомусь заблокований у моїй шкільній мережі), ви можете використовувати цей інший сайт, який я зробив кілька місяців раніше, який робить те саме: findip.win
скасувати

@karlchilders Дякую за відповідь! У мене вже є сценарій cron, який повідомляє мені IP-адресу, але я не мав уявлення про гачки dhclient. Це неймовірно! Я б набагато швидше повідомив про IP, коли він насправді змінюється. Запитання: Якщо цей скрипт може працювати і повідомляти IP-адресу, чому б переробка dhclient вплинула на доступ до SSH?
Річард

@karlchilders Або цей сценарій працює лише тоді, коли ви вручну переробляєте dhclient?
Річард

dhclient -r; dhclient продовжить оренду dhcp, щоб ваш хост був поточним. Гачки спрацюють у будь-який час, коли подія dhcp відбувається або вручну, або в інший спосіб.
karlchilders

@Richard Будь ласка, позначте одну з відповідей як кращу відповідь. Дякую.
karlchilders

3

Якщо ви не розмірковуєте над цим полем - чи могли б ви організувати фіксовану IPv6-адресу? Зазвичай це лише IPv4 адреси, які потрібно змінити через їх дефіцит.


IP-адресу, яку я знімаю, насправді щоразу IPv6.
Річард

1
@Richard: Вибачте, що це не працює для вас. Я залишу відповідь для інших людей, які мають цю проблему з IPv4.
MSalters

@Richard Ви дійсно повинні зазначити у своєму питанні, що ви маєте справу з IPv6. Це робить проблему зовсім іншою.
Дубу

1
@Dubu Це дійсно робить проблему різною. Така проблема просто не повинна траплятися на IPv6, і тому, можливо, всі припускали, що це IPv4. Але насправді ви можете отримати деякі з описаних симптомів, якщо помилково використовуєте адресу конфіденційності, а не статичну адресу. Якщо ви, наприклад, запитаєте веб-сайт, яка ваша IP-адреса, він відображатиме вашу адресу конфіденційності, а не статичну адресу. І використовувати це для ssh-з'єднань - це не дуже гарна ідея. Досі не пояснюється, чому він не працює, поки ssh-сервер не буде перезапущений.
kasperd

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 на цільовій машині, я можу знову підключитися. Але я не розумію, чому так має бути.
Річард

@ Richard тут полягає в тому, що після зміни вашої IP-адреси ваш хост припиняє будь-яке з'єднання, оскільки ключ RSA, який ви використовуєте для автентифікації, не збігається з тим, який він запитує. Я ні в якому разі не знаю цю тему, тому не сприймайте мої слова як факт ... Але ваша ситуація така, ПРОБАВНО, через те, що я щойно сказав.
Хайме Саторрес Рей

1

Варто переглянути це з іншого боку: зазвичай набагато простіше створити зовнішнє з'єднання з машини, яке вимагає вашої уваги (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.


1

Якщо вам просто потрібен віддалений вхід, використовуйте mosh . Окрім того, що здатний чудово впоратися зі змінами IP (майже не затримуючись під час комутації), він має й інші переваги перед звичайним ssh, як місцеве передбачуване відлуння, низька затримка, спосіб швидшого відновлення зі зламаних посилань.

Якщо вам спеціально потрібна ssh(скажімо, вам потрібна переадресація X11 чи щось таке), я пропоную встановити VPN (наприклад, OpenVPN), бажано над UDP, з коротким збереженням. 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


1
Дякую за відповідь @Radovan! Мош виглядає цікаво, але схоже, що він використовує SSH для аутентифікації. Отже, корінь моєї проблеми все-таки буде існувати, правда? Повідомте мене, чи я неправильно зрозумів документи.
Річард

@Richard Так, але є можливості ... Я відредагував свою відповідь.
Радован Гарабік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.