TL;DR: I am looking for a script or a cron job, which will periodically run on a linux host (fedora on raspberry pi) which will check if a port forwarding rule still exists in the router and add it if it isn't. The aim is to always have access to the raspberry pi linux host via SSH, VNC and the transmission web interface, from any machine on the internet outside my home network. The setup is given below:


Beetel 440Tx1 ADSL2 router+modem+wifi.


Router is connected to the internet (ISP Broadband) and has a dynamic external IP. It provides a private home network to my computers with internal IPs 192.168.x.y acting as a DHCP too.


A raspberry pi ARM host with Fedora Linux, running all the time with ssh, vnc, transmission-daemon servers started at boot time. It also has the no-ip.com dyndns free DUC (dynamic update client) which routinely checks the external IP and binds it to host string. So I can always find my router's external IP by resolving my dyndns string like myrouter.no-ip.org. The pi has a static internal IP like 192.168.1.z.

Port Forwarding:

Have to login to router using GUI/browser with factory credentials only if connected to that network either through ethernet cable or password protected wi-fi

I setup the rule by logging in to forward any traffic at ports 22, 5900, 9091 at the external IP to the respective listener programs (sshd, vncserver, transmission-daemon) on the pi at 192.168.1.z.


This router loses the above port forwarding rule when it (the router) is restarted, or even if there is a spike in electric power and the UPS has to momentarily step in, and usually gets a different external IP from my ISP dynamically.


A script or cron job that can run on my fedora linux pi that can login to my router and periodically poll for the existence of that port forwarding rule and create it if it is missing. Help appreciated.

  • 1
    Does the router support setting up port forwarding via UPnP? (can programs running in windows/mac/linux automatically set up port forwarding rules themselves currently?) Aug 21 '13 at 8:40
  • I think so because pcwintech.com/showimage?file=files/screenshots/beetel-440txi/… I don't really know much about UPnP other than the wikipedia page. Googling for that router type (in question) led me to that page.
    – PKM
    Aug 21 '13 at 8:43

MiniUPnP is a command line UPnP client that allows you to enable port forwarding. The source is available so you should be able to compile it to the Pi.

I think this is the syntax you need, but I don't have a machine to test it on. You would just put the following in a script that would set up the uPnP ports for you

upnpc -a `ifconfig wlan0 | grep "inet addr" | cut -d : -f 2 | cut -d " " -f 1` 22 22 TCP
upnpc -a `ifconfig wlan0 | grep "inet addr" | cut -d : -f 2 | cut -d " " -f 1` 5900 5900 TCP
upnpc -a `ifconfig wlan0 | grep "inet addr" | cut -d : -f 2 | cut -d " " -f 1` 9091 9091 TCP
  • that works, however what is the right place to add it so that the command runs on startup ? Sep 3 '16 at 9:14
  • 1
    You can use @reboot <cmd> in your crontab
    – Martin
    Dec 20 '16 at 19:25
  • 1
    miniupnpc should be available with raspbian with apt
    – Scott
    Sep 22 '17 at 1:14
  • 1
    and upnpc, if run from the machine running the service, will use the local address so the ifconfig/grep is unnecessary
    – Scott
    Sep 22 '17 at 1:16
  • 1
    For Ubuntu 18.04 you can use upnpc -a `ip -4 addr show wlan0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'` 12345 12345 TCP
    – Force
    Mar 31 '20 at 16:05

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.