Membalikkan terowongan SSH: bagaimana saya bisa mengirim nomor port saya ke server?


12

Saya punya dua mesin, Client dan Server.

Klien (yang berada di belakang firewall perusahaan) membuka terowongan SSH terbalik ke Server, yang memiliki alamat IP yang dapat diakses secara publik, menggunakan perintah ini:

ssh -nNT -R0: localhost: 2222 insecure@server.example.com

Dalam OpenSSH 5.3+, yang 0terjadi tepat setelah -Rcara "memilih port yang tersedia" daripada secara eksplisit memanggilnya. Alasan saya melakukan ini adalah karena saya tidak ingin memilih port yang sudah digunakan. Sebenarnya, sebenarnya ada banyak Klien di luar sana yang perlu mengatur terowongan serupa.

Masalahnya pada saat ini adalah bahwa server tidak tahu Klien mana yang mana. Jika kita ingin terhubung kembali ke salah satu Klien ini (via localhost) lalu bagaimana kita tahu port mana yang merujuk ke klien mana?

Saya sadar bahwa ssh melaporkan nomor port ke baris perintah ketika digunakan dengan cara di atas. Namun, saya juga ingin menggunakan autossh untuk menjaga sesi tetap hidup. autossh menjalankan proses turunannya melalui fork / exec, mungkin, sehingga output dari perintah ssh yang sebenarnya hilang dalam eter.

Selain itu, saya tidak bisa memikirkan cara lain untuk mendapatkan port jarak jauh dari Klien. Jadi, saya bertanya-tanya apakah ada cara untuk menentukan port ini di Server.

Satu ide yang saya miliki adalah entah bagaimana menggunakan / etc / sshrc, yang seharusnya merupakan skrip yang berjalan untuk setiap koneksi. Namun, saya tidak tahu bagaimana orang bisa mendapatkan informasi terkait di sini (mungkin PID dari proses sshd tertentu yang menangani koneksi itu?) Saya ingin beberapa petunjuk.

Terima kasih!


2
Bukankah VPN lebih tepat? OpenVPN sangat mudah dikonfigurasi.
Ben Lessani - Sonassi

Kedengarannya menarik. Saya tidak tahu banyak tentang VPN. Apakah ini sesuatu yang bisa berfungsi bahkan jika mesin Klien dikonfigurasi untuk menggunakan DHCP?
Tom

1
Ya, ia menjalankan antarmuka TUN / TAP lain, jadi antarmuka lain tidak relevan.
Ben Lessani - Sonassi

@sonassi, sepertinya hal VPN ini akan berhasil. Terimakasih atas infonya.
Tom

Saya telah menambahkan jawaban di bawah ini yang secara khusus memandu Anda melalui proses VPN dengan OpenVPN (berdasarkan Debian / Ubuntu)
Ben Lessani - Sonassi

Jawaban:


4

Bukankah VPN lebih tepat? OpenVPN sangat mudah dikonfigurasi. Berikut adalah contoh konfigurasi dan beberapa tautan untuk memandu Anda melalui proses pembuatan sertifikat:

apt-get install openvpn
mkdir /etc/openvpn/easy-rsa
mkdir -p /etc/openvpn/ccd/client_server
touch /etc/openvpn/ipp.txt
cp -a /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
source ./vars
./clean-all
./build-ca 
./build-dh
./build-key-server server
cd /etc/openvpn/easy-rsa/keys
openssl pkcs12 -export -out server.p12 -inkey server.key -in server.crt -certfile ca.crt

Kemudian buat file baru /etc/openvpn/client_server.confdan letakkan yang berikut di dalamnya, ubah SERVER_IP_ADDRESSseperlunya

local SERVER_IP_ADDRESS
port 8443
proto udp
dev tun
ca /etc/openvpn/easy-rsa/keys/ca.crt
pkcs12 /etc/openvpn/easy-rsa/keys/server.p12
dh /etc/openvpn/easy-rsa/keys/dh1024.pem
ifconfig-pool-persist /etc/openvpn/ipp.txt
server 192.168.100.0 255.255.255.0
client-config-dir /etc/openvpn/ccd/client_server
ccd-exclusive
keepalive 10 120
comp-lzo
persist-key
persist-tun
status /var/log/openvpn-status.log
verb 3
reneg-sec 0

Kemudian buat kunci per pengguna yang akan terhubung, dan buat file konfigurasi di direktori ccd

./build-key-pkcs12 user1@domain.com
echo "ifconfig-push 192.168.100.2 255.255.255.0" > /etc/openvpn/ccd/client_server/user1@domain.com

Alamat IP HARUS cocok untuk subnet / 30 (lihat http://www.subnet-calculator.com/cidr.php ), karena hanya ada 2 alamat yang tersedia (server dan klien) per koneksi. Jadi IP klien Anda yang tersedia berikutnya adalah 192.168.100.6 dan seterusnya.

Maka sekarang Anda memiliki IP statis per pengguna yang terhubung.

Kemudian berikan the user1@domain.com.p12file ke pengguna akhir dan gunakan file konfigurasi berikut

client
dev tun
proto udp
remote SERVER_IP_ADDRESS 8443
pkcs12 user1@domain.com.p12
resolv-retry infinite
nobind
ns-cert-type server
comp-lzo
verb 3
reneg-sec 0

Terima kasih atas jawabannya! Saya punya dua pertanyaan tentang ini. A) Menentukan 255.255.255.0 untuk garis ifconfig-push klien tampaknya tidak berfungsi, tetapi itu berfungsi jika saya menentukan alamat IP kedua. Kenapa ini? Dan B) apakah pendekatan ini berarti bahwa 4 alamat IP digunakan per koneksi?
Tom

Pada beberapa sistem Linux, sintaks untuk garis ifconfig-push berbeda. Misalnya. ifconfig-push 192.168.100.2 192.168.100.3- Saya tidak tahu mengapa ini berbeda pada platform. Dan ya, itu berarti 4 IP digunakan per klien (boros, tetapi sifat binatang).
Ben Lessani - Sonassi

3

Jika masing-masing klien memiliki nama pengguna yang berbeda, Anda dapat menggunakan netstatuntuk mengetahui port apa yang sshddidengarkan oleh proses pengguna . Sebagai contoh:

% sudo netstat -tlpn | grep 'sshd: mgorven@'
tcp        0      0 127.0.0.1:22220         0.0.0.0:*               LISTEN      5293/sshd: mgorven@
tcp        0      0 127.0.0.1:5120          0.0.0.0:*               LISTEN      5293/sshd: mgorven@

3

Anda bisa mengubah rentang port sementara ( /proc/sys/net/ipv4/ip_local_port_rangeuntuk Linux) dan kemudian menggunakan port yang dialokasikan secara statis di luar rentang itu.


Tidak perlu mengubah rentang fana untuk itu. Secara default rentang ephemeral berakhir pada 61000, jadi ada ribuan nomor port yang tersedia di atas itu. Saya sering digunakan echo $[61002+RANDOM%4532]untuk memilih nomor port dalam kisaran itu.
kasperd

2

Saya ingin pengaturan yang sama seperti Anda, saya meningkatkan level log dari server SSH ke DEBUG, dan itu menunjukkan di log apa yang merupakan port lokal klien

sebagai contoh:

perintah klien: ssh -N -R0:127.0.0.1:5522 connector@example.com

log server:

Jun 30 11:28:59 debsid sshd[27577]: debug1: Local forwarding listening on 127.0.0.1 port 35391

di sana Anda melihat nomor port


0

Anda harus dapat mengekstraksi informasi yang relevan dari output:

lsof -i tcp

Jalankan sebagai root.


0

Jalankan skrip ini di server:

sudo lsof -i -n | grep "sshd" | grep "(LISTEN)" | awk '{print $2}' | while read line; do sudo lsof -i -n | egrep $line | sed 3~3d | sed 's/.*->//' | sed 's/:......*(ESTABLISHED)//' | sed 's/.*://' | sed 's/(.*//' | sed 'N;s/\n/:/' 2>&1 ;done

Anda mungkin atau mungkin tidak membutuhkan dua sudo itu. Hapus jika Anda tidak.

PS - Ini adalah versi modifikasi dari solusi yang saya temukan di tempat lain beberapa waktu lalu. Saya pikir itu mungkin berasal dari StackOverflow, tetapi saya tidak dapat menemukan referensi aslinya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.