使用 iptables 进行端口转发不适用于直接从控制台发送的命令

使用 iptables 进行端口转发不适用于直接从控制台发送的命令

我设置了以下 IP 表规则:

sudo iptables -t nat -I PREROUTING --dst 192.168.0.116  -p tcp --dport 80 -j REDIRECT --to-ports 8000


sudo iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
REDIRECT   tcp  --  anywhere             static.snake2.test tcp dpt:www redir   ports 8000

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

链输出(策略接受)目标保护选择源目标

这会将给定 IP 上端口 80 上的任何流量转发到同一 IP 上的端口 8000。通过浏览器完美运行。

如果我尝试直接从控制台运行一些测试,则不起作用:

山猫-头-转储http://192.168.0.116

或者我打算做什么

ab -n 1000 -c20 192.168.0.116

在这种情况下,转发规则根本不起作用。返回的标头仍然来自端口 80(apache),而不是像预期的那样来自 nginx(8000)。

答案1

我很确定您看到这种情况的原因是 PREROUTING 链不适用于通过环回接口传输的数据包。当您说它在浏览器中有效时,我假设您的意思是在另一台机器上有效,在这种情况下您的规则将适用。您还需要向 OUTPUT 链添加一条规则,以使其在本地主机流量上有效。如下所示:

iptables -t nat -I OUTPUT --source 0/0 --destination 0/0 -p tcp --dport 80 -j REDIRECT --to-ports 8000

相关内容