Моя проблема заключается в том, чтобы найти способ подключения по 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-адрес.
Поместите сценарий в /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
). Затем действуйте следующим образом:
Создать наружу ssh
связь от R
к S
, создание обратного туннеля обратно в R
:
ssh -L 22:<address-of-S>:22000
На 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