SSH ile Port Aktarımı ve Tünelleme

Yusuf Kocaman
3 min readJan 26, 2020

--

SSH bildiğiniz gibi uzak diyarlardaki bir sunucuyu dizimizin dibine getiren bir protokol. Ayağımıza gelen hizmetleri şu şekilde gruplandırabiliriz; komut işleme, dosya transferi ve tünelleme. Komut işleme ve dosya transferini pas geçelim. Gelelim konumuza.

https://unsplash.com/photos/pcoKkN3NsX0

Tünelleme (tunneling), SSH’in pek yaygın kullanılmayan bir yeteneği. Yerel bilgisayarınız ile uzaktaki sunucu arasında ağ trafiğini iki yönlü aktarabilmenizi sağlıyor. Dolaylı olarak ağ üzerindeki erişim yetkilerini paylaştırıyoruz da diyebiliriz.

Yerele Port Aktarımı (Local Port Forwarding)

Bilgisayarımızdaki bir portun, uzak sunucunun üzerindeki veya erişebildiği ağ üzerindeki bir port gibi davranmasını sağlıyor.

ssh kullanici@sunucu-ip -L<yerel-port>:<uzak-adres>:<uzak-port>

Neden?

Örnek olarak, bir sunucunuz üzerinde MySQL çalışıyor. Sizin bu servise bağlanmanız lazım ama güvenlik sebebi veya herhangi bir sebeple 3306 portu dış dünyaya kapalı. Bilgisayarınızdaki herhangi bir portun, SSH üzerinden, sunucudaki MySQL portunu taklit etmesini sağlayabilirsiniz. Sunucumdaki 3306 portuna, bilgisayarımdaki 3307 portu üzerinden bağlanmak için şu komutu çalıştırıp, bağlantıyı açık tutmam gerekiyor.

ssh kullanici@sunucu-ip -L3307:localhost:3306

Artık bilgisayarımızda localhost:3307 adresine bağlandığımızda aslında uzak sunucu üzerindeki sunucu-ip:3306 portuna bağlanmış olacağız.

Eğer sunucudaki bir servisinizi, sadece uzaktan erişebilmek için dış dünyaya açık tutuyorsanız, kapatmalısınız.

Yukarıda -L3307:localhost:3306 yazdığımız yerde, localhost yerine sunucunun çözümleyeceği adresi yazıyoruz. Sunucunun erişebildiği ama bizim uzaktan erişemediğimiz, güvenlik duvarı arkasında başka bir sunucu olduğunu düşünelim, yerel ağ içerisinde duruyor ve IP adresi de 10.20.30.40 olsun. Bu sefer komutumuz şu şekilde olacaktı.

ssh kullanici@sunucu-ip -L3307:10.20.30.40:3306

Yine aynı şekilde bilgisayarım üzerinden localhost:3307 adresine bağlandığımda aslında 10.20.30.40:3306 adresine bağlanmış olacağım.

Uzaklar yakın oldu.

Uzağa Port Aktarımı (Remote Port Forwarding)

Bilgisayarınızın üzerinde veya yerel ağ üzerinde erişebildiğiniz bir portu, sunucu ile paylaşmanızı sağlıyor.

ssh kullanici@sunucu-ip -R<yerel-port>:<uzak-adres>:<uzak-port>

Neden?

Bilgisayarımda bir port üzerinde çalışan servis var, bunu bir sunucu üzerinden internete açmak istiyorum. Veya bir lokasyondaki bilgisayarıma evden bağlanmak istiyorum ama bir takım sebeplerle internet üzerinden gelen istekleri karşılatmam mümkün değil. Örnek olarak 22 portunda çalışan SSH servisini, sunucu üzerinde 2222 portuna bağlamak istiyorum .Hemen lokasyondaki bilgisayardan sunucuya aşağıdaki komut ile bir bağlantı açıp aktif bırakıyorum.

ssh kullanici@sunucu-ip -R22:localhost:2222

Ardından evdeki bilgisayarımdan sunucuya bağlanıp, aşağıdaki komut ile lokasyondaki bilgisayara erişim sağlayabilirim.

ssh kullanici@localhost -p2222

Veya evdeki bilgisayarım üzerinde de sunucudan yerele port yönlendirme yapıp, direkt yine yerel porttan bağlanabilirim.

Tünelleme (Tunneling)— Fakir VPN’i

Malumunuz bazı yerlere erişemiyoruz. Yurt dışında bir sunucumuz varsa, bu sunucumuzun erişebildiği her yere biz de erişebiliriz. Yapmamız gereken bilgisayarımız üzerinde sunucuya aktarılan bir soket açmak ve internet tarayıcımıza bu soketi HTTP Proxy olarak tanımlamak. Komut şu:

ssh kullanici@sunucu-ip -D<port-no>

<port-no> yerine herhangi bir boşta duran port numarası yazabilirsiniz, 8888 olabilir. Ben terminal üzerinden HTTP Proxy kullanmak üzerine bir örnek paylaşayım.

Önce soketi açıyorum

ssh kullanici@sunucu-ip -D8888

Sonra terminal üzerinden aşağıdaki komut ile proxy tanımlaması yapıyorum

export HTTP_PROXY=socks5://localhost:8888
export HTTPS_PROXY=socks5://localhost:8888

Artık proxy üzerinden kullanım yapabilirim

curl ifconfig.me

Ek Olarak

Farkettiyseniz ssh sunucunun komut satırını da açık tutuyor. Bu interaktif ekranı istemezsek -N parametresini ekleyebiliriz.

ssh kullanici@sunucu-ip -N ...

Eğer komutun arkaplana gönderilmesini istersek de -f parametresini ekleyebiliriz.

ssh kullanici@sunucu-ip -N -f ...

Faydalı Olabilecekler

sshuttle: Tek tek port soket açamam, sunucumun eriştiği her yere erişmeliyim derseniz (gerçek fakir vpn’i):

chisel: Eğer sunucunuzun internet erişimi yok, sadece bir HTTP proxy üzerinden internete çıkabiliyorsa, engelleri aşmanın bir çözümü var:

iodine: Sunucunun hiçbir yere erişim yetkisi yok, sadece DNS çözümleyebiliyor diyorsanız ve bu DNS hizmeti, internet üzerindeki DNS kayıtlarını dış kaynaklardan öğrenip dönüyorsa, engeli aşmak için hala umut var:

Sonuç

SSH ile tünelleme ve port aktarımının varlığını bilmek, karşılaşacağımız herhangi bir erişim engelini hızlıca aşmamızı sağlayacaktır.

Yazı ile ilgili eleştirilerinizi yorum olarak geri bildirimde bulunabilirsiniz.

--

--

No responses yet