63

I redirected traffic for port 80 to 8080 on my machine with

sudo iptables -A PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-ports 8080

It works fine for all the world except my own machine. I am a developer and I need to redirect port 80 to 8080 for myself.

My IP is 192.168.0.111

My web server runs on port 8080

I wish to open website from http://192.168.0.111/ instead of http://192.168.0.111:8080/ from same machine where server runs.

  • Excuse me for the abberation, but what is the purpose of forwarding port 80 to 8080? – ma11hew28 Nov 10 '14 at 5:10
  • 2
    @mattdipasquale, normal users can't access port 80 so you couldn't run a web service like python flask as a normal user. – Christian Mar 29 '16 at 10:14
  • Why don't you just bind the web server to port 80? – David Foerster May 23 '16 at 13:01
  • 5
    i'd guess its because non-root user cannot bind to ports 80/443 and he doesnt want to run his web service as root.. – Pavel K. Oct 11 '16 at 10:35
81

You need to use the OUTPUT chain as the packets meant for the loopback interface do not pass via the PREROUTING chain. The following should work; run as root:

iptables -t nat -A OUTPUT -o lo -p tcp --dport 80 -j REDIRECT --to-port 8080
  • 1
    Does port 80 required to be gloabally accesible? I tried your solution, my port number 8080 is accessible but 80 is not hence it did not worked. @heemayl – alper Jul 28 '17 at 23:39
  • 2
    This did not work, not sure why this is voted up – diyoda_ Mar 5 '18 at 22:11
  • @Diyoda_ Please define did not work. – heemayl Mar 29 '18 at 9:44
  • 4
    I can confirm that this doesn't work on ubuntu 18.04 – Ahmed Hamdy Jun 24 '18 at 11:23
  • 2
    Didn't work for me on Ubuntu 18.10 – Christopher Bradshaw Jan 16 at 19:15
8

Simple just use iptables allowing both port 80 and 8080 then redirect 80 to 8080 make sure you are assigning to the correct nic.. in example I use eth0

iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 8080 -j ACCEPT
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
  • Thanks! It's working on Ubuntu 19 – Vladimir Ishenko Aug 24 at 1:06
  • 2
    After would be nice to save iptable changes sudo apt-get install iptables-persistent – Vladimir Ishenko Aug 24 at 1:08
6

This worked for me.

$ sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
  • +1 works for me on Ubuntu 18.04 (at least for TCP), did port 7000->7001 and servers listening on port 7001 received incoming connections from port 7000 :) – hanshenrik Oct 5 at 15:22
  • 1
    make sure to use the correct network interface tho, it isn't called eth0 on all systems – hanshenrik Oct 5 at 15:22
4

Instead of the iptables, You could try: sudo ssh -gL 80:127.0.0.1:8080 localhost

  • 2
    That is an option but it is not exactly what I want because I already have web server on port 80. I will prefer to do it with iptables and keep web server on port 80 running. I guess I just have to apply rule to different step instead of PREROUTING – Max Apr 8 '14 at 10:45
  • Yes - this will cause a port conflict if you have something listening that you are port forwarding to as Max suggested. The above answer is the more general case. – cgseller Nov 15 '16 at 20:24
  • I get a "Connection refused" when attempting this solution. – mitchus Oct 21 at 15:42

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.