96

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
    Commented 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
    Commented Mar 29, 2016 at 10:14
  • Why don't you just bind the web server to port 80? Commented May 23, 2016 at 13:01
  • 13
    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.
    Commented Oct 11, 2016 at 10:35

5 Answers 5

115

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
10
  • 2
    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
    Commented Jul 28, 2017 at 23:39
  • 5
    This did not work, not sure why this is voted up
    – diyoda_
    Commented Mar 5, 2018 at 22:11
  • 6
    I can confirm that this doesn't work on ubuntu 18.04 Commented Jun 24, 2018 at 11:23
  • 5
    Didn't work for me on Ubuntu 18.10 Commented Jan 16, 2019 at 19:15
  • 2
    This did work for me without modification on Ubuntu 220.04, after the sysctl commands in the comment above
    – Alkanshel
    Commented Feb 11, 2023 at 9:22
24

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

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

i have been trying very hard to forward a port from 8080 to 80 , but i am unable to find a right solution but then this worked for me https://askubuntu.com/a/579540/1611784

iptables -t nat -A OUTPUT -o lo -p tcp --dport 8080 -j REDIRECT --to-port 80

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .