SSH tüneli üzerinden UDP trafiği


66

Başlık hemen hemen özetliyor. UDP trafiğini bir SSH tüneli üzerinden göndermek istiyorum. Özellikle, tünelden UDP paketleri gönderebilmem ve sunucunun diğer tarafta bana geri gönderebilmesini sağlamam gerekiyor. TCP bağlantıları için nasıl yapıldığını biliyorum. UDP ile mümkün mü?

Yanıtlar:


36

Bu küçük kılavuz , UNDP benzeri işletim sistemlerinde standart olan araçları (ssh, nc, mkfifo) kullanarak SSH üzerinden UDP trafiğini nasıl göndereceğinizi açıklar.

SSH bağlantısı üzerinden UDP tünellemesi gerçekleştirme

Adım adım SSH bağlantınızla bir TCP ileri port açın

Yerel makinenizde (yerel), uzaktaki makineye (sunucuya) SSH ile bağlanın, ek -L seçeneğiyle SSH, TCP bağlantı noktası ileri ile:

local# ssh -L 6667:localhost:6667 server.foo.com

Bu, yerel makinenizin 6667 numaralı bağlantı noktasında bulunan TCP bağlantılarının server.foo.com adresindeki 6667 numaralı bağlantı noktasına güvenli kanal üzerinden iletilmesini sağlar. TCP'yi sunucuda UDP'ye iletme

Sunucuda, 6667 numaralı TCP bağlantı noktasında, belirli bir IP'nin UDP bağlantı noktası 53'e veri iletecek olan bir dinleyiciyi açıyoruz. Benim gibi DNS yönlendirmesi yapmak istiyorsanız, /etc/resolv.conf içinde bulacağınız ilk ad sunucusunun IP'sini alabilirsiniz. Ama önce, bir beşlik yaratmamız gerekiyor. İkili, iki kanal arasında iki yönlü iletişim kurmak için gereklidir. Basit bir kabuk borusu yalnızca sol işlem 'standart çıktıyı sağ işlem' standart girdisine iletir.

server# mkfifo /tmp/fifo
server# nc -l -p 6667 < /tmp/fifo | nc -u 192.168.1.1 53 > /tmp/fifo

Bu, sunucunun 6667 numaralı bağlantı noktasındaki TCP trafiğinin 192.168.1.1'in 53 numaralı bağlantı noktasındaki UDP trafiğine yönlendirilmesine ve yanıtların geri gelmesine olanak sağlar. UDP'yi makinenizde ileri TCP'ye ayarlamak

Şimdi, yerel makinede yapılanların tam tersini yapmamız gerekiyor. UDP bağlantı noktası 53'ü bağlamak için ayrıcalıklı erişime ihtiyacınız var.

local# mkfifo /tmp/fifo
local# sudo nc -l -u -p 53 < /tmp/fifo | nc localhost 6667 > /tmp/fifo

Bu, yerel makinenin 53 numaralı bağlantı noktasındaki UDP trafiğinin, yerel makinenin 6667 numaralı bağlantı noktasındaki TCP trafiğine iletilmesine olanak sağlar. Yerel DNS sunucunuzun tadını çıkarın :)

Şimdi muhtemelen tahmin ettiğiniz gibi, yerel makinede bir DNS sorgusu gerçekleştirildiğinde, örneğin yerel UDP bağlantı noktası 53'te, yerel TCP bağlantı noktası 6667'ye, ardından sunucunun TCP bağlantı noktası 6667'ye, ardından sunucunun DNS sunucusuna iletilir , 192.168.1.1'deki 53 numaralı UDP bağlantı noktası. Yerel makinenizde DNS hizmetlerinden yararlanmak için, aşağıdaki satırı /etc/resolv.conf dosyasına ilk ad sunucusu olarak yerleştirin:

nameserver 127.0.0.1

28
Bu çözüm güvenli değil. İleti sınırlarını korumak için TCP akışlarının garanti edilmediğinden, tek bir UDP datagramı herhangi bir protokolü kırarak parçalara ayrılabilir.
Juho Östman,

2
IRC tarafından kullanılan 6667 yerine 1153 numaralı bağlantı noktasını kullanmak da güzel olabilir (man SSH örneğinden).
phil pirozhkov

1
@ JuhoÖstman Bu tuzağa dikkat çektiğiniz için teşekkür ederiz. Sorunun farkında olmak ... bir çözüm yolunda mı gittin? yeterince küçük mesajlar, çalışmayı muhtemel hale getirmenin bir yolu olabilir mi?
insanlıkANDpeace

4
Çözüm, TCP akışından gönderilmeden önce her pakete bir uzunluk hazırlamak ve ondan orijinal paketleri yeniden oluşturmak olacaktır. Bunu yapmak için bir C betiği yazmak kolay olurdu, ancak hazır bir çözüm olup olmadığından emin değilim. Uygulamada, TCP genellikle bu durumda mesaj sınırlarını koruyor görünmektedir, ancak herhangi bir zamanda garip hatalar meydana gelebilir.
Juho Östman

Bununla bir başka problemle karşılaştım: boru ve fifo tamponlanır, böylece çerçeve sınırları kaybolur. Bu yüzden birçok UDP çerçevesi tek bir TCP çerçevesi içinde birleştirilebilir.
Julio Guerra

26

Bu örnek (John'un cevabının aynı şeyi farklı bir yere işaret ettiğini düşünüyorum), başka bir makinenin UDP / DNS servislerine TCP / SSH bağlantısı üzerinden nasıl erişileceğini açıklar.

Yerel UDP / 53 trafiğini TCP'ye, ardından SSH port yönlendirme mekanizmasıyla TCP trafiğini diğer makineye, ardından TCP'yi diğer ucunda UDP / 53'e yönlendireceğiz.
Genellikle, openvpn ile yapabilirsiniz.
Ama burada, basit araçlarla yapacağız, yalnızca openssh ve netcat.

Bu sayfanın sonunda, ' socat'
ifadesiyle yapılan başka bir yorum , Aynı UDP / DNS erişimi,

Sunucu tarafı: socat tcp4-listen:5353,reuseaddr,fork UDP:nameserver:53
Müşteri tarafı:socat udp4-listen:53,reuseaddr,fork tcp:localhost:5353

Daha fazlası için socat örneklerine bakın .


3
Bu benim için kabul edilen cevaptan çok daha faydalı görünüyor. Video akışının tek yönlü olarak yeniden yönlendirilmesine ihtiyacım vardı (TS / UDP) ... ssh orig_strm_src socat udp4-listen:4003,reuseaddr,fork STDOUT| socat STDIN udp-sendto:localhost:4003
23'de

FWIW, ana sayfamda UDP iletimi için SSH üzerinden nasıl bir sosyal medya kurulacağını açıklayan daha ayrıntılı bir rehber yazdım . Örnek olarak SNMP kullanır.
Peter V. Mørch

20

SSH (en azından OpenSSH) basit VPN'leri destekliyor. İstemcideki -wveya Tunnelseçeneğini kullanarak, her iki uçta da, herhangi bir IP trafiğini iletmek için kullanılabilecek sshbir tuncihaz oluşturabilirsiniz . (Ayrıca bkz Tunnel. Kılavuzdaki sayfa ssh_config(5).) Bunun her iki uçta da OpenSSH (ve muhtemelen root yetkileri) gerektirdiğine dikkat edin.


Bu, ayrıcalıklı olmayan bağlantı noktalarının UDP tüneli için ve PermitRootLogin 'hayır' olarak ayarlanmamış olsa bile uzak makinede kök ayrıcalıkları gerektirir. Çok kötü.
phil pirozhkov

@grawity Bu seçeneği işaretlediğiniz için teşekkür ederiz, ki philpirozhkov tarafından belirtildiği gibi gerekli kök girişini yapın. Acaba köke ihtiyaç duymamak için onu kandırmanın bir yolu olabilir mi?
insanlıkANDpeace

4
@humanityANDpeace: Tun / tap cihazlarını ön üretebilir ve bunları kullanarak belirli bir kullanıcının sahip olmasını sağlayabilirsiniz ip tuntap add.
yerçekimi

Merhaba @grawity. Çözümünüzü beğendim ancak çalışamıyorum. Ben önceden oluşturulmuş tunşu şekildedir: Cihazı sudo ip tuntap add mode tunkullanırken hiç ama -w: böyle seçeneği ssh $Server -w $portalıyorum Tunnel device open failed. Could not request tunnel forwarding.Neyi yanlış yapıyorum?
Lucas Aimaretto,

16

Veya basit bir komutla basitçe ssf (bu kullanım durumunu ele almak için tasarlanmış) kullanabilirsiniz:


Müşteri tarafı:

#>./ssfc -U 53:192.168.1.1:53 server.foo.com

Bu komut, yerel bağlantı noktası 53'ü (dns) 192.168.1.1 bağlantı noktası 53'e, localhost ve server.foo.com arasındaki güvenli bir tünel üzerinden yönlendirir.


Bir ssf sunucusuna ihtiyacınız olacaktır ( - veya ssh sunucunuzun yanında - yerine ):

#>./ssfs

Bu arada, ssf'nin hem istemci hem de sunucu tarafı Windows / Linux / Mac'te çalışıyor. Bu bir kullanıcı uygulamasıdır, bu nedenle tun / tap veya VPN gerekmez.

53 numaralı bağlantı noktasını yönlendirmek için, kullandığınız araç ne olursa olsun, yönetici ayrıcalıklarına ihtiyacınız olacaktır.

Daha fazla bilgi için, ayrıntıları kullanın, dava kullanın veya indirin: https://securesocketfunneling.github.io/ssf/


Lütfen "işte benim ürünüm", borderline spam. Yardım merkezinden talimatları okuyup izlemenizi öneririm .
heavyd

7
En çok utanmaz bir fiş. Neyse, çözüm isteğinize uygun olabilir. Bu arada, SSF OpenSource ve kar amacı gütmeyen bir kuruluştur.
ssf-developers

11
@heavyd: Bir sürü sahte senaryo yayınlasaydı, kabul edilebilir olurdu, ama olgun bir açık kaynak kodlu araç yaptığı için değil mi? Orijinal soruya mükemmel cevap veriyor.
16'da 19:16

Utanç verici bir şekilde itiraf etmeliyim ki, bu tam olarak aradığım alet, utanmaz bir fiş olsa bile.
therealrootuser

9

Ben alamadım ncSNMP istemcileri yeni bir kaynak UDP bağlantı noktasını seçerek devam çünkü, SNMP için çalışmak ve tek seferde birçok etkin olabilir.

Bunun yerine, SNMP kullanarak socatbu blog gönderisinde nasıl yapılacağını açıklayan bir yazı yazdım . Temel olarak, iki terminal kullanarak, genel bakıştan başlayarak:

genel bakış

Terminal bir:

client$ ssh -L 10000:localhost:10000 server
server$ socat -T10 TCP4-LISTEN:10000,fork UDP4:switch:161

Bu, 10000 numaralı TCP bağlantı noktasının SSH iletimini oluşturur ve sunucuda socat'ı çalıştırır. Anahtarın IP adresinin socat komut satırında “anahtar” olarak belirtildiğine dikkat edin.

Terminal iki:

client$ sudo socat UDP4-LISTEN:161,fork TCP4:localhost:10000

Bu müşteri üzerinde socat kurar. Bunu yapmalı.


bu benim için çalıştı :)
Paul Fenney

4

Bir UDP bağlantı noktasına erişiminiz varsa, VPN daha iyi bir çözümdür.

Yalnızca TCP SSH portuna erişiminiz varsa, bir SSH tüneli en azından ping ve paket geri izleme için bir VPN kadar iyidir.

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.