我设置了以下 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