Forwarding, generic bir kelimedir. Datanın bir noktadan diğer noktaya taşınması/iletimi sürecine forwarding denilir. Örneğin:
SSH protokolü uygulamaları tcp port forwarding yani tünelleme özelliğine sahiptir.
SSH ile 4 farklı şekilde tcp port forwarding gerçekleştirebilirsiniz.
# Gereksinimler
1. Local Port Forwarding
Localdeki bir porta (application client) gelen istekler belirtilen host/port a ssh server (application server) üzerinden iletilir.
Örnek Kullanım Amaçları:
Syntax:
> ssh -L [bind_address:]port:host:hostport ssh_server
Örnekler:
> ssh -L *:12345:gokhankesici.com:443 [email protected] > ssh -L 12345:gokhankesici.com:443 [email protected] > ssh -4L 12345:gokhankesici.com:443 [email protected] > ssh -L 12345:localhost:2345 [email protected] > ssh -L 192.168.80.199:12345:gokhankesici.com:443 [email protected]
Analiz:
Yukarıdaki ilk örneğimiz üzerinden detaylı bir analiz gerçekleştirelim:
Komut ilk çalıştırıldığında client 192.168.80.249 adresine bağlantı sağlanarak güvenli bir kanal oluşturulur.
Bağlantı sağladıktan sonra 12345 portu ssh client prosesi tarafından kendi hostunda dinleme modunda açılır.
12345 portuna bir istek yapıldığında ssh prosesi kendisine gelen bu paketi alır ve encrypted bir şekilde ssh sunucuya iletir. SSH sunucuda paketi decrypt eder ve forwarding aktif olduğu için paketlerimizi hedef host ve portuna iletir. Dönen yanıtları da tam tersi şekilde döner.
LocalForward Directive:
Client tarafında her bağlantıda -L parametresini belirtmeden local forwarding yapmak istiyorsanız LocalForward direktifi ile bunu gerçekleştirebilirsiniz.
İlk örneğimiz için aşağıdaki gibi bir direktif girebiliriz.
Host 192.168.80.249 LocalForward *:12345 gokhankesici.com:443
LocalForward direktifi kullanıldığında tekrar ek bir bağlantı yapılması durumunda adresin/portun kullanıldığına dair aşağıdaki gibi bir hata alınır. Bu sorunu yaşamamak için bağlantı sırasında ClearAllForwardings opsiyonu kullanılır.
Remote Connection
Listen durumdaki portun interfacesi localhost dışında bir interface ise dışarıdan bu interfacee gelecek istekler de forward edilir.
Yukarıdaki beşinci örneğimizde komutu çalıştırdığımızı düşünelim. Bu durumda dışarıdan gelecek bir istek forward edilir.
2. Remote Port Forwarding
Remote Port Forwarding, Local Port Forwarding ile benzer olmakla birlikte temel fark forward edilen trafik ters yöndedir.
Örnek Kullanım Amaçları:
Syntax:
> ssh -R [bind_address:]port:host:hostport ssh_server
Örnekler:
> ssh -R *:12345:gokhankesici.com:443 [email protected] > ssh -R 12345:gokhankesici.com:443 [email protected] > ssh -4R 12345:gokhankesici.com:443 [email protected] > ssh -R 12345:localhost:2345 [email protected] > ssh -R 192.168.80.249:12345:gokhankesici.com:443 [email protected]
Analiz:
Yukarıdaki ilk örneğimiz üzerinden detaylı bir analiz gerçekleştirelim:
Komut ilk çalıştırıldığında client 192.168.80.249 adresine bağlantı sağlanarak güvenli bir kanal oluşturulur.
Bağlantı sağladıktan sonra 12345 portu ssh sunucusunun sshd prosesi tarafından kendi hostunda dinleme modunda açılır.
SSH sunucu tarafında 12345 portuna bir istek yapıldığında sshd prosesi kendisine gelen bu paketi alır ve encrypted bir şekilde ssh clienta iletir. SSH sunucuda paketi decrypt eder ve forwarding aktif olduğu için paketlerimizi hedef host ve portuna iletir. Dönen yanıtları da tam tersi şekilde iletir.
RemoteForward Directive:
Client tarafında her bağlantıda -R parametresini belirtmeden remote forwarding yapmak istiyorsanız RemoteForward direktifi ile bunu gerçekleştirebilirsiniz.
Host 192.168.80.249 RemoteForward *:12345 gokhankesici.com:443
RemoteForward direktifi kullanıldığında tekrar ek bir bağlantı yapılması durumunda adresin/portun kullanıldığına dair aşağıdaki gibi bir hata alınır. Bu sorunu yaşamamak için bağlantı sırasında ClearAllForwardings opsiyonu kullanılır.
GatewayPort Directive
Listen durumdaki portun interfacesi localhost dışında bir interface ise dışarıdan bu interfacee gelecek istekler varsayılanda kabul edilmez.
Dışarıdan gelen istekleri kabul etmek için GatewayPorts direktifi kullanılır.
Yukarıdaki beşinci örneğimizde komutu çalıştırdığımızı düşünelim.
Gateway direktifi girilmezse biz ne kadar 192.168.80.249 olarak belirtmiş olsakta 127.0.0.1 listen edilir.
sshd yapılandırması içerisinde GatewayPorts aktif edilmiş olsun.
Aktif olması durumunda dışarıdan başka bir ipden direkt ilgili porta erişebildim. GE
3. Dynamic Port Forwarding
Local ve Remote Port forwardingde sadece 1 porta yönlendirilebiliriz. Dynamic Port forwarding, tek port kısıtlaması olmaksızın bir socks4/5 server gibi davranış gösterir.
Dynamic Port Forwardingde port, local port forwarding de olduğu gibi ssh client hostda listen edilir.
Örnek Kullanım Amaçları:
Syntax:
> ssh -D [bind_address:]port ssh_server
Örnek:
> ssh -D 2345 [email protected]
Analiz:
Yukarıdaki örneğimiz üzerinden detaylı bir analiz gerçekleştirelim:
Örneğin apt paket yöneticimizin isteklerini oluşan bu tünel üzerinden hedefe iletebiliriz.
Yukarıda 192.168.80.249a bağlanıp ssh clientın localhostunda 2345 portunu dinleyen bir socks server oluşturduk. tsocks uygulaması apt update isteklerimizi tsocks konfigürasyonunda belirtilen socks servera iletti. Socks serverımız da bu istekleri ssh sunucumuz 192.168.80.249 üzerinden kali repolarına iletti.
4. Reverse Dynamic Port Forwarding
Dynamic Port Forwardingin tersidir.
Reverse Dynamic Port Forwardingde port, remote port forwarding de olduğu gibi ssh serverda listen edilir.
Reverse dynamic forwarding özelliği Openssha 7.6 sürümüyle gelmiştir. Redhat/Centos 7 distroları bile bu yazıyı yazdığım tarih itibariyle bile 7.4 sürümünü kullanıyor. OpenSSH serverınızının bir sürümü kontrol ediniz.
> ssh -v
Örnek Kullanım Amaçları:
Syntax:
> ssh -R [bind_address:]port ssh_server
Örnek:
> ssh -R 2345 [email protected]