Bagaimana cara terhubung ke mesin linux yang mengubah IP secara teratur?

12

Masalah saya adalah menemukan cara untuk SSH ke server Linux (Ubuntu 18.04) yang alamat IP-nya berubah setiap hari.

Saya memiliki klien yang saya sesekali membantu tugas admin. Saya perlu ssh ke mesin ketika mereka membutuhkan bantuan, tetapi mereka tidak memiliki IP statis, sehingga IP publik server terus berubah. Saya membuat skrip kecil untuk melaporkan alamat IP mesin Linux, dan menemukan bahwa itu berubah sekali per hari sekitar tengah hari.

Saya dapat mengatur SSH, dan berfungsi baik secara lokal maupun jarak jauh ... sampai alamat IP berubah. Setelah itu terjadi, saya tidak lagi dapat terhubung dari jarak jauh bahkan menggunakan alamat IP baru.

  • Apakah saya perlu memulai kembali layanan SSH setiap kali alamat IP berubah?
  • Jika demikian, mengapa?
  • Apakah ada tindakan lain yang perlu saya ambil ketika alamat IP berubah untuk memungkinkan akses SSH?

MEMPERBARUI

Agar jelas, masalah saya BUKAN menemukan alamat IP baru. Saya sudah punya skrip untuk melakukannya. Masalahnya adalah server berhenti merespons setelah perubahan IP, meskipun saya mencoba menghubungkan menggunakan alamat IP baru.

Jika saya memulai kembali layanan SSH pada mesin target, saya memiliki akses jarak jauh lagi. Tetapi saya tidak mengerti mengapa saya harus melakukan ini. Saya ingin tahu akar penyebabnya dengan harapan menemukan solusi yang lebih baik.

Kebanyakan orang tampaknya berpikir SSH harus bekerja selama kita tahu IP baru, jadi apakah ini sesuatu yang unik untuk 18,04? Saya menginstal server ini untuk klien baru-baru ini, jadi semua pengaturan konfigurasi masih default. (The tidak akan tahu bagaimana mengubahnya.)

Richard
sumber
8
Gunakan dns dinamis .
Ipor Sircer
12
Berteriaklah pada ISP mereka. Mengubah alamat IP sekali sehari tidak masuk akal untuk koneksi bisnis, dan itu bahkan relatif belum pernah terjadi untuk koneksi perumahan.
Michael Hampton
2
Anda mengatakan akses ssh berhenti bekerja ketika alamat IP berubah. Tetapi Anda belum mengatakan kapan mulai bekerja lagi. Saya menganggap itu entah bagaimana harus mulai bekerja lagi, jika tidak, Anda tidak dapat melihatnya berhenti bekerja setiap hari. Dan tidak ada yang harus Anda lakukan ketika alamat IP berubah. Server ssh akan segera dapat dijangkau pada alamat IP baru.
kasperd
1
Mungkin ada keanehan yang terjadi seperti DDNS berjalan, dan sesuatu seperti ListenAddress <dynamic host name>di file konfigurasi sshd, mungkin karena seseorang tidak ingin pengguna internal dapat ssh ke server. Ini sebenarnya membutuhkan restart server ssh setiap kali IP berubah.
Guntram Blohm mendukung Monica
1
@MichaelHampton: Berteriak mungkin tidak akan membantu, membayar kemauan. Dengan kelangkaan alamat IPv4 saat ini, sebagian besar penyedia mengenakan biaya tambahan untuk alamat IPv4 statis (beberapa bahkan mengenakan biaya tambahan untuk alamat IP publik non-statis, jika tidak Anda mendapatkan Dual Stack Lite ). Tentu saja, jika OP ada di IPv6, segalanya berubah ...
sleske

Jawaban:

21

Jawaban lain tampaknya mengabaikan satu hal dalam pertanyaan Anda:

Setelah itu terjadi, saya tidak lagi dapat terhubung dari jarak jauh bahkan menggunakan alamat IP baru

DDNS akan membantu Anda menemukan alamat IP baru, tetapi itu tampaknya tidak menjadi masalah di sini.

Sayangnya, server yang mendapatkan IP baru seharusnya tidak menjadi masalah dalam pengaturan standar di mana ISP menyediakan router, server memiliki alamat internal di belakang router, dan router melakukan port forwarding. Anda mungkin perlu memberikan informasi lebih lanjut tentang topologi jaringan untuk mendapatkan jawaban yang baik.

Apa yang bisa saya bayangkan adalah server tidak berada di belakang router dan melakukan koneksi PPPoE sendiri, dan a) server ssh mengikat ke alamat antarmuka spesifik pada titik server restart, b) firewall pada mesin yang memungkinkan masuk ssh untuk hanya IP server dengan firewall yang tidak diperbarui ketika IP berubah.

Untuk memeriksa kasus pertama, lakukan a netstat -nta | grep -w 22 | grep LISTEN. Jika dikatakan 0.0.0.0:22, tidak apa-apa; jika daftar IP tertentu, lalu periksa file konfigurasi sshd ( /etc/sshd.conf) untuk ListenAddress.

Untuk memeriksa kasus kedua, lakukan iptables -L -ndan periksa apakah salah satu aturan dalam INCOMINGrantai cocok dengan IP dan port 22 server Anda.

Jika salah satu dari ini memiliki alamat server saat ini, Anda harus mengubahnya ke 0.0.0.0 (pastikan Anda tahu tentang implikasi keamanan), atau perbarui aturan / konfigurasi setiap kali IP berubah.

Edit

Karena server berada di belakang router, ide-ide di atas mungkin tidak berlaku (*). Dalam pengaturan ini, router memiliki IP eksternal (yang berubah setiap hari), dan perangkat internal Anda harus memiliki beberapa alamat 10.xyz atau 192.168.xy yang seharusnya tidak berubah. Anda terhubung ke alamat eksternal, dan router harus aturan penerusan port ke alamat internal.

Port forwarding ini seharusnya tidak rusak ketika IP eksternal berubah (koneksi ssh yang ada akan dihapus namun), tapi mungkin itu aturan yang tidak diatur oleh Anda, tetapi oleh beberapa sihir UPNP, dengan router menjatuhkan UPNP ke depan saat mendapat alamat baru, dan sshd hanya menjalankan aturan ketika restart. Apakah Anda mengatur port forwarder di dalam router sendiri.

Atau, itu adalah IP internal server yang berubah - dalam hal ini, ada sesuatu yang sangat rusak dengan DHCP Anda. Berikan server Anda alamat internal yang tetap.

Atau, apakah Anda menggunakan IPV6? Ada beberapa konfigurasi di mana perangkat terus mengubah IP-nya untuk membuatnya lebih mudah dilacak. Lihat, misalnya, https://www.internetsociety.org/blog/2014/12/ipv6-privacy-addresses-provide-protection-against-surveillance-and-tracking/ - tetapi dalam kasus itu, malu Anda karena tidak menyebutkannya di posting asli Anda. Ini mungkin berarti router Anda tidak melakukan NAT sama sekali, dan ide asli saya masih berlaku bahkan di belakang router.

Guntram Blohm mendukung Monica
sumber
2
+1 untuk menjadi jawaban pertama yang benar-benar menjawab apa yang ditanyakan dalam pertanyaan.
kasperd
@Guntram Blohm Terima kasih atas jawabannya! Server berada di belakang router. Apakah dua kemungkinan ini masih berlaku dalam skenario itu? Jika demikian, saya akan memeriksa keduanya di hari berikutnya atau lebih ketika saya dapat mengakses mesin target secara lokal.
Richard
11

Dynamic DNS adalah satu opsi, yang lain memiliki server mail atau mengirimkan IP kepada Anda. Panggilan HTTP sederhana akan dilakukan (ke titik akhir yang Anda kontrol dan masuk permintaan).

Memecahkan seluruh jaringan publik dengan cara sebaliknya juga dimungkinkan; Anda bisa meminta server memasang tunnel terbalik, atau koneksi VPN, yang tidak akan terpengaruh oleh perubahan IP.

Mengenai layanan yang tidak merespons pada alamat baru: ini sepenuhnya tergantung pada pengaturan jaringan Anda. Sebagai contoh: WAN IP pada antarmuka internal melalui DHCP dan server SSH diatur untuk hanya mendengarkan IP pada antarmuka Anda yang dikenal saat startup akan berarti sshd harus dihidupkan ulang pada perubahan antarmuka.

John Keates
sumber
1
Seperti dijelaskan dalam pertanyaan, sudah ada solusi untuk menemukan alamat IP baru. Dengan demikian menambahkan DNS dinamis tidak akan benar-benar menyelesaikan masalah. Masalahnya seperti yang dijelaskan adalah bahwa server ssh berhenti merespons ketika alamat IP berubah. Anda belum mengatasi masalah itu. Koneksi VPN dan terowongan terbalik diharapkan OTOH berhenti bekerja ketika IP berubah, jadi Anda perlu sesuatu untuk memulai kembali secara otomatis.
kasperd
7

Anda harus benar-benar melihat ke layanan dns. Sejauh bisa terhubung ke mesin tertentu dengan alamat ip dinamis; ddns adalah solusi yang paling umum digunakan.

buka https://noip.com dan daftar untuk akun (ini, errr ... seharusnya..coff..cof .. Gratis untuk 1-3 mesin yang berjalan di jaringan yang sama (jika saya tidak salah, jangan kutip, jangan kutip) saya di sini: sudah lama sejak saya percaya salah satu dari layanan 'gratis' ini ...). Ada juga alternatif lain seperti DNS Takut ( https://freedns.afraid.org/ Dan bahkan, Cisco's, Open DNS: juga dapat digunakan (asalkan ini bukan Anda hanya klien, saya sarankan Anda mendaftar untuk uji coba akun payung, ambil putaran dan kemudian daftar untuk yang sebenarnya berurusan >>> mereka bahkan mendapat salah satu dari mereka ekstensi yang dapat diunduh seperti GUI yang secara otomatis akan memperbarui hostname ddns setiap kali klien Anda berubah. Ini benar-benar, cara cerdas yang paling tidak mengerti teknologi yang saya ketahui [hanya di jika Anda harus memanggil salah satu klien Anda dan meminta saya untuk mengunduh GUI ...])

dotbiggie
sumber
3
Meskipun ini tentu membantu untuk mengakses host pada perubahan alamat IP, bukan itu pertanyaannya. Pertanyaannya adalah mengapa server ssh berhenti merespons ketika alamat IP berubah dan bagaimana cara memperbaikinya. Layanan DNS dinamis tidak membahasnya.
kasperd
4

Saya dapat mengatur SSH, dan berfungsi baik secara lokal maupun jarak jauh ... sampai alamat IP berubah. Setelah itu terjadi, saya tidak lagi dapat terhubung dari jarak jauh bahkan menggunakan alamat IP baru.

Terkadang, perlu beberapa saat agar perubahan DHCP berlaku. Cobalah untuk mendaur ulang klien DHCP pada mesin target

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

Tidak. Anda hanya perlu mendaur ulang layanan ssh Anda ketika konfigurasi berubah ( /etc/ssh/sshd_conf).

Apakah ada tindakan lain yang perlu saya ambil ketika alamat IP berubah untuk memungkinkan akses SSH?

Tidak.

Saya punya solusi yang mengasumsikan Anda telah mengatur sendmail di mesin target Anda.

Skrip ini mengirimkan email yang menunjukkan alamat IP yang menurut dunia kami miliki (Terima kasih ipify.org). Email akan selalu memiliki alamat IP terbaru.

  1. Buat skrip bash dhcp-notify (tanpa ekstensi .sh)
  2. Masukkan skrip /etc/dhcp/dhclient-exit-hooks.d

    #!/bin/sh
    case "$reason" in (BOUND|RENEW|REBIND|REBOOT)
    (
       echo To: [email protected]
       echo From: [email protected]
       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
    

Jika ini tidak berhasil, Anda selalu dapat mengatur cron untuk mengirimi Anda alamat IP saat ini (kehilangan pernyataan kasus).

#!/bin/sh
(
   echo To: [email protected]
   echo From: [email protected]
   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
sumber
Saya baru saja akan menyarankan ini, itu ide yang bagus, dan hal pertama yang terlintas dalam pikiran ketika saya membaca pertanyaan. Juga, jika Anda mengalami masalah dengan api.ipify.org (diblokir di jaringan sekolah saya untuk beberapa alasan), Anda dapat menggunakan situs lain ini yang saya buat beberapa bulan sebelumnya yang melakukan hal yang sama: findip.win
undo
@karlchilders Terima kasih atas jawabannya! Saya sudah memiliki skrip cron yang melaporkan alamat ip kepada saya, tetapi saya tidak tahu tentang kait dhclient. Itu mengagumkan! Saya lebih suka hanya melaporkan IP ketika itu benar-benar berubah. Pertanyaan: Jika skrip ini dapat bekerja dan melaporkan alamat IP, mengapa daur ulang dhclient berpengaruh pada akses SSH?
Richard
@karlchilders Atau apakah skrip ini hanya berfungsi bila Anda mendaur ulang dhclient secara manual?
Richard
dhclient -r; dhclient akan memperbarui sewa dhcp sehingga host Anda terkini. Pengait akan bekerja kapan saja saat acara dhcp terjadi secara manual atau sebaliknya.
karlchilders
@Richard Tandai salah satu jawaban sebagai jawaban yang disukai. Terima kasih.
karlchilders
3

Berpikir di luar kotak - dapatkah Anda mengatur alamat IPv6 yang tetap? Biasanya hanya alamat IPv4 yang perlu diubah, karena kelangkaannya.

MSalters
sumber
Alamat IP yang saya tarik sebenarnya adalah IPv6 setiap saat.
Richard
1
@ Richard: Maaf mendengarnya tidak bekerja untuk Anda. Saya akan meninggalkan jawabannya untuk orang lain yang memiliki masalah dengan IPv4 ini.
MSalters
@ Richard Anda harus benar-benar menyebutkan dalam pertanyaan Anda bahwa Anda berurusan dengan IPv6. Ini membuat masalahnya sangat berbeda.
Dubu
1
@ Dubu Itu memang membuat masalahnya berbeda. Masalah semacam ini tidak seharusnya terjadi pada IPv6, yang mungkin mengapa semua orang mengira itu IPv4. Tetapi sebenarnya Anda bisa mendapatkan beberapa gejala yang dijelaskan jika Anda keliru menggunakan alamat privasi daripada alamat statis. Jika misalnya Anda bertanya pada situs web apa alamat IP Anda, itu akan menunjukkan alamat privasi Anda dan bukan alamat statis Anda. Dan menggunakannya untuk koneksi ssh bukanlah ide yang baik. Masih tidak menjelaskan mengapa itu tidak berfungsi sampai server ssh telah dimulai kembali.
kasperd
1
@ Dubu: Itu pendekatan yang agak tidak standar. DHCPv6-PD (Delegasi Awalan) dalam kombinasi dengan DHCP Unique ID's (DUID) harus mencegahnya.
MSalters
1

Apa yang telah saya lakukan selama hampir setahun. Saya mengalami masalah Anda pada bulan Januari tahun ini saat memberikan pidato di universitas lokal saya.

Script ini telah berjalan di komputer saya sejak saat itu: // Cukup jelas

import smtplib
from requests import get
import time

user = '[email protected]'
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 harus bekerja dengan sempurna. Mungkin bukan solusi terbaik di luar sana, tetapi berhasil.

Anda akan mendapatkan email di Kotak Masuk Anda setiap kali IP publik mesin berubah.

Sekarang, mengenai pertanyaan Anda:

Apakah saya perlu memulai ulang layanan setiap kali alamat IP berubah? Jika dengan me-restart layanan yang Anda maksud membangun kembali koneksi ssh, ya.

Jika demikian, mengapa? Karena jika alamat yang Anda coba komunikasikan tidak lagi menyediakan layanan yang Anda cari. Ini bukan mesinmu lagi.

Apakah ada tindakan lain yang perlu saya ambil ketika alamat IP berubah untuk memungkinkan akses SSH? Hanya SSH ke alamat baru.

Bersulang! JSR

Jaime Satorres Rey
sumber
Terima kasih atas jawabannya @ JSR! Saya sebenarnya telah menulis skrip serupa untuk melaporkan alamat IP kepada saya. Tapi begitu itu berubah, bahkan mengetahui alamat IP baru, saya tidak dapat SSH ke mesin remote. Sudahkah Anda mengalami masalah itu?
Richard
Apakah Anda yakin Anda mengambil alamat yang benar? jika demikian, coba lakukan ping setelah Anda mendapatkan IP. Saya belum pernah melihat masalah itu sebelumnya Juga, kalau-kalau Anda tidak tahu, Anda dapat menjalankan skrip di latar belakang dengan "python3 scriptname.py &" Juga, periksa port penerusan router, saya menganggap IP lokal tidak bisa berubah, tapi tetap saja patut dicoba.
Jaime Satorres Rey
Ya, IPnya benar. Jika saya memulai kembali layanan SSH pada mesin target, saya dapat terhubung lagi. Tetapi saya tidak mengerti mengapa itu harus terjadi.
Richard
@Richard masalahnya di sini adalah karena IP Anda berubah, host Anda menghentikan setiap koneksi karena RSA Key yang Anda gunakan untuk mengautentikasi tidak cocok dengan yang diminta. Saya sama sekali tidak ahli dalam topik ini, jadi jangan anggap kata-kata saya sebagai fakta ... Tapi situasi Anda seperti itu MUNGKIN karena apa yang baru saja saya katakan.
Jaime Satorres Rey
1

Ada baiknya melihat ini dari sisi yang berbeda: biasanya, jauh lebih mudah untuk membuat koneksi keluar dari mesin yang membutuhkan perhatian Anda (DNS, NAT dan pengaturan firewall lainnya tidak masalah sama sekali atau jauh lebih sederhana).

Anda bisa menggunakan ini untuk membuat solusi anti peluru dan sederhana untuk masuk ke mesin jarak jauh R. Satu-satunya persyaratan adalah Anda dapat memberikan sshakses publik ke salah satu mesin lokal Anda sendiri (sebut saja S). Kemudian lanjutkan sebagai berikut:

  1. Buat sshkoneksi keluar dari Rke S, buat terowongan terbalik kembali keR :

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

  2. Aktif S, gunakan terowongan terbalik untuk sshmasuk ke mesin jarak jauh R:

    ssh -p 22000 127.0.0.1

Langkah 1 dapat dipicu secara manual dan sesuai permintaan oleh sisi jarak jauh kapan pun bantuan Anda diperlukan. Atau, Anda dapat membuat layanan Ryang akan terus mempertahankan terowongan terbalik tersebut S.

Saya menggunakan pengaturan seperti itu untuk masuk ke sistem (mobile) jarak jauh yang berada di belakang firewall / NAT dan yang tidak memiliki entri DNS sama sekali.

Alex O
sumber
1

Jika Anda hanya perlu login jarak jauh, gunakan mosh . Selain mampu mengatasi perubahan IP dengan sangat baik (dengan hampir tidak ada latensi selama sakelar), ia juga memiliki keunggulan lain dibandingkan dataran ssh, seperti gema prediksi lokal, latensi rendah, cara pemulihan yang lebih cepat dari tautan yang rusak.

Jika Anda secara khusus membutuhkan ssh(katakanlah, Anda memerlukan penerusan X11 atau sesuatu), saya sarankan untuk menyiapkan VPN (misalnya OpenVPN), lebih disukai daripada UDP, dengan keepalive singkat. Koneksi TCP (yaitu ssh Anda) melalui VPN akan pulih dan tetap terhubung setelah perubahan IP, itu hanya akan memakan waktu lebih lama (hingga satu menit atau lebih), tetapi Anda dapat bermain dengan /proc/sys/net/ipv4/tcp_*entri untuk membuatnya lebih dapat diterima.

Edit:

  • mosh perlu sshotentikasi, tetapi setelah dikonfirmasi, koneksi tetap sampai Anda keluar (atau reboot), dan Anda dapat menyelidiki kegagalan sshsesuka hati (mis. strace -f -p pid_of_sshd )
  • dimungkinkan untuk digunakan moshtanpa ssh, jawab diadaptasi dari sini :

Di server dijalankan:

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

Anda mendapatkan hasil seperti QzdRHbAWzL7eRobi75DCrz

Pada klien dijalankan:

MOSH_KEY=QzdRHbAWzL7eRobi75DCrz mosh-client $serverip $radomport

Catatan yang $serveripharus ip, tidak ada resolusi nama host.

Bagaimana Anda mendapatkan kunci dari satu sisi ke sisi yang lain terserah Anda. Saya sarankan mengenkripsi dengan kunci yang dibagikan sebelumnya dan pesan instan, mengirim surat, atau membuat pengguna lokal mendiktekannya melalui panggilan telepon.

  • jika benar-benar ada masalah dengan ssh, instal inetddan jalankan ssh dari sana, bukan sebagai daemon mandiri, misalnya dengan baris konfigurasi ini untuk inetd.conf "klasik", ini akan menjalankan daemon baru setiap kali Anda masuk (perhatikan bahwa tidak semua garpu inetd menangani ipv6):

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

Radovan Garabík
sumber
1
Terima kasih atas jawabannya @Radovan! Mosh terlihat menarik, tetapi sepertinya menggunakan SSH untuk otentikasi. Jadi akar masalah saya masih ada, benar? Beri tahu saya jika saya salah mengerti dokumen.
Richard
@ Richard Ya, namun ada kemungkinan ... Saya telah mengedit jawaban saya.
Radovan Garabík