uPNP yetenekleri bulunan yönlendiricili (router) ağlarda miniuPNP Client uygulamasını kullanarak modem arayüzüne erişmeden port açmanız mümkün. Çoğu zaman geliştirdiğini uygulamalara direkt bir erişim sağlamak, IoT bir cihaza yada servise yönlendirici üzerinde yapılandırma yapmadan erişmek mümkün.
Bu uygulama örneğinde Raspberry Pi üzerindeki SSH servisi için uPNP client kullanarak bir port açacağız.
Öncelikle Raspberry Pi OS Lite kurulu cihazımıza miniupnpc uygulamasını kuracağız.
$ sudo apt-get install -y miniupnpc
Kurulum bittiğinde aşağıdaki komutu kullanarak yönlendiricimizin uPNP desteğinin olup olmadığını anlamak mümkün.
$ upnpc -l
Bu komut bize yönlendiricimizin mevcut uPNP şemasını verecektir. Ağınızda IPTV, Kamera gibi bulut servisleri kullanan cihazlarınız mevcutsa bu listede açtıkları portları görmeniz mümkün olacaktır.
Şimdi aşağıdaki komuyu kullanarak yerel ağımızda bulunan Rpi cihazımız üzerinden port açıyoruz. Dış bacakta 8888 numaralı port üzerinden TCP ile gelen istekleri iç bacakta 192.168.1.30 IP adresindeki cihazın 22 numaralı portuna yönlendiriyoruz. Tek tırnak ile yazılmış kısım sadece bir açıklama. Yönlendirme tablosunu görüntülediğimizde bu açıklamayı orada göreceğiz.
$ upnpc -e ‘SSH Rpi’ -a 192.168.1.30 22 8888 TCP
İşlem sonrasında $ upnpc -l komutunu kullanarak portun açılıp açılmasığını kontrol edebiliriz.
İlgili portu sürekli canlı tutabilmek için bir cron (zamanlanmış görev) oluşturmak gerekecektir. Bu sayede port sürekli canlı kalacaktır. Bunun için bir bash script oluşturarak 2 basamaklı bir işlemi yapacağız.
- Bir bash script dosyası oluşturacağız.
- Eğer cihazımız DHCP üzerinden sürekli yeni bir IP adresi alıyorsa cihazımızın güncel ip adresini bir değişkene aktaracağız.
- Komut satırından çalıştırdığımız komutu güncel IP adresimizi barındıran değişkenide dahil ederek çalıştıracağız.
$ touch upnpcron.sh ( boş dosyayı oluşturduk)
$ nano upnpcron.sh ( düzenlemek üzere NANO editör ile açtık)
İçeriğini aşağıdaki şeklide düzenledik. 2. Satır cihazımızın güncel yerel ağ IP adresini ip4 isimli değişkene aktaracaktır. Kullandığımız bağlantı ethernet üzerindense bağdaştırıcı adı wlan0 yerine eth0 olacaktır.
#!/bin/bash
ip4=$(/sbin/ip -o -4 addr list wlan0 | awk ‘{print $4}’ | cut -d/ -f1)
upnpc -e ‘SSH Rpi’ -a $ip4 22 8888 TCP
Aşağıdaki komutu kullanarak oluşturduğumuz dosyayı çalıştırılabilir hale getiriyoruz.
$ chmod +x upnpcron.sh
Aşağıdaki komutu kullanarak zamanlanmış görev dosyamızı düzenleyebiliriz.
$ crontab -e
İçeriğinin aşağıdaki gibi olmasını bekliyoruz. @reboot zaman periyodunu kullanarak cihaz her yeniden başladığında ilgili dosyamızın çalışmasını sağlıyoruz. Buna ek olarak her 20 dakikada bir aynı dosyanın çalışmasını sağlayarak portu canlı tutuyoruz.
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
@reboot sh /home/pi/upnpcron.sh
*/20 * * * * sh /home/pi/upnpcron.sh
Şimdi kendi ağımızın dışından bir bağlantıdan oluşturduğumuz port numarasını kullanarak uygulama yada cihaza erişmeyi deneyebiliriz.
Kaynaklar:
http://miniupnp.free.fr/
https://github.com/miniupnp/miniupnp
https://zoomadmin.com/HowToInstall/UbuntuPackage/miniupnpc