将端口80重定向到8080,并使其在本地机器上正常工作

我在我的机器上将端口80的流量重定向到8080。
sudo iptables -A PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-ports 8080

它在全世界范围内都运行良好,除了我的机器。我是一名开发人员,需要将端口80重定向到8080以供自己使用。
我的IP地址是192.168.0.111。
我的Web服务器运行在8080端口上。
我希望能够从同一台机器上的服务器运行的地方打开网站,而不是从http://192.168.0.111:8080/,而是从http://192.168.0.111/打开。

抱歉打扰一下,但是将端口80转发到8080的目的是什么? - ma11hew28
2@mattdipasquale,普通用户无法访问80端口,因此你不能像普通用户一样运行Python Flask这样的Web服务。 - Christian
为什么不直接将Web服务器绑定到端口80呢? - David Foerster
12我猜可能是因为非root用户无法绑定到端口80/443,而他又不想以root身份运行自己的Web服务。 - Pavel K.
5个回答

你需要使用OUTPUT链,因为发送到loopback接口的数据包不会经过PREROUTING链。以下是应该可以工作的代码;以root身份运行:
iptables -t nat -A OUTPUT -o lo -p tcp --dport 80 -j REDIRECT --to-port 8080

2端口80需要全球访问吗?我尝试了你的解决方案,我的8080端口可以访问,但是80端口不可用,因此它没有起作用。@heemayl - alper
5这个方法没有起作用,不确定为什么会被投票赞成。 - diyoda_
1@Diyoda_ 请定义“did not work”。 - heemayl
@Alper 我觉得你没有读懂楼主的问题。 - Jerry U
6我可以确认,在Ubuntu 18.04上这个方法不起作用。 - Ahmed Hamdy
5在Ubuntu 18.10上对我来说没起作用。 - Christopher Bradshaw
如何停止转发?编辑 - 找到了:在该命令中将 -A 替换为 -D - M. Volf
在Ubuntu 20.04 LTS上无法工作。 - Sunding Wei
可能我们应该先启用端口转发:sysctl net.ipv4.ip_forward=1(或者 sysctl net.ipv6.conf.all.forwarding=1)。然后通过取消在'/etc/sysctl.conf'中的这些行的注释,使更改持久化。 - Dimitar II
1这对我来说在Ubuntu 220.04上没有修改就能正常工作,就像上面评论中的sysctl命令一样。 - Alkanshel

简单的方法是使用iptables允许端口80和8080,然后将80端口重定向到8080端口,确保将其分配给正确的网卡,例如我使用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

谢谢!它在Ubuntu 19上运行正常。 - Vladimir Ishenko
4安装iptables-persistent后,保存iptables更改会很方便。 - Vladimir Ishenko
在Ubuntu 20.04 LTS上对我来说没问题。 - Sunding Wei

这对我来说有效。
$ sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

在Ubuntu 18.04上,+1对我来说可行(至少对于TCP协议而言)。我将端口7000转发到7001,并且在端口7001上监听的服务器成功接收了来自端口7000的传入连接 :) - hanshenrik
1确保使用正确的网络接口,不过并非所有系统都称之为eth0 - hanshenrik
在20.04中完美运行 - Nisharg Shah

不必使用 iptables,你可以尝试使用: sudo ssh -gL 80:127.0.0.1:8080 localhost


2那是一个选择,但不完全符合我的要求,因为我已经在端口80上有一个Web服务器。我更愿意使用iptables来保持端口80上的Web服务器运行,并在不同的步骤中应用规则,而不是在“PREROUTING”中应用规则。 - Max
是的 - 如果您正在侦听某个端口并进行端口转发,那么这将导致端口冲突,正如Max所建议的那样。上述答案是更一般的情况。 - cgseller
尝试使用这个解决方案时,我遇到了“连接被拒绝”的问题。 - mitchus
@mitchus听起来你没有SSH服务。尝试使用sudo apt install openssh-server - mwfearnley

我一直在努力尝试将端口从8080转发到80,但是我找不到正确的解决方案,然后我发现了这个方法https://askubuntu.com/a/579540/1611784
iptables -t nat -A OUTPUT -o lo -p tcp --dport 8080 -j REDIRECT --to-port 80