Saya memiliki Raspberry Pi (RPi) dan saya membuat koneksi jarak jauh menggunakan ssh. Saya telah berhasil mengatur ssh dengan benar sehingga saya dapat mengakses RPi baik dari jaringan area lokal dan dari internet (menggunakan port tertentu yang saya buka pada router saya).
Dengan asumsi nama pengguna john
dan RPi bernama raspi
:
Di dalam akses LAN
ssh [email protected]
ssh john@raspi
ssh raspi
Akses LAN luar
ssh -p 1234 [email protected]
ssh -p 1234 12.345.67.89
Tetapi bagaimana saya bisa melakukannya ssh raspi
dari luar LAN saya? Apakah ada cara untuk mengkonfigurasi raspi untuk menunjuk ke dua alamat IP, satu di LAN dan satu di internet?
Apa yang saya inginkan pada dasarnya adalah mengakses RPi saya dalam satu cara, tidak peduli apakah saya di rumah atau di kantor.
ssh
ip
openssh
port-forwarding
Aeronaelius
sumber
sumber
Jawaban:
Melihat pertanyaan Anda lebih dekat, tampaknya Anda menggunakan komputer yang sama dari dalam dan luar LAN. Saya telah merevisi jawaban saya sesuai dengan itu:
Di Anda
~/.ssh/config
, tambahkan:Kemudian, Anda dapat
ssh raspi-wan
dari luar LAN, ataussh raspi-lan
dari dalam LAN tanpa perlu menggunakan server DNS atau mengedit/etc/hosts
untuk semua pengguna, atau bahkan perlu melakukan apa pun sebagai root. Jika Anda ingin namaraspi
untuk diselesaikan secara berbeda tergantung di mana Anda berada, itu mungkin akan memerlukan beberapa keajaiban skrip shell untuk mendeteksi jaringan Anda dan bertindak sesuai.sumber
-wan
dan-lan
postfix. Namun ssh saya tidak sukaUsername
bidang (opsi konfigurasi buruk). Ini bekerja dengan baik tanpa itu.User john
, bukanUserName
. Saya mengoreksi jawaban saya untuk mencerminkan ini, dan sekali Anda telah mengatur konfigurasi Anda, Anda dapat menghilangkan nama pengguna darissh
baris perintah.Ini bisa dilakukan hanya dengan ssh config, tanpa harus menggunakan alias terpisah untuk lan dan wan atau membuat port tambahan apa pun ke depan. (Tapi Anda secara alami membutuhkan beberapa cara untuk mendeteksi apakah Anda berada di dalam Lan Anda atau tidak)
Di
~/.ssh/config
, Anda ingin menambahkan sesuatu seperti ini:Di tempat
am_i_outside_of_my_lan
Anda akan ingin menempatkan perintah yang menentukan apakah Anda berada di dalam jaringan rumah Anda atau tidak, dan kembali dengan 0 kode keluar jika Anda berada di luarnya, dan yang lainnya sebaliknya.The
host
Kondisi ini mungkin cukup jelas, tetapiexec
kondisi waran beberapa penjelasan: Ini cocok hanya ketika perintah diberikan kembali dengan kode keluar 0, yaitu. tidak ada kesalahan.Jadi dengan kata lain, apa yang dilakukan adalah
host raspi
bagian membatasi aturan ini ketika Anda mencoba untuk terhubung ke raspi host, danexec "am_i_outside_my_lan"
selanjutnya membatasi sehingga hanya berlaku ketika Anda terhubung dari luar jaringan rumah Anda. Jadi di dalam jaringan rumah Andassh user@raspi
melakukan persis seperti biasanya, tetapi di luarnya aturannya cocok dan malah setarassh -p 1234 [email protected]
.Adapun apa yang akan digunakan
am_i_outside_of_my_lan
, itu tergantung sepenuhnya pada pengaturan Anda. Saya sarankan menempatkan perintah dalam skrip yang terpisah daripada mencoba untuk menulisnya inline, karena kutipannya agak sulit untuk dikerjakan dengan benar.Secara pribadi, saya menggunakan skrip Python berikut untuk mendeteksi apakah saya berada di dalam jaringan saya sendiri: (Karena nama domain saya diputuskan menjadi ip lokal di dalam jaringan saya sendiri)
Jika Anda tidak memiliki pengaturan serupa, Anda mungkin harus melakukan sesuatu yang lain. (Misalnya, Anda dapat melihat nama jaringan nirkabel yang terhubung dengan Anda, atau bahkan menanyakan layanan apa-apa-ip-saya untuk mendapatkan ip eksternal dari jaringan yang terhubung dengan Anda)
sumber
Pada komputer Anda (connect- ing satu), Anda dapat mengatur nama host untuk
12.345.67.89
. Buka/etc/hosts
file Anda , dan atur entri DNS:Mesin Anda kemudian akan mengubah "raspi" menjadi "12.345.67.89" sebagai bagian dari proses penyelesaian DNS lokal. Jika Anda menggunakan beberapa mesin, perubahan harus dilakukan pada masing-masing dan setiap mesin tersebut. Masalahnya adalah: ini membutuhkan akses root untuk mengedit
/etc/hosts
, dan Anda mungkin tidak memilikinya di mana-mana.Jika Anda ingin "raspi" dikenali secara otomatis dari mana saja, maka maaf: tidak mungkin. Ini akan memerlukan pendaftaran "raspi" sebagai nama domain, yang tidak dapat terjadi karena "raspi" tidak memiliki TLD, dan tidak akan bergantung pada server root DNS apa pun. Namun, Anda dapat mendaftarkan nama domain (katakanlah
cfbaptista.me
, dan arahkan ke alamat IP WAN Anda. Dengan beberapa penerusan porta, Anda akan dapat mengakses Raspberry Pi Anda dengan:(masih, itu menghabiskan uang untuk hampir tidak ada ...)
Mengenai
user@
bagian itu, itu tergantung pada nama login Anda pada mesin yang berbeda. Jika Anda memiliki nama yang sama pada mesin penghubung dan pada mesin remote , maka tidak perlu ditentukan. Jika tidak, Anda perlu menentukan siapa Anda pada mesin jarak jauh .sumber
Sasaran:
ssh raspi
harus bekerja di dalam LAN dan di Internet publik.Untuk melakukan ini, Anda perlu memastikan bahwa nama tersebut memutuskan untuk IP internal pada LAN, dan IP publik dari luar.
Pertama, Anda harus mendapatkan nama domain seperti
raspi.yourdomain.com
. Lihat http://freedns.afraid.org/ untuk domain gratis untuk penggunaan hobi. Arahkan domain ke IP publik AndaUntuk LAN, saya sarankan menjalankan DNSMasq. Firmware DD-WRT terbuka terintegrasi erat dengan DNSMasq, menggunakannya untuk DHCP dan DNS. Anda hanya perlu mengatakannya domain pencarian Anda ("domainAnda.com") dan itu akan secara otomatis menetapkan nama DNS berdasarkan pada setiap nama yang diminta klien. Untuk membuatnya bekerja, raspi's / etc / hostname harus membaca
raspi
.Setelah ini diatur, raspi.domainanda.com harus menyelesaikan IP lokal di LAN Anda (pastikan Anda menggunakan DNS lokal di semua mesin Anda).
Sekarang, Anda mungkin tidak ingin mengekspos port 22 ke internet publik, karena Anda akan mendapatkan banyak lalu lintas sniffer. Jadi Anda mungkin memiliki router Anda mengekspos raspi: 22 seperti beberapa port lain, katakanlah 1234. Untuk menggunakan port yang sama pada jaringan publik dan internal, Anda dapat menambahkan aturan pengalihan port ke raspi. Di Linux:
(ubah eth0 ke nama antarmuka jaringan Anda seperti yang ditunjukkan oleh
ip link
atauifconfig
, dan 1234 ke port publik Anda)Sekarang Anda dapat
ssh -p 1234 raspi.yourdomain.com
dari publik dan LAN.Anda dapat menambahkan entri ke ~ / .ssh / config pada mesin klien Anda untuk mempersingkat ini menjadi adil
ssh raspi
, seperti yang disebutkan oleh @DopeGhoti.Jika Anda ingin mengekspos port SSH mesin tambahan pada IP publik yang sama, ulangi saja prosesnya dengan nama DNS lain dan port publik. Bersulang!
sumber
Inilah jawaban Aleksi Torhamo versi ringkas dan berfungsi menggunakan curl untuk mengambil ip publik Anda saat ini dan kemudian memeriksa apakah cocok dengan ip publik server Anda (yaitu, Anda berada di jaringan lokal yang sama).
Di
~/.ssh/config
add Andasumber
ssh
akan memproses semua arahan yang cocok, secara berurutan, jadi secara teori Anda harus dapat melakukan sesuatu sepertiMatch host raspi / User john / HostName 192.168.2.7
diikuti olehMatch host raspi exec "[[ $(curl -s ipinfo.io/ip) != '12.345.67.89' ]]" / HostName 12.345.67.89 / Port 1234
dan mendapatkan efek yang sama dengan hanya satucurl
doa, membiarkan== '12.345.67.89'
kasus diasumsikan oleh kegagalanMatch
aturan keduaexec
.Match
adalah sama atau juga ditentukan pada argumen kedua - jika Anda menentukan non-standarPort xxxx
di argumen pertamaMatch
, dan ingin menggunakan port standar di argumen keduaMatch
, Anda harus secara eksplisit menimpanya kembali denganPort 22
sehingga tidak terus menggunakan portxxxx
.)Dengan asumsi mesin Anda memiliki IP 192.168.1. * Ketika terhubung ke LAN Anda, Anda dapat mencapainya dengan konfigurasi berikut
~/.ssh/config
sehingga Anda selalu dapat menggunakan perintah yang sama (adilssh raspi
) untuk menghubungkan:sumber
Solusi ini mengasumsikan bahwa jaringan rumah Anda memiliki satu router yang saya percaya adalah kasus umum.
Tambahkan ke
~/.ssh/config
sumber