87

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.

4
  • Excuse me for the abberation, but what is the purpose of forwarding port 80 to 8080?
    – ma11hew28
    Nov 10, 2014 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, 2016 at 10:14
  • Why don't you just bind the web server to port 80? May 23, 2016 at 13:01
  • 9
    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, 2016 at 10:35

4 Answers 4

105

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
9
  • 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, 2017 at 23:39
  • 5
    This did not work, not sure why this is voted up
    – diyoda_
    Mar 5, 2018 at 22:11
  • 1
    @Diyoda_ Please define did not work.
    – heemayl
    Mar 29, 2018 at 9:44
  • 6
    I can confirm that this doesn't work on ubuntu 18.04 Jun 24, 2018 at 11:23
  • 5
    Didn't work for me on Ubuntu 18.10 Jan 16, 2019 at 19:15
23

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
3
  • Thanks! It's working on Ubuntu 19 Aug 24, 2019 at 1:06
  • 3
    After would be nice to save iptable changes sudo apt-get install iptables-persistent Aug 24, 2019 at 1:08
  • Works for me on ubuntu 20.04 LTS Dec 16, 2020 at 4:31
13

This worked for me.

$ sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
3
  • +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, 2019 at 15:22
  • 1
    make sure to use the correct network interface tho, it isn't called eth0 on all systems
    – hanshenrik
    Oct 5, 2019 at 15:22
  • works perfectly in 20.04 Aug 1, 2020 at 22:19
5

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

4
  • 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, 2014 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, 2016 at 20:24
  • I get a "Connection refused" when attempting this solution.
    – mitchus
    Oct 21, 2019 at 15:42
  • @mitchus it sounds like you don't have an SSH service. Try sudo apt install openssh-server.
    – mwfearnley
    Mar 3, 2020 at 12:14

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.