Ters SSH tüneli: Bağlantı noktası numaramı sunucuya nasıl gönderebilirim?


12

İki makinem var, İstemci ve Sunucu.

(Bir şirket güvenlik duvarının arkasında olan) istemci, şu komutu kullanarak herkese açık bir IP adresi olan Sunucuya ters bir SSH tüneli açar:

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

OpenSSH 5.3 ve 0sonraki sürümlerinde, -Raçıkça bir tane çağırmak yerine "kullanılabilir bir bağlantı noktası seç" anlamına gelir. Bunu yapmamın nedeni zaten kullanımda olan bir port seçmek istememem. Aslında, benzer tüneller kurması gereken birçok müşteri var.

Bu noktada sorun, sunucunun hangi istemcinin hangisi olduğunu bilmemesidir. Bu İstemcilerden birine (localhost aracılığıyla) tekrar bağlanmak istiyorsak, hangi portun hangi istemciye başvurduğunu nasıl bilebiliriz?

Yukarıdaki şekilde kullanıldığında ssh'ın bağlantı noktası numarasını komut satırına bildirdiğinin farkındayım. Ancak, oturumları canlı tutmak için autossh kullanmak istiyorum. autossh, muhtemelen ssh komutunun çıktısının eterde kaybolması için alt sürecini fork / exec ile çalıştırır.

Ayrıca, uzak bağlantı noktasını İstemciden almanın başka bir yolunu da düşünemiyorum. Bu nedenle, sunucuda bu bağlantı noktasını belirlemenin bir yolu olup olmadığını merak ediyorum.

Bir fikrim bir şekilde / etc / sshrc kullanmaktır, ki bu sözde her bağlantı için çalışan bir betiktir. Bununla birlikte, burada ilgili bilgileri nasıl alacağını bilmiyorum (belki de bu bağlantıyı işleyen belirli sshd işleminin PID'si?) Bazı işaretçileri çok isterim.

Teşekkürler!


2
Bir VPN daha uygun olmaz mı? OpenVPN'in yapılandırılması son derece basittir.
Ben Lessani - Sonassi

Kulağa ilginç geliyor. VPN hakkında fazla bir şey bilmiyorum. Bu, İstemci makine DHCP kullanacak şekilde yapılandırılmış olsa bile çalışabilecek bir şey mi?
Tom

1
Evet, başka bir TUN / TAP arabirimi çalışır, bu nedenle diğer arabirimler önemsizdir.
Ben Lessani - Sonassi

@sonassi, görünüşe göre bu VPN işi hile yapacak. Bilgi için teşekkürler.
Tom

Özellikle OpenVPN ile VPN sürecinde size rehberlik Aşağıda bir yanıt ekledik (Debian / Ubuntu tabanlı)
Sonassi - Ben Lessani

Yanıtlar:


4

Bir VPN daha uygun olmaz mı? OpenVPN'in yapılandırılması çok basit. Örnek bir yapılandırma ve sertifika oluşturma sürecinde size yol gösterecek bazı bağlantılar:

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

Ardından yeni bir dosya oluşturmak /etc/openvpn/client_server.confve değişen, içinde aşağıdaki koymak SERVER_IP_ADDRESSuygun olarak

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

Ardından bağlanacak kullanıcı başına bir anahtar oluşturun ve ccd dizininde config dosyasını oluşturun

./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

IP adresi , bağlantı başına yalnızca 2 adres (sunucu ve istemci) olduğundan, / 30 alt ağı (bkz. Http://www.subnet-calculator.com/cidr.php ) için uygun OLMALIDIR . Dolayısıyla, bir sonraki kullanılabilir istemci IP'niz 192.168.100.6 ve benzeri olacaktır.

Artık bağlanan kullanıcı başına statik IP'leriniz olur.

Sonra the user1@domain.com.p12son kullanıcıya dosya sağlayın ve aşağıdaki yapılandırma dosyasını kullanın

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

Kapsamlı cevap için teşekkürler! Bununla ilgili iki sorum var. A) İstemcinin ifconfig-push satırı için 255.255.255.0 belirtilmesi işe yaramıyor gibi görünüyor, ancak ikinci bir IP adresi belirtirsem işe yarar. Bu neden? Ve B) bu yaklaşım bağlantı başına 4 IP adresinin kullanıldığı anlamına mı geliyor?
Tom

Bazı Linux sistemlerinde, ifconfig-push hattının sözdizimi farklıdır. Örneğin. ifconfig-push 192.168.100.2 192.168.100.3- Platformlarda neden farklı olduğunu bilmiyorum. Ve evet, müşteri başına 4 IP kullanıldığı anlamına gelir (savurgan, ancak canavarın doğası).
Ben Lessani - Sonassi

3

İstemcilerin her birinin farklı kullanıcı adları varsa, netstatkullanıcının sshdişleminin hangi bağlantı noktasını dinlediğini bulmak için kullanabilirsiniz . Örneğin:

% 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

Geçici bağlantı noktası aralığını ( /proc/sys/net/ipv4/ip_local_port_rangeLinux için) değiştirebilir ve daha sonra bu aralığın dışında statik olarak ayrılmış bağlantı noktaları kullanabilirsiniz.


Bunun için geçici aralığını değiştirmeye gerek yok. Varsayılan olarak geçici aralık 61000 ile biter, dolayısıyla bunun üzerinde binlerce kullanılabilir bağlantı noktası numarası vardır. Genellikle echo $[61002+RANDOM%4532]bu aralıkta bir bağlantı noktası numarası seçerdim.
kasperd

2

Sizin gibi aynı kurulumu istiyorum, SSH sunucusunun günlük düzeyini DEBUG'a yükselttim ve günlüklerde istemcinin yerel bağlantı noktasının ne olduğunu gösterdi

Örneğin:

istemci komutu: ssh -N -R0:127.0.0.1:5522 connector@example.com

sunucu günlüğü:

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

orada port numarasını görüyorsun


0

İlgili bilgileri aşağıdakilerin çıktısından çıkarabilmelisiniz:

lsof -i tcp

Kök olarak çalıştır.


0

Bu komut dosyasını sunucuda çalıştırın:

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

İki sudo'ya ihtiyacınız olabilir veya olmayabilir. Yapmazsanız çıkarın.

Not: Bu, bir süre önce başka bir yerde bulduğum bir çözümün değiştirilmiş bir versiyonudur. Ben StackOverflow gelmiş olabilir düşünüyorum, ama orijinal referans bulamıyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.