Bagaimana cara meneruskan port dari satu mesin ke mesin lainnya?

19

Pertimbangkan situasi berikut:

Di rumah saya, saya memiliki router (yang terhubung ke internet), server (S) dan mesin utama saya (M). S dapat dijangkau dari internet (memiliki IP statis), dan terserah 24/7, sedangkan M tidak.

Terkadang, saya ingin membuat beberapa aplikasi (yang mendengarkan pada beberapa port pada M, misalnya 8888) dapat diakses dari internet luar.

Untuk itu, saya ingin mengatur beberapa port pada S (2222) untuk meneruskan ke port M 8888, sehingga siapa pun yang mengakses S: 2222 akan merasa seperti sedang mengakses M: 8888.

Saya mencoba menggunakan penerusan port ssh, upaya terbaik saya adalah sebagai berikut:

ssh -L 2222:M:8888 -N M

Tapi itu hanya memungkinkan saya untuk mengakses 2.222 port dari server itu sendiri, bukan dari komputer lain.

Apakah ada cara untuk melakukannya dengan benar? Lebih disukai, saya ingin itu menjadi perintah sederhana, yang saya bisa mulai dan tutup dengan ^ C ketika saya tidak membutuhkan penerusan itu lagi.

Rogach
sumber
Coba localhost.run yang merupakan situs web yang bisa Anda
kunjungi

Jawaban:

16

Ya, ini disebut GatewayPortsdalam SSH. Kutipan dari ssh_config(5):

GatewayPorts
        Specifies whether remote hosts are allowed to connect to local
        forwarded ports.  By default, ssh(1) binds local port forwardings
        to the loopback address.  This prevents other remote hosts from
        connecting to forwarded ports.  GatewayPorts can be used to spec‐
        ify that ssh should bind local port forwardings to the wildcard
        address, thus allowing remote hosts to connect to forwarded
        ports.  The argument must be “yes” or “no”.  The default is “no”.

Dan Anda dapat menggunakan localhostalih-alih Mdi dalam penerusan, karena Anda meneruskan ke mesin yang sama seperti saat Anda SSH - jika saya memahami pertanyaan Anda dengan benar.

Jadi, perintahnya akan menjadi ini:

ssh -L 2222:localhost:8888 -N -o GatewayPorts=yes hostname-of-M

dan akan terlihat seperti ini di netstat -nltp:

tcp        0      0    0.0.0.0:2222   0.0.0.0:*  LISTEN  5113/ssh

Sekarang siapa pun yang mengakses mesin ini di port 2222 TCP akan benar-benar berbicara dengan localhost: 8888 seperti yang terlihat di mesin M. Perhatikan bahwa ini tidak sama dengan penerusan polos ke port 8888 dari M.

gertvdijk
sumber
1
Terima kasih! Itu bekerja! Tetapi ada beberapa keanehan - untuk beberapa alasan, output berisi baris "bind: Address sudah digunakan". Apa artinya itu?
Rogach
1
Anda sudah memiliki beberapa proses yang berjalan di port itu. Gunakan netstatperintah yang sama untuk mencari tahu apa sebenarnya. Mungkin SSH serupa lainnya masih berjalan di latar belakang dan membunuhnya menggunakan PID netstat memberitahu Anda.
gertvdijk
Hal yang menyenangkan adalah saya sudah melakukan itu - tidak ada proses pada port tersebut, pada S dan M. Jika ada beberapa, maka seluruh konstruksi mungkin akan gagal untuk bekerja.
Rogach
10

Ada cara lain. Anda dapat mengatur port forwarding dari S: 2222 ke W: 8888 dengan iptables. Perintah tunggal:

iptables -t nat -A PREROUTING -p tcp --dport 2222 \
         -j DNAT --to-destination 1.2.3.4:8888

di mana 1.2.3.4 adalah alamat IP M. Ini disebut NAT (Terjemahan Alamat Jaringan).

Gevial
sumber
1
Karena Anda hanya melakukan NAT tujuan di sini (berlawanan dengan sumber NAT), ini hanya akan berfungsi dengan andal dalam situasi tertentu dan dapat mengharuskan Anda untuk memodifikasi tabel routing. Untuk meneruskan ke mesin virtual (M) yang berjalan di host (S), ini mungkin bekerja dengan baik.
gertvdijk
Perintah ini harus dikeluarkan di gateway. Saya berasumsi bahwa S dan M berada di LAN yang sama. Sumber NAT akan dilakukan secara otomatis oleh pelacak koneksi di kernel Linux modern. Saya memiliki konfigurasi seperti itu di jaringan kantor saya dan berfungsi dengan baik. Namun, dimungkinkan untuk membuat perintah lebih spesifik (misalnya, memberi tahu iptables -i eth0 di mana eth0 adalah antarmuka luar).
Gevial
Jika S dan M berada di LAN yang sama, Anda tidak perlu port forwarding di sana, karena tidak ada lalu lintas di antara mereka melewati gateway.
gertvdijk
1
Ya, tetapi menghubungkan ke M: 8888 dibuat dari Internet, saya kira. Seseorang membentuk Internet -> S: 2222 -> M dan S LAN router dengan iptables -> M: 8888
Gevial